Redis4.0支持的新功能說明

本文以華爲雲DCS for Redis版本爲例,介紹Redis4.0的新功能。文章轉載自華爲雲幫助中心。

與Redis3.x版本相比,DCS的Redis4.x以上版本,除了開源Redis增加的特性之外,還有如下大特性增強。

l 創建耗時縮短

實例由虛機方式改成了物理機容器化部署,創建實例只需要8~10秒時間完成。

l 性能提升

高性能版Redis4.x,操作系統使用華爲自研的輕量級LibOS,單節點QPS從10w提升到30w

l 節省成本

高性能版Redis4.x,實例規格以1G爲步長,用多少G買多少G,靈活定製,不再受限2的n次方要求。

相比於之前的版本,華爲雲Redis4.x在性能方面有了不小的提升,大大提高了使用者的體驗,如果你想了解更加詳細的具體實操內容,點這個鏈接

https://www.huaweicloud.com/product/dcs.html

給你更多驚喜。

接下來給大家介紹,開源Redis4.0版本新功能的具體特性。

Redis4.x版本更新的特性,主要涉及三個方面:

新命令的增加,如MEMORY、SWAPDB。
Lazyfree機制,延遲刪除大key,降低刪除操作對系統資源的佔用影響。
內存性能優化,即主動碎片整理。
MEMORY命令

在Redis3.x及之前,只能通過info memory命令瞭解有限的幾個內存統計信息。Redis4.0引入新的命令memory,讓您能夠更深入瞭解Redis的內存使用情況。

127.0.0.1:6379[8]> memory help
1) MEMORY <subcommand> arg arg ... arg. Subcommands are:
2) DOCTOR - Return memory problems reports.
3) MALLOC-STATS -- Return internal statistics report from the memory allocator.
4) PURGE -- Attempt to purge dirty pages for reclamation by the allocator.
5) STATS -- Return information about the memory usage of the server.
6) USAGE <key> [SAMPLES <count>] -- Return memory in bytes used by <key> and its value. Nested values are sampled up to <count

times (default: 5).
127.0.0.1:6379[8]>
  

usage

輸入memory usage [key],如果當前key存在,則返回key的value實際使用內存估算值;如果key不存在,則返回nil。

127.0.0.1:6379[8]> set dcs "DCS is an online, distributed, in-memory cache service compatible with Redis, Memcached, and i
n-memory data grid (IMDG)."
OK
127.0.0.1:6379[8]> memory usage dcs
(integer) 171
127.0.0.1:6379[8]>
usage統計value內存佔用,以及key自身的內存佔用,不包含key的Expire內存佔用。

127.0.0.1:6379[8]> set dcs.huaweiclou "Distributed Cache Service"
OK
127.0.0.1:6379[8]> memory usage dcs.huaweiclou
(integer) 85
127.0.0.1:6379[8]> set dcs.huaweicloud "Distributed Cache Service"
OK
127.0.0.1:6379[8]> memory usage dcs.huaweicloud
(integer) 86 //key名稱長度變化後,內存佔用也有變化
127.0.0.1:6379[8]> expire dcs.huaweicloud 100000
(integer) 1
127.0.0.1:6379[8]> memory usage dcs.huaweicloud
(integer) 86 //加了過期時間後,內存佔用沒有改變
127.0.0.1:6379[8]>
  

對hash、list、set、sorted set等數據類型,usage命令會抽樣統計,提供內存佔用的估算值。

使用方式:memory usage keyset samples 1000

其中keyset表示一個集合數據類型的key,1000表示抽樣個數。

stats

返回當前實例內存使用細節。

使用方法:memory stats

127.0.0.1:6379[8]> memory stats
1) "peak.allocated"
2) (integer) 2412408
3) "total.allocated"
4) (integer) 2084720
5) "startup.allocated"
6) (integer) 824928
7) "replication.backlog"
... ...

以下給出部分數據返回項的具體含義

表1-1 memory stats

數據返回項

說明

peak.allocated

Redis實例運行過程中,allocator分配的內存峯值。同info memory的used_memory_peak

total.allocated

allocator當前分配的內存字節數。同info memory的used_memory

startup.allocated

Redis啓動佔用的內存字節數

replication.backlog

Redis複製積壓緩衝區(replication backlog)內存使用字節數,通過repl-backlog-size參數設置,默認1M

clients.slaves

在master側,所有slave clients消耗的內存字節數

clients.normal

Redis所有常規客戶端消耗內存節字數

overhead.total

Redis額外的總開銷內存字節數; 即分配器分配的總內存total.allocated,減去數據實際存儲使用內存。

keys.count

Redis實例中key的數量

keys.bytes-per-key

每個key平均佔用字節數。注意,overhead也會均攤到每個key上,因此不能以此值來表示業務實際的key平均長度。

dataset.bytes

表示Redis數據佔用的內存容量。即分配的內存總量,減去總的額外開銷內存量。

dataset.percentage

表示Redis數據佔用內存佔總內存分配的百分比

peak.percentage

當前內存使用量與峯值時的佔比

fragmentation

表示Redis的內存碎片率

doctor

使用方法: memory doctor

used_memory(total.allocated)小於5M,doctor認爲內存使用量過小,不做進一步診斷。當滿足以下某一點,Redis會給出診斷結果和建議:

peak分配內存大於當前total_allocated的1.5倍,即peak.allocated/total.allocated > 1.5,說明內存碎片率高,RSS遠大於used_memory
High fragmentation/fragmentation大於1.4,說明內存碎片率高
每個Normal Client平均使用內存大於200KB,說明pipeline可能使用不當,或Pub/Sub客戶端處理消息不及時
每個Slave Client平均使用內存大於10MB,說明master的寫入流量過高
purge

使用方法: memory purge

用途:通過調用jemalloc內部命令,進行內存釋放。釋放對象包括Redis進程佔用但未有效使用的內存,即常說的內存碎片。

memory purge只適用於使用jemalloc作爲allocator的Redis實例。

Lazy free機制

解決的痛點/問題

Redis是單線程程序,當運行一個耗時較大的請求時,會導致所有請求排隊等待,在請求處理完成前,Redis不能響應其他請求,因此容易引發性能問題。而Redis刪除大的集合鍵時,就屬於一種比較耗時的請求。

原理

Redis4.x提供的一種惰性刪除或者說延遲釋放機制,主要用於解決刪除大key對Redis進程的阻塞,從而避免帶來性能與可用性問題。

刪除key時,Redis異步延時釋放key的內存,把key釋放操作放在bio(Background I/O)單獨的子線程處理中。

使用方法

主動刪除
− unlink

unlink與del命令目的一樣,刪除某個key。unlink在刪除集合類鍵時,如果集合鍵的元素個數大於64個,會把內存釋放操作,給單獨的bio(Background I/O)線程來執行。因此unlink刪除操作能在非常短的時間內完成包含上百萬個元素的大key刪除。

− flushall/flushdb

通過對flushall/flushdb添加ASYNC異步清理選項,Redis在清理整個實例或單個DB時,操作都是異步的。

過期key刪除、大key驅逐刪除
被動刪除有四種場景,每種場景對應一個配置參數,默認都是關閉:

lazyfree-lazy-eviction no //針對redis內存使用達到maxmeory,並設置有淘汰策略時,是否採用lazy free機制
lazyfree-lazy-expire no //針對設置有TTL的鍵,達到過期後,被redis清理刪除時是否採用lazy free機制
lazyfree-lazy-server-del no //針對有些指令在處理已存在的鍵時,會帶有一個隱式的DEL鍵的操作
slave-lazy-flush no //針對slave進行全量數據同步,slave在加載master的RDB文件前,會運行flushall來清理自己的數據場景

以上配置如需使用,請提工單諮詢技術服務人員。

其他新增命令

swapdb

用途:交換同一Redis實例內2個db的數據。

用法:swapdb dbindex1 dbindex2

zlexcount

用途:在有序集合中,返回符合條件的元素個數。

用法:zlexcount key min max

內存使用和性能改進

使用更少的內存來存儲相同數量的數據
可以對使用的內存進行碎片整理,並逐漸回收

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章