關於redis性能問題分析和優化

来源:http://www.cnblogs.com/chenpingzhao/archive/2017/05/24/6859041.html
-Advertisement-
Play Games

一、如何查看Redis性能 info命令輸出的數據可以分為10個分類,分別是: server,clients,memory,persistence,stats,replication,cpu,commandstats,cluster,keyspace 為了快速定位並解決性能問題,這裡選擇5個關鍵性的 ...


一、如何查看Redis性能

info命令輸出的數據可以分為10個分類,分別是:

server,clients,memory,persistence,stats,replication,cpu,commandstats,cluster,keyspace

為了快速定位並解決性能問題,這裡選擇5個關鍵性的數據指標,它包含了大多數人在使用Redis上會經常碰到的性能問題

二、記憶體

上圖中used_memory 欄位數據表示的是:由Redis分配器分配的記憶體總量,以位元組(byte)為單位。 其中used_memory_human和used_memory是一樣的,以G為單位顯示

info memory
# Memory
used_memory:8589645288
used_memory_human:8.00G
used_memory_rss:9439997952
used_memory_peak:9082282776
used_memory_peak_human:8.46G
used_memory_lua:35840
mem_fragmentation_ratio:1.10
mem_allocator:jemalloc-3.6.0

used_memory是Redis使用的記憶體總量,包含了實際緩存占用的記憶體和Redis自身運行所占用的記憶體(如元數據、lua),是由Redis使用記憶體分配器分配的記憶體,所以這個數據不包括記憶體碎片浪費掉的記憶體,其他欄位代表的含義,都以位元組為單位:

  • used_memory_rss:從操作系統上顯示已經分配的記憶體總量。

  • mem_fragmentation_ratio: 記憶體碎片率。

  • used_memory_lua: Lua腳本引擎所使用的記憶體大小。

  • mem_allocator: 在編譯時指定的Redis使用的記憶體分配器,可以是libc、jemalloc、tcmalloc。

1、因記憶體交換引起的性能問題

記憶體使用率是Redis服務最關鍵的一部分。如果Redis實例的記憶體使用率超過可用最大記憶體 (used_memory > 可用最大記憶體),那麼操作系統開始進行記憶體與swap空間交換,把記憶體中舊的或不再使用的內容寫入硬碟上(硬碟上的這塊空間叫Swap分區),以便留出新的物理記憶體給新頁或活動頁(page)使用。 

如果Redis進程上發生記憶體交換,那麼Redis和依賴Redis上數據的應用會受到嚴重的性能影響。 通過查看used_memory指標可知道Redis正在使用的記憶體情況,如果used_memory>可用最大記憶體,那就說明Redis實例正在進行記憶體交換或者已經記憶體交換完畢。

2、跟蹤記憶體使用率

若是在使用Redis期間沒有開啟rdb快照或aof持久化策略,那麼緩存數據在Redis崩潰時就有丟失的危險。因為當Redis記憶體使用率超過可用記憶體的95%時,部分數據開始在記憶體與swap空間來回交換,這時就可能有丟失數據的危險。

當開啟並觸發快照功能時,Redis會fork一個子進程把當前記憶體中的數據完全複製一份寫入到硬碟上。因此若是當前使用記憶體超過可用記憶體的45%時觸發快照功能,那麼此時進行的記憶體交換會變的非常危險(可能會丟失數據)。 倘若在這個時候實例上有大量頻繁的更新操作,問題會變得更加嚴重。

通過減少Redis的記憶體占用率,來避免這樣的問題,或者使用下麵的技巧來避免記憶體交換髮生:

  • 假如緩存數據小於4GB,就使用32位的Redis實例。因為32位實例上的指針大小隻有64位的一半,它的記憶體空間占用空間會更少些。 這有一個壞處就是,假設物理記憶體超過4GB,那麼32位實例能使用的記憶體仍然會被限制在4GB以下。 要是實例同時也共用給其他一些應用使用的話,那可能需要更高效的64位Redis實例,這種情況下切換到32位是不可取的。 不管使用哪種方式,Redis的dump文件在32位和64位之間是互相相容的, 因此倘若有減少占用記憶體空間的需求,可以嘗試先使用32位,後面再切換到64位上。

  • 儘可能的使用Hash數據結構。因為Redis在儲存小於100個欄位的Hash結構上,其存儲效率是非常高的。所以在不需要集合(set)操作或list的push/pop操作的時候,儘可能的使用Hash結構。比如,在一個web應用程式中,需要存儲一個對象表示用戶信息,使用單個key表示一個用戶,其每個屬性存儲在Hash的欄位里,這樣要比給每個屬性單獨設置一個key-value要高效的多。 通常情況下倘若有數據使用string結構,用多個key存儲時,那麼應該轉換成單key多欄位的Hash結構。 如上述例子中介紹的Hash結構應包含,單個對象的屬性或者單個用戶各種各樣的資料。Hash結構的操作命令是HSET(key, fields, value)和HGET(key, field),使用它可以存儲或從Hash中取出指定的欄位。

  • 設置key的過期時間。一個減少記憶體使用率的簡單方法就是,每當存儲對象時確保設置key的過期時間。倘若key在明確的時間周期內使用或者舊key不大可能被使用時,就可以用Redis過期時間命令(expire,expireat, pexpire, pexpireat)去設置過期時間,這樣Redis會在key過期時自動刪除key。 假如你知道每秒鐘有多少個新key-value被創建,那可以調整key的存活時間,並指定閥值去限制Redis使用的最大記憶體。

  • 回收key。在Redis配置文件中(一般叫Redis.conf),通過設置“maxmemory”屬性的值可以限制Redis最大使用的記憶體,修改後重啟實例生效。 也可以使用客戶端命令config set maxmemory 去修改值,這個命令是立即生效的,但會在重啟後會失效,需要使用config rewrite命令去刷新配置文件。 若是啟用了Redis快照功能,應該設置“maxmemory”值為系統可使用記憶體的45%,因為快照時需要一倍的記憶體來複制整個數據集,也就是說如果當前已使用45%,在快照期間會變成95%(45%+45%+5%),其中5%是預留給其他的開銷。 如果沒開啟快照功能,maxmemory最高能設置為系統可用記憶體的95%。

當記憶體使用達到設置的最大閥值時,需要選擇一種key的回收策略,可在Redis.conf配置文件中修改“maxmemory-policy”屬性值。 若是Redis數據集中的key都設置了過期時間,那麼“volatile-ttl”策略是比較好的選擇。但如果key在達到最大記憶體限制時沒能夠迅速過期,或者根本沒有設置過期時間。那麼設置為“allkeys-lru”值比較合適,它允許Redis從整個數據集中挑選最近最少使用的key進行刪除(LRU淘汰演算法)。Redis還提供了一些其他淘汰策略,如下:

  • volatile-lru:使用LRU演算法從已設置過期時間的數據集合中淘汰數據。

  • volatile-ttl:從已設置過期時間的數據集合中挑選即將過期的數據淘汰。

  • volatile-random:從已設置過期時間的數據集合中隨機挑選數據淘汰。

  • allkeys-lru:使用LRU演算法從所有數據集合中淘汰數據。

  • allkeys-random:從數據集合中任意選擇數據淘汰

  • no-enviction:禁止淘汰數據。

通過設置maxmemory為系統可用記憶體的45%或95%(取決於持久化策略)和設置“maxmemory-policy”為“volatile-ttl”或“allkeys-lru”(取決於過期設置),可以比較準確的限制Redis最大記憶體使用率,在絕大多數場景下使用這2種方式可確保Redis不會進行記憶體交換。倘若你擔心由於限制了記憶體使用率導致丟失數據的話,可以設置noneviction值禁止淘汰數據。

三、命令處理數 

在info信息里的total_commands_processed欄位顯示了Redis服務處理命令的總數,其命令來自一個或多個Redis客戶端

info stats
# Stats
total_connections_received:843391006
total_commands_processed:3946780282
instantaneous_ops_per_sec:1447
total_net_input_bytes:5060670300797
total_net_output_bytes:13788457111609
instantaneous_input_kbps:1399.63
instantaneous_output_kbps:2863.71
rejected_connections:0
sync_full:2
sync_partial_ok:1
sync_partial_err:0
expired_keys:231497375
evicted_keys:0
keyspace_hits:613100363
keyspace_misses:252710911
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:60179

分析命令處理總數,診斷響應延遲

在Redis實例中,跟蹤命令處理總數是解決響應延遲問題最關鍵的部分,因為Redis是個單線程模型,客戶端過來的命令是按照順序執行的。比較常見的延遲是帶寬,通過千兆網卡的延遲大約有200μs。倘若明顯看到命令的響應時間變慢,延遲高於200μs,那可能是Redis命令隊列里等待處理的命令數量比較多。 如上所述,延遲時間增加導致響應時間變慢可能是由於一個或多個慢命令引起的,這時可以看到每秒命令處理數在明顯下降,甚至於後面的命令完全被阻塞,導致Redis性能降低。要分析解決這個性能問題,需要跟蹤命令處理數的數量和延遲時間。

比如可以寫個腳本,定期記錄total_commands_processed的值。當客戶端明顯發現響應時間過慢時,可以通過記錄的total_commands_processed歷史數據值來判斷命理處理總數是上升趨勢還是下降趨勢,以便排查問題。

使用命令處理總數解決延遲時間增加

通過與記錄的歷史數據比較得知,命令處理總數確實是處於上升或下降狀態,那麼可能是有2個原因引起的:

  • 命令隊列里的命令數量過多,後面命令一直在等待中

  • 幾個慢命令阻塞Redis

下麵有三個辦法可以解決,因上面2條原因引起的響應延遲問題。

  1. 使用多參數命令:若是客戶端在很短的時間內發送大量的命令過來,會發現響應時間明顯變慢,這由於後面命令一直在等待隊列中前面大量命令執行完畢。有個方法可以改善延遲問題,就是通過單命令多參數的形式取代多命令單參數的形式。舉例來說,迴圈使用LSET命令去添加1000個元素到list結構中,是性能比較差的一種方式,更好的做法是在客戶端創建一個1000元素的列表,用單個命令LPUSH或RPUSH,通過多參數構造形式一次性把1000個元素髮送的Redis服務上。下麵是Redis的一些操作命令,有單個參數命令和支持多個參數的命令,通過這些命令可儘量減少使用多命令的次數。  
    set  -> mset
    get  -> mget
    lset -> lpush, rpush
    lindex -> lrange
    hset -> hmset
    hget -> hmget
                                                                                                                                       
  2. 管道命令:另一個減少多命令的方法是使用管道(pipeline),把幾個命令合併一起執行,從而減少因網路開銷引起的延遲問題。因為10個命令單獨發送到服務端會引起10次網路延遲開銷,使用管道會一次性把執行結果返回,僅需要一次網路延遲開銷。Redis本身支持管道命令,大多數客戶端也支持,倘若當前實例延遲很明顯,那麼使用管道去降低延遲是非常有效的。

  3. 避免操作大集合的慢命令:如果命令處理頻率過低導致延遲時間增加,這可能是因為使用了高時間複雜度的命令操作導致,這意味著每個命令從集合中獲取數據的時間增大。 所以減少使用高時間複雜的命令,能顯著的提高的Redis的性能。

四、延遲時間 

Redis的延遲數據是無法從info信息中獲取的。可以用 Redis-cli工具加 --latency參數運行,如:

redis-cli --latency -h 127.0.0.1 -p 6379

由於當前伺服器不同的運行情況,延遲時間可能有所誤差,通常1G網卡的延遲時間是200μs,Redis的響應延遲時間以毫秒為單位

[root@localhost ~]# redis-cli --latency -h 127.0.0.1 -p 6379
min: 0, max: 1, avg: 0.07 (12596 samples)

跟蹤Redis延遲性能

Redis之所以這麼流行的主要原因之一就是低延遲特性帶來的高性能,所以說解決延遲問題是提高Redis性能最直接的辦法。拿1G帶寬來說,若是延遲時間遠高於200μs,那明顯是出現了性能問題。 雖然在伺服器上會有一些慢的IO操作,但Redis是單核接受所有客戶端的請求,所有請求是按良好的順序排隊執行。因此若是一個客戶端發過來的命令是個慢操作,那麼其他所有請求必須等待它完成後才能繼續執行。

使用延遲命令提高性能

一旦確定延遲時間是個性能問題後,這裡有幾個辦法可以用來分析解決性能問題。

1. 使用slowlog查出引發延遲的慢命令:Redis中的slowlog命令可以讓我們快速定位到那些超出指定執行時間的慢命令,預設情況下命令若是執行時間超過10ms就會被記錄到日誌。slowlog只會記錄其命令執行的時間,不包含io往返操作,也不記錄單由網路延遲引起的響應慢。通常1gb帶寬的網路延遲,預期在200μs左右,倘若一個命令僅執行時間就超過10ms,那比網路延遲慢了近50倍。 想要查看所有執行時間比較慢的命令,可以通過使用Redis-cli工具,輸入slowlog get命令查看,返回結果的第三個欄位以微妙位單位顯示命令的執行時間。假如只需要查看最後10個慢命令,輸入slowlog get 10即可

slowlog get
 1) 1) (integer) 12849
    2) (integer) 1495630160
    3) (integer) 61916
    4) 1) "KEYS"
       2) "20170524less*"
 2) 1) (integer) 12848
    2) (integer) 1495629901
    3) (integer) 59368
    4) 1) "KEYS"
       2) "20170524more*"
 3) 1) (integer) 12847
    2) (integer) 1495629504
    3) (integer) 59522
    4) 1) "KEYS"
       2) "sou_dzmore_16_*"
 4) 1) (integer) 12846
    2) (integer) 1495629504
    3) (integer) 57941
    4) 1) "KEYS"
       2) "sou_dz_16_*"
 5) 1) (integer) 12845
    2) (integer) 1495629504
    3) (integer) 15053
    4) 1) "KEYS"
       2) "list_dingzhis_16_*"
 6) 1) (integer) 12844
    2) (integer) 1495629504
    3) (integer) 24391
    4) 1) "KEYS"
       2) "cache_kwnew_*"
 7) 1) (integer) 12843
    2) (integer) 1495629469
    3) (integer) 57001
    4) 1) "KEYS"
       2) "sou_dzmore_15_*"
 8) 1) (integer) 12842
    2) (integer) 1495629469
    3) (integer) 61131
    4) 1) "KEYS"
       2) "sou_dz_15_*"
 9) 1) (integer) 12841
    2) (integer) 1495629469
    3) (integer) 10035
    4) 1) "KEYS"
       2) "ztlistnew_dingzhi_15_*"
10) 1) (integer) 12840
    2) (integer) 1495629469
    3) (integer) 17974
    4) 1) "KEYS"
       2) "list_dingzhis_15_*"

圖中欄位分別意思是:

  • 1、日誌的唯一標識符

  • 2、被記錄命令的執行時間點,以 UNIX 時間戳格式表示

  • 3、查詢執行時間,以微秒為單位

  • 4、執行的命令,以數組的形式排列。完整命令是config get *

倘若你想自定義慢命令的標準,可以調整觸發日誌記錄慢命令的閥值。若是很少或沒有命令超過10ms,想降低記錄的閥值,比如5毫秒,可在Redis-cli工具中輸入下麵的命令配置:

config set slowlog-log-slower-than 5000

也可以在Redis.config配置文件中設置,以微妙位單位。

2.監控客戶端的連接:因為Redis是單線程模型(只能使用單核),來處理所有客戶端的請求, 但由於客戶端連接數的增長,處理請求的線程資源開始降低分配給單個客戶端連接的處理時間,這時每個客戶端需要花費更多的時間去等待Redis共用服務的響應。這種情況下監控客戶端連接數是非常重要的,因為客戶端創建連接數的數量可能超出預期的數量,也可能是客戶端端沒有有效的釋放連接。在Redis-cli工具中輸入info clients可以查看到當前實例的所有客戶端連接信息。如下圖,第一個欄位(connected_clients)顯示當前實例客戶端連接的總數:

info clients
# Clients
connected_clients:21
client_longest_output_list:0
client_biggest_input_buf:13856
blocked_clients:0

Redis預設允許客戶端連接的最大數量是10000。若是看到連接數超過5000以上,那可能會影響Redis的性能。倘若一些或大部分客戶端發送大量的命令過來,這個數字會低的多。

3.限制客戶端連接數:自Redis2.6以後,允許使用者在配置文件(Redis.conf)maxclients屬性上修改客戶端連接的最大數,也可以通過在Redis-cli工具上輸入config set maxclients 去設置最大連接數。根據連接數負載的情況,這個數字應該設置為預期連接數峰值的110到150之間,若是連接數超出這個數字後,Redis會拒絕並立刻關閉新來的連接。通過設置最大連接數來限制非預期數量的連接數增長,是非常重要的。另外,新連接嘗試失敗會返回一個錯誤消息,這可以讓客戶端知道,Redis此時有非預期數量的連接數,以便執行對應的處理措施。 上述二種做法對控制連接數的數量和持續保持Redis的性能最優是非常重要的,

4.加強記憶體管理:較少的記憶體會引起Redis延遲時間增加。如果Redis占用記憶體超出系統可用記憶體,操作系統會把Redis進程的一部分數據,從物理記憶體交換到硬碟上,記憶體交換會明顯的增加延遲時間。關於怎麼監控和減少記憶體使用,可查看used_memory介紹章節。

5. 性能數據指標:分析解決Redis性能問題,通常需要把延遲時間的數據變化與其他性能指標的變化相關聯起來。命令處理總數下降的發生可能是由慢命令阻塞了整個系統,但如果命令處理總數的增加,同時記憶體使用率也增加,那麼就可能是由於記憶體交換引起的性能問題。對於這種性能指標相關聯的分析,需要從歷史數據上來觀察到數據指標的重要變化,此外還可以觀察到單個性能指標相關聯的所有其他性能指標信息。這些數據可以在Redis上收集,周期性的調用內容為Redis info的腳本,然後分析輸出的信息,記錄到日誌文件中。當延遲發生變化時,用日誌文件配合其他數據指標,把數據串聯起來排查定位問題。

五、記憶體碎片率

info信息中的mem_fragmentation_ratio給出了記憶體碎片率的數據指標,它是由操系統分配的記憶體除以Redis分配的記憶體得出:

mem_fragmentation_ratio = used_memory_rss / used_memory

used_memory和used_memory_rss都包含的記憶體分配有:

  • 用戶定義的數據:記憶體被用來存儲key-value值。

  • 內部開銷: 存儲內部Redis信息用來表示不同的數據類型。

used_memory_rss的rss是Resident Set Size的縮寫,表示該進程所占物理記憶體的大小,是操作系統分配給Redis實例的記憶體大小。除了用戶定義的數據和內部開銷以外,used_memory_rss指標還包含了記憶體碎片的開銷,記憶體碎片是由操作系統低效的分配/回收物理記憶體導致的。

操作系統負責分配物理記憶體給各個應用進程,Redis使用的記憶體與物理記憶體的映射是由操作系統上虛擬記憶體管理分配器完成的。
舉個例子來說,Redis需要分配連續記憶體塊來存儲1G的數據集,這樣的話更有利,但可能物理記憶體上沒有超過1G的連續記憶體塊,那操作系統就不得不使用多個不連續的小記憶體塊來分配並存儲這1G數據,也就導致記憶體碎片的產生。

記憶體分配器另一個複雜的層面是,它經常會預先分配一些記憶體塊給引用,這樣做會使加快應用程式的運行。

理解資源性能

跟蹤記憶體碎片率對理解Redis實例的資源性能是非常重要的。記憶體碎片率稍大於1是合理的,這個值表示記憶體碎片率比較低,也說明redis沒有發生記憶體交換。但如果記憶體碎片率超過1.5,那就說明Redis消耗了實際需要物理記憶體的150%,其中50%是記憶體碎片率。若是記憶體碎片率低於1的話,說明Redis記憶體分配超出了物理記憶體,操作系統正在進行記憶體交換。記憶體交換會引起非常明顯的響應延遲,可查看used_memory介紹章節。

info memory
# Memory
used_memory:21189222536
used_memory_human:19.73G
used_memory_rss:21901688832
used_memory_peak:27350156888
used_memory_peak_human:25.47G
used_memory_lua:35840
mem_fragmentation_ratio:1.03
mem_allocator:jemalloc-3.6.0

用記憶體碎片率預測性能問題

倘若記憶體碎片率超過了1.5,那可能是操作系統或Redis實例中記憶體管理變差的表現。下麵有3種方法解決記憶體管理變差的問題,並提高Redis性能:

1. 重啟Redis伺服器:如果記憶體碎片率超過1.5,重啟Redis伺服器可以讓額外產生的記憶體碎片失效並重新作為新記憶體來使用,使操作系統恢復高效的記憶體管理。額外碎片的產生是由於Redis釋放了記憶體塊,但記憶體分配器並沒有返回記憶體給操作系統,這個記憶體分配器是在編譯時指定的,可以是libc、jemalloc或者tcmalloc。 通過比較used_memory_peak, used_memory_rss和used_memory_metrics的數據指標值可以檢查額外記憶體碎片的占用。從名字上可以看出,used_memory_peak是過去Redis記憶體使用的峰值,而不是當前使用記憶體的值。如果used_memory_peak和used_memory_rss的值大致上相等,而且二者明顯超過了used_memory值,這說明額外的記憶體碎片正在產生。 在Redis-cli工具上輸入info memory可以查看上面三個指標的信息:

在重啟伺服器之前,需要在Redis-cli工具上輸入shutdown save命令,意思是強制讓Redis資料庫執行保存操作並關閉Redis服務,這樣做能保證在執行Redis關閉時不丟失任何數據。 在重啟後,Redis會從硬碟上載入持久化的文件,以確保數據集持續可用。

2.限制記憶體交換: 如果記憶體碎片率低於1,Redis實例可能會把部分數據交換到硬碟上。記憶體交換會嚴重影響Redis的性能,所以應該增加可用物理記憶體或減少實Redis記憶體占用。 可查看used_memory章節的優化建議。

3.修改記憶體分配器:Redis支持glibc’s malloc、jemalloc11、tcmalloc幾種不同的記憶體分配器,每個分配器在記憶體分配和碎片上都有不同的實現。不建議普通管理員修改Redis預設記憶體分配器,因為這需要完全理解這幾種記憶體分配器的差異,也要重新編譯Redis。這個方法更多的是讓其瞭解Redis記憶體分配器所做的工作,當然也是改善記憶體碎片問題的一種辦法

六、回收key

info信息中的evicted_keys欄位顯示的是,因為maxmemory限制導致key被回收刪除的數量。回收key的情況只會發生在設置maxmemory值後,不設置會發生記憶體交換。 當Redis由於記憶體壓力需要回收一個key時,Redis首先考慮的不是回收最舊的數據,而是在最近最少使用的key或即將過期的key中隨機選擇一個key,從數據集中刪除。

這可以在配置文件中設置maxmemory-policy值為“volatile-lru”或“volatile-ttl”,來確定Redis是使用lru策略還是過期時間策略。 倘若所有的key都有明確的過期時間,那過期時間回收策略是比較合適的。若是沒有設置key的過期時間或者說沒有足夠的過期key,那設置lru策略是比較合理的,這可以回收key而不用考慮其過期狀態。

# Stats
total_connections_received:843708918
total_commands_processed:3947987793
instantaneous_ops_per_sec:1360
total_net_input_bytes:5061895225788
total_net_output_bytes:13791028024582
instantaneous_input_kbps:1247.52
instantaneous_output_kbps:2756.92
rejected_connections:0
sync_full:2
sync_partial_ok:1
sync_partial_err:0
expired_keys:231544806
evicted_keys:0
keyspace_hits:613324172
keyspace_misses:252815503
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:60179

根據key回收定位性能問題

跟蹤key回收是非常重要的,因為通過回收key,可以保證合理分配Redis有限的記憶體資源。如果evicted_keys值經常超過0,那應該會看到客戶端命令響應延遲時間增加,因為Redis不但要處理客戶端過來的命令請求,還要頻繁的回收滿足條件的key。
需要註意的是,回收key對性能的影響遠沒有記憶體交換嚴重,若是在強制記憶體交換和設置回收策略做一個選擇的話,選擇設置回收策略是比較合理的,因為把記憶體數據交換到硬碟上對性能影響非常大(見前面章節)。

減少回收key以提升性能

減少回收key的數量是提升Redis性能的直接辦法,下麵有2種方法可以減少回收key的數量:

1.增加記憶體限制:倘若開啟快照功能,maxmemory需要設置成物理記憶體的45%,這幾乎不會有引發記憶體交換的危險。若是沒有開啟快照功能,設置系統可用記憶體的95%是比較合理的,具體參考前面的快照和maxmemory限制章節。如果maxmemory的設置是低於45%或95%(視持久化策略),通過增加maxmemory的值能讓Redis在記憶體中存儲更多的key,這能顯著減少回收key的數量。 若是maxmemory已經設置為推薦的閥值後,增加maxmemory限制不但無法提升性能,反而會引發記憶體交換,導致延遲增加、性能降低。 maxmemory的值可以在Redis-cli工具上輸入config set maxmemory命令來設置。
需要註意的是,這個設置是立即生效的,但重啟後丟失,需要永久化保存的話,再輸入config rewrite命令會把記憶體中的新配置刷新到配置文件中。

2.對實例進行分片:分片是把數據分割成合適大小,分別存放在不同的Redis實例上,每一個實例都包含整個數據集的一部分。通過分片可以把很多伺服器聯合起來存儲數據,相當於增加總的物理記憶體,使其在沒有記憶體交換和回收key的策略下也能存儲更多的key。假如有一個非常大的數據集,maxmemory已經設置,實際記憶體使用也已經超過了推薦設置的閥值,那通過數據分片能明顯減少key的回收,從而提高Redis的性能。 分片的實現有很多種方法,下麵是Redis實現分片的幾種常見方式:

  • a. Hash分片:一個比較簡單的方法實現,通過Hash函數計算出key的Hash值,然後值所在範圍對應特定的Redis實例。

  • b. 代理分片:客戶端把請求發送到代理上,代理通過分片配置表選擇對應的Redis實例。 如Twitter的Twemproxy,豌豆莢的codis。

  • c. 一致性Hash分片

  • d. 虛擬桶分片


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、安裝nodejs 2、更新npm到最新版本 3、npm配置為淘寶鏡像 4、創建項目目錄,如 ,並切換到目錄下 5、創建package.json文件,全部使用預設值,創建後可根據實際情況修改 6、搭建webpack、react、typescript需要使用的庫或插件 7、安裝visual stud ...
  • GIF圖有點大,網速慢的或將稍等片刻或可瀏覽本人的製作的demo。 Demo : 點擊查看 HTML: CSS: JS:( JS初始化div形態 ) ...
  • WebStorm混搭svn WebStorm混搭nodeJS 以less和uglify-js為例 如何用npm在root中下載模塊 webstorm簡單介紹 官網地址:http://www.jetbrains.com/webstorm/features/index.html 參考地址:http:// ...
  • 在JavaScript中定義了以下幾種數據類型: 字元串(String) 數字(Number) 布爾(Boolean) 數組(Array) 對象(Object) 空(Null) 未定義(Undefined) 1. 字元串 字元串是以單引號'或雙引號"括起來的任意文本: 如果'本身也是一個字元,那就可 ...
  • 1、Css概念 CSS 指層疊樣式表 (Cascading Style Sheets)(級聯樣式表),Css是用來美化html標簽的,相當於頁面化妝。 ◆樣式表書寫位置 2、 選擇器 2.1、寫法 選擇器是選擇誰(標簽)的過程 選擇器{屬性:值; 屬性:值;}<!--?xml:namespace p ...
  • 一,工程圖。 二,代碼。 RootViewController.h #import <UIKit/UIKit.h> //加入頭文件 #import "MBProgressHUD.h" @interface RootViewController : UIViewController <MBProgre ...
  • 今晚做android作業,出現錯誤提示:void is an invalid type for the variable, invalid:無效的 variable:變數,在網上找了一下後知道是 方法 沒有弄好,仔細檢查了代碼,是漏了一個右花括弧“}”,加上後,就正常了。 ...
  • 集群信息 角色 IP地址 ServerID 類型 Master 192.168.244.10 1 寫入 Candicate master 192.168.244.20 2 讀 Slave 192.168.244.30 3 讀 Monitor host 192.168.244.40 監控集群組 MHA ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...