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版本更新的特性,主要涉及三個方面:

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

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會給出診斷結果和建議:

  1. peak分配內存大於當前total_allocated的1.5倍,即peak.allocated/total.allocated > 1.5,說明內存碎片率高,RSS遠大於used_memory
  2. High fragmentation/fragmentation大於1.4,說明內存碎片率高
  3. 每個Normal Client平均使用內存大於200KB,說明pipeline可能使用不當,或Pub/Sub客戶端處理消息不及時
  4. 每個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)單獨的子線程處理中。

使用方法

  1. 主動刪除

−           unlink

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

−           flushall/flushdb

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

  1. 過期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

內存使用和性能改進

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM