本文主要介紹redis的六大策略(redis關(guān)鍵詞),下面一起看看redis的六大策略(redis關(guān)鍵詞)相關(guān)資訊。
配置文件中最大內(nèi)存刪除策略在redis的配置文件中,可以設(shè)置redis的最大內(nèi)存值。當(dāng)redis使用的內(nèi)存達(dá)到最大值時(shí)(你怎么知道已經(jīng)達(dá)到最大值),redis選擇刪除這些鍵值。根據(jù)策略,在配置中容納鍵值,并且沒(méi)有鍵。這是一致的策略,內(nèi)存已經(jīng)不能適應(yīng)新的核心值了,但是這個(gè)時(shí)候,有沒(méi)有刪除鍵呢?1.1最大內(nèi)存參數(shù)設(shè)置如果maxmemory參數(shù)設(shè)置為0,分兩種情況。*在64位系統(tǒng)上,沒(méi)有限制。*在32系統(tǒng)中,是3g的官方文檔,redis,32位系統(tǒng)最大內(nèi)存為4g,1g為系統(tǒng)預(yù)留,此策略會(huì)自動(dòng)設(shè)置為noeviction。也就是說(shuō),在32位系統(tǒng)中,如果maxmemory設(shè)置為0,則默認(rèn)值為3g。到了3g,寫入reidis,就會(huì)報(bào)錯(cuò)。1.2達(dá)到最大內(nèi)存時(shí)刪除鍵的幾種策略*易變lru和刪除鍵,停止使用lru算法選擇lru算法(至少最近)和刪除鍵都設(shè)置了過(guò)期時(shí)間。* allkeys lru任意鍵刪除lru算法根據(jù)lru算法刪除任意鍵。這是密鑰設(shè)置過(guò)期的時(shí)間嗎?no. * volatile隨機(jī)密鑰和-delete隨機(jī)密鑰其過(guò)期時(shí)間在過(guò)期集合中設(shè)置的隨機(jī)密鑰被隨機(jī)刪除。* allkeys隨機(jī)刪除一個(gè)隨機(jī)密鑰,任意密鑰隨機(jī)刪除任意密鑰,不管該密鑰是否有過(guò)期時(shí)間。* volatile ttl key和delete,最晚到期時(shí)間(secondary ttl)用最后一個(gè)值(ttl)刪除密鑰。*如果沒(méi)有證據(jù)不會(huì)過(guò)期,它將返回一個(gè)錯(cuò)誤的寫操作,如果沒(méi)有設(shè)置終止時(shí)間,它將返回一個(gè)錯(cuò)誤。1.3配置最大內(nèi)存策略。以下命令的默認(rèn)策略是:volatile lru在此命令中寫入# date:setnx,此附加月份,rpush lpush rpushx # increase lpushx lin sert lset rpoplush,sade sinter sinterstore和sunionstore,此sdiffstore # zadd zincrby zuniostore zinterstore hset hse tnx hm set hinc rby # incr by decrby # jie xian mset mset mset tnx執(zhí)行排序# default: # maxmemory lru 1.4用可變策略配置刪除鍵的檢測(cè)樣本數(shù)maxmemory樣本由于lru和最小ttl算法都是不精確的算法,所以可以選擇要檢查的樣本數(shù)。例如,在默認(rèn)情況下,redis將檢查3個(gè)鍵選擇的鍵,這些鍵從3開始最近沒(méi)有使用過(guò)。當(dāng)然,你可以查看樣本號(hào)的值修改。要修改這個(gè)值,可以在配置文件中設(shè)置參數(shù):maxmemory sample 3 2這些刪除策略的實(shí)現(xiàn)是在函數(shù)freememoryifneed(void)中。以下是對(duì)每種策略的實(shí)施的詳細(xì)描述。2.1什么時(shí)候刪除鍵值當(dāng)maxmemory策略被設(shè)置,鍵值被刪除的時(shí)候,其實(shí)就是當(dāng)maxmemory參數(shù)被設(shè)置,對(duì)應(yīng)的鍵值被刪除的時(shí)候,各個(gè)命令的處理。代碼如下:每個(gè)命令處理客戶端都會(huì)調(diào)用這個(gè)函數(shù)的maxmemory指令國(guó)際進(jìn)程命令(redisclient × c) {…。/正在處理* *首先,如果可能,我們嘗試釋放一些內(nèi)存(如果有)*數(shù)據(jù)集中的鍵)。如果我們不這樣做。;t擁有唯一的東西*返回一個(gè)錯(cuò)誤。如果有可以刪除的鍵,釋放一些內(nèi)存,如果沒(méi)有,返回一個(gè)錯(cuò)誤給客戶端。如果(服務(wù)器。maxmemory){//如果maxmemory不為0,那么調(diào)用下面的函數(shù)釋放某個(gè)鍵int = freememoryiffed(use);//根據(jù)分配策略刪除key,if((c-command-flag redis _ cmd _ deny oom retry =)redis _ err){//如果有錯(cuò)誤,則終止處理命令,并向客戶端標(biāo)志事務(wù)返回錯(cuò)誤(c);addreply(c,分享。oomerr);返回redis _ ok;} }……}練習(xí)1:如果沒(méi)有設(shè)置maxmemory變量,那么即使設(shè)置了maxmemory策略也不起作用。實(shí)戰(zhàn)二:如果不設(shè)置maxmemory變量,在不會(huì)調(diào)用釋放策略的時(shí)候,會(huì)加速命令的處理和命令的進(jìn)程。2.2刪除鍵的全過(guò)程當(dāng)內(nèi)存達(dá)到最大時(shí),我們需要根據(jù)策略刪除舊的鍵。所有的刪除和刪除策略都是通過(guò)freememoryiffed函數(shù)實(shí)現(xiàn)的。在執(zhí)行刪除策略之前,首先選擇數(shù)據(jù)庫(kù)和鍵。一般步驟如下:國(guó)際freememoryiffed(void){ size _ t mem _ used,mem_tofree,mem _ freed;int slave = listlength(服務(wù)器。奴隸);mstime_t延遲;移除從輸出/緩沖和非緩沖大小*內(nèi)存使用計(jì)數(shù)。mem _ used = zmalloc _ used _ memory;if(slaves){ listiterli;idea:* ln;;listrewind(server.slaves,李);和((ln = list next(li))){ redis client * slave = list nodevalue(ln);無(wú)符號(hào)長(zhǎng)度obuf _ bytes = getclientoutputbuffermoryuusage(slave);if(obuf _ bytes mem _ used)mem _ used = 0;other mem _ used = obuf _ bytes}} if (server.aof_state!= redis _ aof _ off){ mem _ used = sds len(server。aof _ buf);mem _ used = aofrewritebuffersize;}檢查我們是否超過(guò)了內(nèi)存*限制。檢查當(dāng)前系統(tǒng)是否超過(guò)限制內(nèi)存if (mem_used server。maxmemory)返回redis _ ok;如果(server . maxmemory _ policy = redis _ maxmemory _ no _ evil)返回redis_err,我們需要自由;/* */沒(méi)有內(nèi)存,只有策略。計(jì)算我們需要多少內(nèi)存。mem _ to free = mem _ used-server . maxmemory;mem _ freed = 0;latencystartmonitor(延遲);and (mem_freed mem_tofree){ int j,k,keys _ freed = 0;;16數(shù)據(jù)庫(kù)遍歷是(j = 0;;j mem _ used)mem _ used = 0;other mem _ used = obuf _ bytes}} if (server.aof_state!= redis _ aof _ off){//減去已用內(nèi)存大小mem_used = sdslen (server。aof _ buf);mem _ used = aofrewritebuffersize;}檢查我們是否超過(guò)了內(nèi)存限制。*檢查內(nèi)存限制的設(shè)置。if (mem_used服務(wù)器。maxmemory)返回redis _ ok;如果(server.maxmemory_policy = redis _ maxmemory _ no _ evil)return redis _ err我們需要自由;/* */沒(méi)有內(nèi)存,只有策略。內(nèi)存量計(jì)算出我們需要多少內(nèi)存。*待釋放計(jì)算mem _ to free = mem _ used-server . maxmemory;mem _ freed = 0;latencystartmonitor(延遲);且(mem _ freed mem _ to free){//已經(jīng)釋放,釋放的內(nèi)存小于總內(nèi)存int j,k,keys _ freed = 0;;for(j = 0;j將無(wú)效。如果最大存儲(chǔ)/刪除策略是易變lru,您需要從數(shù)據(jù)庫(kù)中找到它。如果//volatile xx策略,當(dāng)前操作的數(shù)據(jù)庫(kù)存儲(chǔ)結(jié)構(gòu)無(wú)效,需要從字典中查找key if(server . maxmemory _ policy = redis _ maxmemory _ volatile _ lru)germany = dict find(d b-dictionary,this key);獲取密鑰恢復(fù)值o = dictgetval(德國(guó));關(guān)鍵視圖中剩余的時(shí)間this val = estimateobjective time(o);更高的空閑時(shí)間是更好的選擇* * delete//該鍵從lru的幾個(gè)鍵遍歷中一次選擇最長(zhǎng)的。如何更新//l值?關(guān)鍵是每次看,關(guān)鍵lru值更新,這是系統(tǒng)的時(shí)間戳。if(this = = null | | this val best val){ this = this;bestval = thisval} } } volatile ttl/* * * if(server . maxmemory _ policy = = redis _ maxmemory _ volatile _ ttl){ is(k = 0;;k < server.maxmemory _ samplesk ){此表;長(zhǎng)thisval;德國(guó)= dictgetrandomkey(字典);this key = dictgetkey(德國(guó));thisval = (long) dictgetval(德國(guó));過(guò)期太早(過(guò)期時(shí)間戳越小越好)*已刪除候選* if(this = = null | | this val id);decrefcount(key obj);keys _ freed當(dāng)內(nèi)存開始空閑/足夠大的時(shí)候,我們就可以*不可能開始花這么多時(shí)間在這里*足夠快可以把數(shù)據(jù)傳到從機(jī),所以我們強(qiáng)制。*環(huán)路中的傳輸。if(slave)flushlaslavesoutputbuffers;}}如果(!keys _ freed){ latency end monitor(delay);latencyaddsampleifneeded(驅(qū)逐循環(huán)無(wú)自由返回redis _ err/* * /…}} latencyendmonitor(延遲);latencyaddsampleifneeded(驅(qū)逐循環(huán)返回redis _ ok;邊肖分享了您關(guān)于redis上述關(guān)鍵戰(zhàn)略的實(shí)施方法的全部?jī)?nèi)容。希望能給大家一個(gè)參考,希望大家支持。
了解更多redis的六大策略(redis關(guān)鍵詞)相關(guān)內(nèi)容請(qǐng)關(guān)注本站點(diǎn)。