Redis5.0支持的新特性說明
本文內容來自華為雲幫助中心
華為雲DCS的Redis5.x版本繼承了4.x版本的所有功能增強以及新的命令,同時還兼容開源Redis5.x版本的新增特性。
Stream數據結構
Stream是Redis 5.0引入的一種新數據類型,它是一個全新的支持多播的可持久化消息隊列。
點擊下方鏈接,可以了解更多詳情。
https://www.huaweicloud.com/product/dcs.html
Redis Stream的結構示意圖如圖7-1所示,它是一個可持久化的數據結構,用一個消息鏈表,將所有加入進來的消息都串起來。
Stream數據結構具有以下特性:
- Stream中可以有多個消費者組。
- 每個消費組都含有一個Last_delivered_id,指向消費組當前已消費的最后一個元素(消息)。
- 每個消費組可以含有多個消費者對象,消費者共享消費組中的Last_delivered_id,相同消費組內的消費者存在競爭關系,即一個元素只能被其中一個消費者進行消費。
- 消費者對象內還維持了一個Pending_ids,Pending_ids記錄已發送給客戶端,但是還沒完成ACK(消費確認)的元素id。
- Stream與Redis其他數據結構的比較,見表7-4。
圖1-1 Stream數據結構示意圖
表1-1 Stream與Redis現有數據結構比較
Stream |
List, Pub/Sub, Zset |
獲取元素高效,復雜度為O(logN) |
List獲取元素的復雜度為O(N) |
支持offset,每個消息元素有唯一id。不會因為新元素加入或者其他元素淘汰而改變id。 |
List沒有offset概念,如果有元素被逐出,無法確定最新的元素 |
支持消息元素持久化,可以保存到AOF和RDB中。 |
Pub/Sub不支持持久化消息。 |
支持消費分組 |
Pub/Sub不支持消費分組 |
支持ACK(消費確認) |
Pub/Sub不支持 |
Stream性能與消費者數量無明顯關系 |
Pub/Sub性能與客戶端數量正相關 |
允許按時間線逐出歷史數據,支持block,給予radix tree和listpack,內存開銷少。 |
Zset不能重復添加相同元素,不支持逐出和block,內存開銷大。 |
不能從中間逐出消息元素。 |
Zet支持刪除任意元素 |
Stream相關命令介紹
接下來按照使用流程中出現的順序介紹Stream相關命令。詳細命令見表7-5
- 首先使用XADD添加流元素,即創建Stream,添加流元素時可指定消息數量最大保存范圍。
- 然后通過XGROUP創建消費者組。
- 消費者使用XREADGROUP指令進行消費。
- 客戶端消費完畢后使用XACK命令確認消息已消費成功。
圖1-2 Stream相關命令介紹
表1-2 Stream的詳細命令
命令 |
說明 |
語法 |
XACK |
從流的消費者組的待處理條目列表(簡稱PEL)中刪除一條或多條消息。 |
XACK key group ID [ID ...] |
XADD |
將指定的流條目追加到指定key的流中。 如果key不存在,作為運行這個命令的副作用,將使用流的條目自動創建key。 |
XADD key ID field string [field string ...] |
XCLATM |
在流的消費者組上下文中,此命令改變待處理消息的所有權, 因此新的所有者是在命令參數中指定的消費者。 |
XCLAIM key group consumer min-idle-time ID [ID ...] [IDLE ms] [TIME ms-unix-time] [RETRYCOUNT count] [FORCE] [JUSTID] |
XDEL |
從指定流中移除指定的條目,並返回成功刪除的條目的數量,在傳遞的ID不存在的情況下, 返回的數量可能與傳遞的ID數量不同。 |
XDEL key ID [ID ...] |
XGROUP |
該命令用於管理流數據結構關聯的消費者組。使用XGROUP你可以: l 創建與流關聯的新消費者組。 l 銷毀一個消費者組。 l 從消費者組中移除指定的消費者。 l 將消費者組的最后交付ID設置為其他內容。 |
XGROUP [CREATE key groupname id-or-$] [SETID key id-or-$] [DESTROY key groupname] [DELCONSUMER key groupname consumername] |
XINFO |
檢索關於流和關聯的消費者組的不同的信息。 |
XINFO [CONSUMERS key groupname] key key [HELP] |
XLEN |
返回流中的條目數。如果指定的key不存在,則此命令返回0,就好像該流為空。 |
XLEN key |
XPENDING |
通過消費者組從流中獲取數據。檢查待處理消息列表的接口,用於觀察和了解消費者組中哪些客戶端是活躍的,哪些消息在等待消費,或者查看是否有空閑的消息。 |
XPENDING key group [start end count] [consumer] |
XRANGE |
返回流中滿足給定ID范圍的條目。 |
XRANGE key start end [COUNT count] |
XREAD |
從一個或者多個流中讀取數據,僅返回ID大於調用者報告的最后接收ID的條目。 |
XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...] |
XREADGROUP |
XREAD命令的特殊版本,指定消費者組進行讀取。 |
XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...] |
XREVRANGE |
與XRANGE相同,但顯著的區別是以相反的順序返回條目,並以相反的順序獲取開始-結束參數 |
XREVRANGE key end start [COUNT count] |
XTRIM |
XTRIM將流裁剪為指定數量的項目,如有需要,將驅逐舊的項目(ID較小的項目)。 |
XTRIM key MAXLEN [~] count |
消息(流元素)消費確認
Stream與相比Pub/Sub,不僅增加消費分組模式,還支持消息消費確認。
當一條消息被某個消費者調用XREADGROUP命令讀取或調用XCLAIM命令接管的時候, 服務器尚不確定它是否至少被處理了一次。 因此,一旦消費者成功處理完一條消息,它應該調用XACK知會Stream,這樣這個消息就不會被再次處理, 同時關於此消息的PEL(pending_ids)條目也會被清除,從Redis服務器釋放內存。
某些情況下,因為網絡問題等,客戶端消費完畢后沒有調用XACK,這時候PEL內會保留對應的元素ID。待客戶端重新連上后,XREADGROUP的起始消息ID建議設置為0-0,表示讀取所有的PEL消息及自last_id之后的消息。同時,消費者消費消息時需要能夠支持消息重復傳遞。
圖1-3 ACK機制解讀
內存使用優化
Redis5.x在上一版本基礎上,在內存使用上做了進一步優化。
l 主動碎片整理
當key被頻繁修改,value長度不斷變化時,Redis會為key分配新的內存空間。由於Redis追求高性能,實現了自己的內存分配器來管理內存,因此並不會將原有內存釋放給OS,從而導致出現內存碎片。當used_memory_rss/used_memory高於1.5,一般認為內存碎片占比過高,內存利用率低。
因此,合理規划和使用緩存數據,規范數據寫入,有助於減少內存碎片的產生。
Redis3.x及以下:可以通過定期重啟服務解決內存碎片問題。建議實際緩存數據不超過配置可用內存的50%。
Redis4.x:支持主動整理內存碎片,服務在運行期間進行自動內存碎片清理。同時Redis4.x支持通過memory purge命令手動清理內存碎片。
Redis5.0:增強版主動碎片整理,配合Jemalloc版本更新,更快更智能,延時更低。
l HyperLogLog算法優化
HyperLogLog是一種基數計數方法,使用少量的內存空間完成海量數據的計數統計,在Redis5.0中,HyperLogLog算法得到改進,優化了計數統計時的內存使用效率。
舉個例子:B樹計數效率非常高,但是內存消耗也比較多。而HyperLogLog可節省大量存儲空間。當B樹需要1M內存統計,HyperLogLog只需要1kb。
l 內存信息統計報告能力增強
INFO命令返回信息更加詳實。
命令新增和優化
- 客戶端管理增強
− Redis-cli支持集群管理
在Redis4.x以及之前版本,需要安裝redis-trib模塊,管理集群。
Redis5.0對Redis-cli做了優化,集成了集群的所有管理功能。具體使用可以通過命令redis-cli --cluster help查看幫助信息。
− 優化客戶端在頻繁連接與中斷場景下的性能
當您的應用需要使用短連接時,這個優化價值凸顯。
- 有序集合使用更簡單
有序集合新增兩個命令:ZPOPMIN和ZPOPMAX。
− ZPOPMIN key [count]
刪除並返回有序集合key中的最多count個具有最低得分的成員。如果返回多個成員,也會按照得分高低(value值比較),從低到高排列。
− ZPOPMAX key [count]
刪除並返回有序集合key中的最多count個具有最高得分的成員。如果返回多個成員,也會按照得分高低(value值比較),從高到低排列。
- help增加更多子命令說明
支持help直接查看快速使用攻略,你不再需要每次登陸redis.io去查找。例如,命令行輸入stream使用攻略:xinfo help
127.0.0.1:6379> xinfo help 1) XINFO <subcommand> arg arg ... arg. Subcommands are: 2) CONSUMERS <key> <groupname> -- Show consumer groups of group <groupname>. 3) GROUPS <key> -- Show the stream consumer groups. 4) STREAM <key> -- Show information about the stream. 5) HELP -- Print this help. 127.0.0.1:6379>
- Redis-cli命令輸入提示
Redis-cli在輸入完整的命令后,會展示參數提醒,幫助用戶記憶命令語法格式。
如下圖所示,輸入zadd命令,Redis-cli使用淺顏色字體顯示zadd的語法。
RDB支持存儲LFU、LRU
Redis5.0開始,RDB快照文件中增加存儲key逐出策略LRU和LFU:
l FIFO:先進先出。最早存儲的數據,優先被淘汰。
l LRU:最近最少使用。長期未使用的數據,優先被淘汰。
l LFU:最不經常使用。在一段時間內,使用次數最少的數據,優先被淘汰。
Redis5.0的RDB文件格式有變化,向下兼容。因此如果使用快照的方式遷移,可以從Redis低版本遷移到Redis5.0,但不能從Redis5.0遷移到低版本。