簡介
是一個c語言編寫的數據緩存工具,以key-value形式進行數據存儲
daemonize yes # redis-server 以守護進程的方式後臺運行
進入redis-cli
查看redis實例信息
- server 服務器信息
- clients 客戶端連接的狀態和指標
- memory 大致的內存消耗指標
- persistence 數據持久化相關的狀態和指標
- state 總體統計數據
- replication 主從複製相關的狀態和指標
- cpu cpu使用情況
- cluster cluster的狀態
- keyspace 相關的統計數據
詳細的參數信息
redis 最大程度的利用了單線程、非阻塞的I/O模型來快速的處理請求
redis包含一個簡單但功能強大的異步事件庫,封裝了不同操作系統的polling機制
客戶端等待服務器的通知,收到服務器的通知後,自己取回結果
polling 過程中沒有線程或子進程的創建和交互,
是一個輕量級上下文切換的IO模型
可以通過tcp協議與redis進行通訊,
術語協議,代表網絡通信中服務器和客戶端之間使用的語言,
redis中這種協議叫做RESP redis序列化協議,Redis serialization protocol
keys 命令會使redis服務器阻塞,知道所有的鍵都返回,
scan 可以在不阻塞服務器的情況下在redis服務器上遍歷
數據類型
位圖
使用bit組成的數組,實際底層數據類型是字符串,本質上是二進制大對象
可以使用redis bitmap 用來統計用戶活躍數量,可以節省大量的內存空間
有序集合
集合中的每個元素擁有一個可用於排序的權重,可以按順序從集合中獲取元素
可以用來實現 排行榜、等排名的功能
有序集合的實現
使用了跳錶的數據結構,是一種隨機化的數據結構,
選取一些特定的元素做索引,當元素達到一定數量,繼續做二級索引等,
當查找元素時,可以先與索引做比較,縮小查找範圍,然後在進行進一步查找
以空間換時間
跳錶具有如下性質:
(1) 由很多層結構組成
(2) 每一層都是一個有序的鏈表
(3) 最底層(Level 1)的鏈表包含所有元素
(4) 如果一個元素出現在 Level i 的鏈表中,則它在 Level i 之下的鏈表也都會出現。
(5) 每個節點包含兩個指針,一個指向同一鏈表中的下一個元素,一個指向下面一層的元素。
跳錶的基本原理
redis管道
就是將多個命令打包一次性發送,來減少往返的延時
hyperloglog
原理,有點複雜
應用場景
https://blog.csdn.net/maoyuanming0806/article/details/81814610
事務
https://redisbook.readthedocs.io/en/latest/feature/transaction.html
發佈訂閱
subscribe 會自動創建頻道,
該頻道沒有訂閱者,發佈到該頻道的消息就會丟棄
不支持持久化,
複製機制
- 部分重新同步
- 完全重新同步
進行完全同步時,爲了將所有的數據複製到從實例中,
主實例需要將數據轉存儲到一個RDB文件中,然後將文件發送給從實例,
從實例接受到RDB文件後,會先將內存中的所有數據清除,再將RDB文件中的數據導入,
主實例上的複製過程是完全異步的。
部分同步不需要從主實例中傳輸完整的數據存儲文件。
將數據轉存儲到RDB文件中會創建一個後臺進程
主實例接受來自從實例的完全重新同步請求會,創建一個後臺進程將數據轉存儲到磁盤上,將轉存儲的數據發送給實例。
重啓後,會將進行部分重新同步,redis 能夠從RDB文件中重新加載master_replid和offset,從而使部分重新同步
從實例被提升爲主實例時,新主實例會記錄舊主實例的master_replid和offset
repl-backlog-size
redis主實例失去與從實例的網絡連接期間,主實例上的一段內存(實際是一個環形緩衝區)會跟蹤最近所有寫入命令,這個緩衝區實際上是一個固定長度的列表。
這個緩衝區稱爲replication backlog,
用來決定是完全重新同步還是部分重新同步。
發出SLACEOF命令後,
從實例使用最後一個offset和最後一個主實例的ID(master_replid) 向主實例發送一個部分重新同步請求,
請求建立之後,會檢查master_replid是否一致,
主實例檢查請求中offset能否中backlog緩衝區中獲取,在不在backlog的範圍內,
backlog緩衝區的大小是1mb,只能容納少量的寫命令,
當斷開連接時生成的數據大於緩衝區,就會執行完全重新同步.
主實例斷開連接後,重新連接從實例,主從複製可以繼續複製,斷點續傳,
當從實例斷開後,重新連接之後,會重現連接主實例
主從複製建立之後,主實例首先以RDB文件形式將內存中的數據發送給從實例,
在這期間執行的寫命令會會被緩存在一個slave client buffer 的緩衝區,
rdb加載之後,主實例會將這個緩衝區的內容發送給從實例
redis的鍵過期機制是由主實例驅動的,過期時,會向所有的從實例發送一個del命令,
redis服務器的命令處理引擎是單線程的,阻塞會導致複製超時.
repl-ping-slave-period的值必須小於repl-timeout的值
持久化
RDB:某一時間點上的快照,適合於備份和災難恢復
AOF:寫入操作的日誌,在服務器啓動時被重放
AOF的數據一致性比RDB更高
AOF功能被啓用時,
redis將會在數據目錄中創建AOF文件,
默認文件名是appendonly.aof,
當接收到一個會實際修改內存數據的寫入命令時,
就會追加到AOF文件中.
操作系統實際上維護了一個緩衝區,redis的命令首先會被寫入這個緩衝區中.
緩衝區中的數據必須被刷新到磁盤中才能被永久保存.
這個過程時通過linux系統調用fsync完成的,是一個阻塞調用,
只有磁盤設備報告緩衝區中的數據寫入完成後纔會返回
通過appendfsync來調整調用fsync的頻率
- always 每個命令都調用fsync
- everysec 每秒調用一次
- no 永遠不調用
AOF重寫 來壓縮AOF文件
redis中的某些鍵可能已經被刪除或過期了,
可以在AOF文件中將其清楚
混合持久化模式
redis保證RDB轉儲和AOF重寫不會同時進行。
redis 啓動時,RDB和AOF持久化同時啓用且AOF、RDB文件都存在,redis總是會先加載aof文件,因爲aof文件能夠提供可靠的一致性。
當啓用了混合持久化,那麼redis首先檢查aof的前五個字符,如果是redis,那麼該aof文件就是混合模式,
redis服務器會加載rdb部分,再加載aof部分。
redis 集羣部署
哨兵模式 一主兩從
cluster-enabled yes # 來啓用集羣功能
三主三從
分佈式原理
– raw # 顯示中文
memory usage key # 估算一個鍵的內存使用情況
常見問題
slowlog-log-slower-than 指定閥值,超過這個閥值的操作都會被記錄下來,
通過 slowlog get 獲取所有的慢日誌
通過 redis-cli 的 – latency-history 和 -i 選項來監控redis服務器的ping 延遲實現
分佈式鎖
redisson