自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Redis內(nèi)存淘汰策略,看這一篇就夠了!

存儲 存儲軟件 Redis
Redis作為當(dāng)前最常用的開源內(nèi)存數(shù)據(jù)庫,性能十分高,據(jù)官方數(shù)據(jù)表示Redis讀的速度是110000次/s,寫的速度是81000次/s 。而且Redis支持?jǐn)?shù)據(jù)持久化,眾多數(shù)據(jù)結(jié)構(gòu)存儲,master-slave模式數(shù)據(jù)備份等多種功能。

 Redis作為當(dāng)前最常用的開源內(nèi)存數(shù)據(jù)庫,性能十分高,據(jù)官方數(shù)據(jù)表示Redis讀的速度是110000次/s,寫的速度是81000次/s 。而且Redis支持?jǐn)?shù)據(jù)持久化,眾多數(shù)據(jù)結(jié)構(gòu)存儲,master-slave模式數(shù)據(jù)備份等多種功能。

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

[[261956]]

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

那么Redis內(nèi)存淘汰策略是如何工作的呢?

首先,客戶端會發(fā)起需要更多內(nèi)存的申請;

其次,Redis檢查內(nèi)存使用情況,如果實(shí)際使用內(nèi)存已經(jīng)超出maxmemory,Redis就會根據(jù)用戶配置的淘汰策略選出無用的key;

***,確認(rèn)選中數(shù)據(jù)沒有問題,成功執(zhí)行淘汰任務(wù)。

 

當(dāng)前Redis3.0版本支持的淘汰策略有6種:

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

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

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

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

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

6. no-enviction:禁止驅(qū)逐數(shù)據(jù),也就是當(dāng)內(nèi)存不足以容納新入數(shù)據(jù)時,新寫入操作就會報錯,請求可以繼續(xù)進(jìn)行,線上任務(wù)也不能持續(xù)進(jìn)行,采用no-enviction策略可以保證數(shù)據(jù)不被丟失,這也是系統(tǒng)默認(rèn)的一種淘汰策略。

上述是Redis的6種淘汰策略,關(guān)于使用這6種策略,開發(fā)者還需要根據(jù)自身系統(tǒng)特征,正確選擇或修改驅(qū)逐。

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

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

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

LRU淘汰

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

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

在Redis中,LRU算法是一個近似算法,默認(rèn)情況下,Redis會隨機(jī)挑選5個鍵,并從中選擇一個最久未使用的key進(jìn)行淘汰。在配置文件中,按maxmemory-samples選項(xiàng)進(jìn)行配置,選項(xiàng)配置越大,消耗時間就越長,但結(jié)構(gòu)也就越精準(zhǔn)。

 

TTL淘汰

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

隨機(jī)淘汰

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

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

責(zé)任編輯:武曉燕 來源: 云季科技
相關(guān)推薦

2020-02-18 16:20:03

Redis ANSI C語言日志型

2023-11-06 07:21:13

內(nèi)存結(jié)構(gòu)Jvm

2023-02-10 09:04:27

2022-06-20 09:01:23

Git插件項(xiàng)目

2022-08-01 11:33:09

用戶分析標(biāo)簽策略

2021-04-08 07:37:39

隊(duì)列數(shù)據(jù)結(jié)構(gòu)算法

2023-09-11 08:13:03

分布式跟蹤工具

2020-05-14 16:35:21

Kubernetes網(wǎng)絡(luò)策略DNS

2020-07-03 08:21:57

Java集合框架

2018-05-22 08:24:50

PythonPyMongoMongoDB

2023-10-17 08:15:28

API前后端分離

2024-09-23 08:00:00

消息隊(duì)列MQ分布式系統(tǒng)

2019-05-14 09:31:16

架構(gòu)整潔軟件編程范式

2017-03-11 22:19:09

深度學(xué)習(xí)

2022-04-07 10:39:21

反射Java安全

2023-11-18 09:30:42

模型AI

2022-07-06 12:07:06

Python函數(shù)式編程

2019-04-01 10:43:59

Linux問題故障

2020-10-21 14:12:02

Single Sign

2022-05-19 08:28:19

索引數(shù)據(jù)庫
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號