Redis 5.0
Redis5.0版是Redis産品的重大版本釋出,我們先看一下它的最新特點:
- 新的流資料類型(Stream data type) https://redis.io/topics/streams-intro
- 新的 Redis 子產品 API:定時器、叢集和字典 API(Timers, Cluster and Dictionary APIs)
- RDB 增加 LFU 和 LRU 資訊
- 叢集管理器從 Ruby (redis-trib.rb) 移植到了redis-cli 中的 C 語言代碼
- 新的有序集合(sorted set)指令:ZPOPMIN/MAX 和阻塞變體(blocking variants)
- 更新 Active defragmentation 至 v2 版本
- 增強 HyperLogLog 的實作
- 更好的記憶體統計報告
- 許多包含子指令的指令現在都有一個 HELP 子指令
- 用戶端頻繁連接配接和斷開連接配接時,性能表現更好
- 許多錯誤修複和其他方面的改進
- 更新 Jemalloc 至 5.1 版本
- 引入 CLIENT UNBLOCK 和 CLIENT ID
- 新增 LOLWUT 指令 http://antirez.com/news/123
- 在不存在需要保持向後相容性的地方,棄用 "slave" 術語
- 網絡層中的差異優化
- Lua 相關的改進
- 引入動态的 HZ(Dynamic HZ) 以平衡空閑 CPU 使用率和響應性
- 對 Redis 核心代碼進行了重構并在許多方面進行了改進
Redis Stream
Redis stream本質上是個時序資料結構,具有如下特點:
- 每條記錄是結構化、可擴充的對
- 每條記錄在日志中有唯一辨別,辨別中包含了時間戳資訊,單調遞增
- 可以根據需要自動清理曆史記錄
- 儲存在記憶體中,支援持久化
底層是修改版的radix tree,每個node存儲了一個listpack。listpack是一塊連續的記憶體block,用于序列化msg entry及相關元資訊,如msg ID,使用了多種編碼,用于節省記憶體,是ziplist的更新版。如果XADD每次添加的對中的field是一樣的,那麼field不會重複存儲。

記憶體友好,對于簡單的十幾~幾十位元組的msg,100MB記憶體可以存儲數百萬個。listpack在記憶體和disk上的存儲結構是一樣的,是以stream資料在做RDB時效率非常高,0.3s,500w entries。
Redis Stream使用示範
釋出消息
讀取消息
阻塞讀取
釋出新消息
消息傳回
建立消費組
通過消費組讀取消息
Redis Stream使用場景
可用作時通信等,大資料分析,異地資料備份等
用戶端可以平滑擴充,提高處理能力
Zpop
Sorted Sets 增加了類似List的pop指令:
ZPOPMAX 指令用于移除并彈出有序集合中分值最大的 count 個元素
ZPOPMIN 指令用于移除并彈出有序集合中分值最小的 count 個元素
BZPOPMAX 和 BZPOPMIN 是上述兩個指令的阻塞變種.
CLIENT:
Client id傳回目前連接配接的ID,每個ID符合如下限制:
- 永不重複,可以判斷目前連結是否斷鍊過
- 單調遞增,可以判斷不同連結的接入順序
Client unblock:
當用戶端因為執行具有阻塞功能的指令(如BRPOP、XREAD或者WAIT)被阻塞時,該指令可以通過其他連接配接解除用戶端的阻塞
阿裡雲Redis 5.0優勢:
- 新增的stream資料結構,豐富的應用場景和想象空間
- 核心的改進和bugfix,使用更健壯
- 支援賬号體系,根據賬号用途賦予相應的權限,更加安全
- 審計日志,記錄了讀寫操作、敏感操作(keys、flushall等)、慢日志、管理類指令,供使用者查詢
- 大key分析,基于快照的完整記憶體分析,更準确,直接輸出記憶體消耗top排行的key
- 支援單機和叢集版的平滑遷移