1. 程式人生 > >幹貨駕到:Redis5.0支持的新功能說明

幹貨駕到:Redis5.0支持的新功能說明

img 簡單 n) 例如 內存空間 並不會 歷史 htm troy

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

1
2
3
4
5
6
7
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遷移到低版本。

幹貨駕到:Redis5.0支持的新功能說明