成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Redis內存淘汰策略,看這一篇就夠了!

存儲 存儲軟件 Redis
Redis作為當前最常用的開源內存數據庫,性能十分高,據官方數據表示Redis讀的速度是110000次/s,寫的速度是81000次/s 。而且Redis支持數據持久化,眾多數據結構存儲,master-slave模式數據備份等多種功能。

 Redis作為當前最常用的開源內存數據庫,性能十分高,據官方數據表示Redis讀的速度是110000次/s,寫的速度是81000次/s 。而且Redis支持數據持久化,眾多數據結構存儲,master-slave模式數據備份等多種功能。

但是長期將Redis作為緩存使用,難免會遇到內存空間存儲瓶頸,當Redis內存超出物理內存限制時,內存數據就會與磁盤產生頻繁交換,使Redis性能急劇下降。此時如何淘汰無用數據釋放空間,存儲新數據就變得尤為重要了。

[[261956]]

對此,Redis在生產環境中,采用配置參數maxmemory 的方式來限制內存大小。當實際存儲內存超出maxmemory 參數值時,開發者們可以通過這幾種方法——Redis內存淘汰策略,來決定如何騰出新空間繼續支持讀寫工作。

那么Redis內存淘汰策略是如何工作的呢?

首先,客戶端會發起需要更多內存的申請;

其次,Redis檢查內存使用情況,如果實際使用內存已經超出maxmemory,Redis就會根據用戶配置的淘汰策略選出無用的key;

***,確認選中數據沒有問題,成功執行淘汰任務。

 

當前Redis3.0版本支持的淘汰策略有6種:

1. volatile-lru:從設置過期時間的數據集(server.db[i].expires)中挑選出最近最少使用的數據淘汰。沒有設置過期時間的key不會被淘汰,這樣就可以在增加內存空間的同時保證需要持久化的數據不會丟失。

2. volatile-ttl:除了淘汰機制采用LRU,策略基本上與volatile-lru相似,從設置過期時間的數據集(server.db[i].expires)中挑選將要過期的數據淘汰,ttl值越大越優先被淘汰。

3. volatile-random:從已設置過期時間的數據集(server.db[i].expires)中任意選擇數據淘汰。當內存達到限制無法寫入非過期時間的數據集時,可以通過該淘汰策略在主鍵空間中隨機移除某個key。

4. allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰,該策略要淘汰的key面向的是全體key集合,而非過期的key集合。

5. allkeys-random:從數據集(server.db[i].dict)中選擇任意數據淘汰。

6. no-enviction:禁止驅逐數據,也就是當內存不足以容納新入數據時,新寫入操作就會報錯,請求可以繼續進行,線上任務也不能持續進行,采用no-enviction策略可以保證數據不被丟失,這也是系統默認的一種淘汰策略。

上述是Redis的6種淘汰策略,關于使用這6種策略,開發者還需要根據自身系統特征,正確選擇或修改驅逐。

  • 在Redis中,數據有一部分訪問頻率較高,其余部分訪問頻率較低,或者無法預測數據的使用頻率時,設置allkeys-lru是比較合適的。
  • 如果所有數據訪問概率大致相等時,可以選擇allkeys-random。
  • 如果研發者需要通過設置不同的ttl來判斷數據過期的先后順序,此時可以選擇volatile-ttl策略。
  • 如果希望一些數據能長期被保存,而一些數據可以被淘汰掉時,選擇volatile-lru或volatile-random都是比較不錯的。
  • 由于設置expire會消耗額外的內存,如果計劃避免Redis內存在此項上的浪費,可以選用allkeys-lru 策略,這樣就可以不再設置過期時間,高效利用內存了。

Redis緩存功能,是由edis.c文件中的freeMemoryIfNeeded函數實現的。如果maxmemory被設置,那么每次在執行命令錢,該函數都會被調用來判斷內存是否夠用、釋放內存、返回錯誤。如果沒有足夠的內存程序主邏輯將會阻止設置了REDIS_COM_DENYOOM flag的命令執行,對其返回command not allowed when used memory > ‘maxmemory’的錯誤消息。

區分不同的淘汰策略選擇不同的key,Redis淘汰策略主要分為LRU淘汰、TTL淘汰、隨機淘汰三種機制。

LRU淘汰

LRU(Least recently used,最近最少使用)算法根據數據的歷史訪問記錄來進行淘汰數據,其核心思想是“如果數據最近被訪問過,那么將來被訪問的幾率也更高”。

在服務器配置中保存了 lru 計數器 server.lrulock,會定時(redis 定時程序 serverCorn())更新,server.lrulock 的值是根據 server.unixtime 計算出來進行排序的,然后選擇最近使用時間最久的數據進行刪除。另外,從 struct redisObject 中可以發現,每一個 redis 對象都會設置相應的 lru。每一次訪問數據,會更新對應redisObject.lru。

在Redis中,LRU算法是一個近似算法,默認情況下,Redis會隨機挑選5個鍵,并從中選擇一個最久未使用的key進行淘汰。在配置文件中,按maxmemory-samples選項進行配置,選項配置越大,消耗時間就越長,但結構也就越精準。

 

TTL淘汰

Redis 數據集數據結構中保存了鍵值對過期時間的表,即 redisDb.expires。與 LRU 數據淘汰機制類似,TTL 數據淘汰機制中會先從過期時間的表中隨機挑選幾個鍵值對,取出其中 ttl ***的鍵值對淘汰。同樣,TTL淘汰策略并不是面向所有過期時間的表中最快過期的鍵值對,而只是隨機挑選的幾個鍵值對。

隨機淘汰

在隨機淘汰的場景下獲取待刪除的鍵值對,隨機找hash桶再次hash指定位置的dictEntry即可。

Redis中的淘汰機制都是幾近于算法實現的,主要從性能和可靠性上做平衡,所以并不是完全可靠,所以開發者們在充分了解Redis淘汰策略之后還應在平時多主動設置或更新key的expire時間,主動刪除沒有價值的數據,提升Redis整體性能和空間。

責任編輯:武曉燕 來源: 云季科技
相關推薦

2020-02-18 16:20:03

Redis ANSI C語言日志型

2023-11-06 07:21:13

內存結構Jvm

2022-08-01 11:33:09

用戶分析標簽策略

2021-04-08 07:37:39

隊列數據結構算法

2023-09-11 08:13:03

分布式跟蹤工具

2023-02-10 09:04:27

2022-06-20 09:01:23

Git插件項目

2017-03-11 22:19:09

深度學習

2022-04-07 10:39:21

反射Java安全

2023-11-18 09:30:42

模型AI

2020-07-03 08:21:57

Java集合框架

2019-05-14 09:31:16

架構整潔軟件編程范式

2023-10-17 08:15:28

API前后端分離

2018-05-22 08:24:50

PythonPyMongoMongoDB

2024-09-23 08:00:00

消息隊列MQ分布式系統

2020-05-14 16:35:21

Kubernetes網絡策略DNS

2019-04-02 10:51:29

瀏覽器緩存前端

2017-03-13 09:50:46

Python裝飾器

2019-12-31 09:56:16

Linux 系統 數據

2019-09-05 08:14:44

Puppet部署結構
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品18hdxxxⅹ在线 | 一级在线毛片 | 精品久久久久久久久久久下田 | 亚洲欧美视频一区二区 | 午夜国产羞羞视频免费网站 | 99日韩| 成人精品国产免费网站 | 精品国产欧美 | 一二三四av| 亚洲综合色自拍一区 | 欧美成视频在线观看 | 成人不卡| 日韩成人精品一区二区三区 | 天堂网中文| 日本人做爰大片免费观看一老师 | 丝袜美腿一区二区三区 | 国产精品我不卡 | 最新中文字幕第一页视频 | 2019精品手机国产品在线 | 99精品99久久久久久宅男 | 国产精品久久一区二区三区 | 极品国产视频 | av免费在线播放 | 欧美午夜精品久久久久久浪潮 | 狼人伊人影院 | 成人三区 | 人人艹人人| 在线āv视频 | 成人在线视频网 | 成人久久| 亚洲电影专区 | 99免费在线观看视频 | 精品久久国产 | 欧美激情精品久久久久久免费 | 免费高潮视频95在线观看网站 | 97国产在线观看 | 日韩三级免费观看 | 一区二区三区在线免费观看 | aa级毛片毛片免费观看久 | 国产一区二区免费在线 | 日韩成人免费视频 |