亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.430618.com 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

Redis內存管理——配置與版本事項

 

這一節我們先簡單聊一下redis配置與版本注意事項,涉及到配置,鍵的過期、32位redis和64位的區別,后續我們再來了解Redis LRU鍵的驅逐策略以及具體的優化策略。

1、配置redis

如果要運行一個高效的redis,我們必須要理解redis.conf文件中所有的內存相關指令,當然redis.conf文件提供了豐富內聯文檔使我們可以更好的理解、更改和測試相關配置項,本節我們先簡單回顧用來配置redis的內存相關的指令,這些都可以在redis.conf文件中進行設置,在運行時我們可以通過CONFIG SET指令來設置。

  • rdbchecksum:默認值為Yes,將一個65位的冗余檢驗碼(CRC64)放在RDB快照文件的尾末(RDB是redis持久化文件的一種,請參考面試官問:Redis數據丟失咋辦?如何持久化它?),以此來發防止文件損壞,當redis開啟子進程將數據持久化到RDB快照文件時,而我們需要注意的是對快照文件進行CRC64校驗會增加10%的內存使用。
  • activerehashing:如果設置為yes,那么redis會在每隔100毫秒會重新哈希,重新哈希會是釋放已經刪除的鍵所占用的內存空間,如果對redis服務器沒有指定硬性響應時間,建議設置為no,從而及時釋放內存,說白設置為no可以提高響應速率,但內存占用較大,設置為yes后及時釋放了內存空間,但遇到高并發量的客戶端時可能降低了響應時間。
  • slave-of:主從復制可以提高可伸縮性,如果你的redis運行在集群環境中我們可以通過slave-of指令將redis切換到從模式,這是該從實例可以從另一個被指定為主實例的redis中復制數據,主從模式下提升redis的冗余度是在內存、硬件和網絡IO之間做出的權衡。

2、鍵過期

保證redis數據庫不會內存溢出簡單有可靠的方法是為鍵設置過期時間,有了過期時間鍵會自動被驅逐,為你應用程序設計一套高效的過期策略可以使你的內存需求更高效可控,我們需要注意的是一旦在鍵上調用EXPIRE命令來設置過期時間,該超時只能通過刪除或替換鍵的方式清除,任何改變值的操作都不能清除該設置的超時:

redis>SET  myname  aa #設置一個key為myname的鍵
ok
redis>EXPIRE  myname 300 #過期時間設為300秒
(integer) 1
redis>TTL myname #檢測一下過期時間
(integer) 287
redis>AppEND myname pp #使用append命令追加值
(integer) 4
redis>GET myname #查看新值
"aapp"
redis>TTL myname  #再次檢測一下過期時間
"259"

可以看到值被修改后超時依然存在,如果需要清除這個超時設置可以在這個鍵上調用setgetset命令,ttl返回-1表示沒有設置超時時間的默認值:

redis> TTL myname #檢測過期時間
(integer) 200
redis> SET myname cc #set命令
ok
redis> TTL myname  #再次檢測過期時間 值為-1
(integer) -1
redis>persist myname  #也可以使用persist命令來清除鍵的過期時間:
(integer)  1
redis>persist myname  #也可以使用persist命令來清除鍵的過期時間:
(integer)  1

需要注意的是如果對一個鍵設了過期時間,但此時數據庫進程被關閉了,在redis重啟之后會自動驅逐該鍵值。

3、32位的redis

對于小于3GB數據集情況下,在32位redis實例中要比64為版本小、這里我們來看兩個redis實例:redisIns32,redisIns64,然后在Python命令行創建測試函數,分別對每個實例設置10000個鍵值對:

>>> def myrRedisTest():
  for i  in range(10000):
    key = "uuid:{}".format(i)
    value=uuid.uuid4()
    redisIns32.set(key,value)
    redisIns64.set(key,value)
>>>def myrRedisTest()

再來看下redis中使用INFO memory查看內存使用情況:

#32位redis實例輸出
redis>INFO memory 
...
used_memory_human:11.87M #redis分配的內存大小
used_peak_human:11.87M #redis使用峰值內存
...

#64位redis實例輸出
redis>INFO memory 
...
used_memory_human:14.18M #redis分配的內存大小
used_peak_human:14.18M #redis使用峰值內存
...

我們看到了相同的數據32位實例和64位實例的內部占用差異,下面我們列舉一百萬個整數、浮點數、字符串、哈希結構以及列表使用的內存對比。

整數、浮點數、字符串的測試對比:

Redis內存管理——配置與版本事項

一百萬個整數、浮點數、字符串redis使用版本比較

  • 圖中顯示如果使用整數,64位redis多使用了36%的內存,只要redis總使用內存不超過4GB,那32位版本的redis節省的內存也是很可觀了。
  • 對于大量使用集合字符串的應用來說,顯然64位版本的redis多出的內存不太明顯,僅僅多了22%,并且64位版本的redis對字符串有大量的額外空間和編碼優化,所以推薦使用64位版本。

哈希結構對比:

Redis內存管理——配置與版本事項

哈希數據結構內存使用對比

對于哈希結構來說,無論存儲什么類型,32位和64位之間差異都是基本定在了19-19.56之間。

列表結構對比

Redis內存管理——配置與版本事項

列表數據結構的內存使用對比

可以看到在32位限制之下,列表非常適合存儲整數和浮點數,字符串在32位和64位之間的內存使用率差異最小。

32位版本redis的注意事項

  • 由于32位版本的redis并未在用戶群中廣發部署和測試,較于64位版本來說可能有未發現的bug。
  • 諸如BITOP和BITCOUNT的位操作、字符串都在64位版本上做了優化。
  • 如果redis配置中參數maxmemory值設置的過于接近4GB,那么redis在通信、復制、IO緩存都有可能阻塞甚至崩潰。

個人理解有所紕漏,還請老鐵們多多指教,下一節我們來講解【Redis LRU鍵的驅逐策略】后續持續更新!

分享到:
標簽:內存管理 Redis
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定