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

緩存又掛了??jī)?nèi)存又爆了?只需要一招完美解決!

新聞 前端
你的緩存是不是經(jīng)常爆掉呢?是不是討厭DBA經(jīng)常叨叨叨的?跟唐僧一個(gè)樣?如果是,那么可能是你還沒(méi)玩會(huì)redis哦,為什么?因?yàn)榫彺媸怯脕?lái)對(duì)抗高并發(fā)熱點(diǎn)數(shù)據(jù)請(qǐng)求的,而你可能將大量的長(zhǎng)時(shí)間不使用的數(shù)據(jù)也放在里面了,白白浪費(fèi)了內(nèi)存。

 O!NO!緩存又掛了,redis不給力?。话盐胰?,內(nèi)存爆了?DBA干啥去了,怎么老是掛啊?

你的緩存是不是經(jīng)常爆掉呢?是不是討厭DBA經(jīng)常叨叨叨的?跟唐僧一個(gè)樣?如果是,那么可能是你還沒(méi)玩會(huì)redis哦,為什么?因?yàn)榫彺媸怯脕?lái)對(duì)抗高并發(fā)熱點(diǎn)數(shù)據(jù)請(qǐng)求的,而你可能將大量的長(zhǎng)時(shí)間不使用的數(shù)據(jù)也放在里面了,白白浪費(fèi)了內(nèi)存。

今天教你一招,解決大量冷點(diǎn)數(shù)據(jù)白白浪費(fèi)內(nèi)存。

Redis中有個(gè)設(shè)置時(shí)間過(guò)期的功能,即對(duì)存儲(chǔ)在redis數(shù)據(jù)庫(kù)中的值可以設(shè)置一個(gè)過(guò)期時(shí)間。作為一個(gè)緩存數(shù)據(jù)庫(kù),這是非常實(shí)用的。然而很多的程序員并沒(méi)有認(rèn)識(shí)到這一點(diǎn),比如我們要緩存用戶(hù)的token,那么是不是你會(huì)將所有的都放入緩存?是的,然后問(wèn)題是,下次又想緩存用戶(hù)登錄賬號(hào)和密碼加密串,又放入緩存,如果你有1000萬(wàn)用戶(hù),是不是發(fā)現(xiàn)內(nèi)存不夠了?

那么我們有必要將所有用戶(hù)的token都一直保存在內(nèi)存中嗎?

答案顯然不是,我們只需要緩存最近經(jīng)常用的。那些1、2年都不登錄一次的,顯然放mysql更經(jīng)濟(jì)實(shí)惠。

那問(wèn)題又來(lái)了,我怎么知道用戶(hù)什么時(shí)候登錄?

是的,不知道,所以用戶(hù)注冊(cè)之后,我們需要放進(jìn)入,但是如果用戶(hù)1個(gè)月沒(méi)有登錄,我們就可以刪除了,釋放內(nèi)存。

哦。OK,我知道了,我寫(xiě)個(gè)定時(shí)任務(wù),自動(dòng)去判斷就是了。

NO,NO,NO,根本用不著,redis已經(jīng)給你解決方案了。那就是過(guò)期時(shí)間。只需要寫(xiě)入key的時(shí)候,設(shè)置好過(guò)期時(shí)間即可,剩下的交給redis。

如我們一般項(xiàng)目中的token或者一些登錄信息,尤其是短信驗(yàn)證碼都是有時(shí)間限制的。這正是它的用武之地。

緩存又掛了??jī)?nèi)存又爆了?只需要一招***解決!

有效時(shí)間設(shè)置:

redis對(duì)存儲(chǔ)值的過(guò)期處理實(shí)際上是針對(duì)該值的鍵(key)處理的,即時(shí)間的設(shè)置也是設(shè)置key的有效時(shí)間。Expires字典保存了所有鍵的過(guò)期時(shí)間,Expires也被稱(chēng)為過(guò)期字段。

redis> SET key va1ue

OK

redis> EXPlRE key 1000

(integer) 1

四種處理策略

1. EXPIRE 將key的生存時(shí)間設(shè)置為ttl秒

2. PEXPIRE 將key的生成時(shí)間設(shè)置為ttl毫秒

3. EXPIREAT 將key的過(guò)期時(shí)間設(shè)置為timestamp所代表的的秒數(shù)的時(shí)間戳

4. PEXPIREAT 將key的過(guò)期時(shí)間設(shè)置為timestamp所代表的的毫秒數(shù)的時(shí)間戳

其實(shí)以上幾種處理方式都是根據(jù)PEXPIREAT來(lái)實(shí)現(xiàn)的,設(shè)置生存時(shí)間的時(shí)候是redis內(nèi)部計(jì)算好時(shí)間之后在內(nèi)存處理的,最終的處理都會(huì)轉(zhuǎn)向PEXPIREAT。 1、2兩種方式是設(shè)置一個(gè)過(guò)期的時(shí)間段,就是咱們處理驗(yàn)證碼最常用的策略,設(shè)置三分鐘或五分鐘后失效,把分鐘數(shù)轉(zhuǎn)換成秒或毫秒存儲(chǔ)到redis中。 3、4兩種方式是指定一個(gè)過(guò)期的時(shí)間 ,比如優(yōu)惠券的過(guò)期時(shí)間是某年某月某日,只是單位不一樣。

過(guò)期處理

過(guò)期鍵的處理就是把過(guò)期鍵刪除,這里的操作主要是針對(duì)過(guò)期字段處理的。 Redis中有三種處理策略:定時(shí)刪除、惰性刪除和定期刪除。

1. 定時(shí)刪除:在設(shè)置鍵的過(guò)期時(shí)間的時(shí)候創(chuàng)建一個(gè)定時(shí)器,當(dāng)過(guò)期時(shí)間到的時(shí)候立馬執(zhí)行刪除操作。不過(guò)這種處理方式是即時(shí)的,不管這個(gè)時(shí)間內(nèi)有多少過(guò)期鍵,不管服務(wù)器現(xiàn)在的運(yùn)行狀況,都會(huì)立馬執(zhí)行,所以對(duì)CPU不是很友好。因此,請(qǐng)注意,不要將大量的key過(guò)期時(shí)間設(shè)置到同一時(shí)間,因?yàn)橥粫r(shí)間刪除操作,將消耗大量資源,可能導(dǎo)致線(xiàn)上redis不穩(wěn)定,甚至crash。

2. 惰性刪除:惰性刪除策略不會(huì)在鍵過(guò)期的時(shí)候立馬刪除,而是當(dāng)外部指令獲取這個(gè)鍵的時(shí)候才會(huì)主動(dòng)刪除。處理過(guò)程為:接收get執(zhí)行、判斷是否過(guò)期(這里按過(guò)期判斷)、執(zhí)行刪除操作、返回nil(空)。這種策略需要注意,因?yàn)榭赡軙?huì)導(dǎo)致內(nèi)存大量最近很少使用的key,占據(jù)內(nèi)存,很少使用,則這個(gè)key沒(méi)有訪(fǎng)問(wèn),也就不會(huì)刪除,還是占著內(nèi)存。

3. 定期刪除:這個(gè)一般是線(xiàn)上推薦方式,定期刪除是設(shè)置一個(gè)時(shí)間間隔,每個(gè)時(shí)間段都會(huì)檢測(cè)是否有過(guò)期鍵,如果有執(zhí)行刪除操作。同時(shí)也要注意,不要將大量的key過(guò)期時(shí)間設(shè)置為同一時(shí)間,同1策略類(lèi)似。沒(méi)有2策略的問(wèn)題。

看完上面三種策略后可以得出以下結(jié)論: (1) 1、3為主動(dòng)刪除,2為被動(dòng)刪除。 (2) 1是實(shí)時(shí)執(zhí)行的,線(xiàn)上慎重使用。(3) 2、3為被動(dòng)刪除,所以過(guò)期鍵應(yīng)該會(huì)存在一定的時(shí)間,這樣就使得過(guò)期鍵不會(huì)被立馬刪除,仍然占用著內(nèi)存。但是惰性刪除的時(shí)候一般是單個(gè)刪除,相對(duì)來(lái)說(shuō)對(duì)線(xiàn)上業(yè)務(wù)基本沒(méi)有影響。(4)定期刪除執(zhí)行不能過(guò)于頻繁,否則就可能會(huì)演變成定時(shí)刪除,如果執(zhí)行的過(guò)少就有可能造成過(guò)多過(guò)期鍵未被刪除而占用過(guò)多內(nèi)存。因此應(yīng)該根據(jù)線(xiàn)上情況進(jìn)行合理設(shè)置。

持久化與復(fù)制的影響

過(guò)期鍵刪除策略對(duì)持久化以及復(fù)制的影響大致如下。

RDB: 1. 主服務(wù)器模式運(yùn)行在載入RDB文件時(shí),程序會(huì)檢查文件中的鍵,只會(huì)加載未過(guò)期的,過(guò)期的會(huì)被忽略,所以RDB模式下過(guò)期鍵不會(huì)對(duì)主服務(wù)器產(chǎn)生影響。 2. 從服務(wù)器運(yùn)行載入RDB文件時(shí),會(huì)載入所有鍵,包括過(guò)期和未過(guò)期。當(dāng)主服務(wù)器進(jìn)行數(shù)據(jù)同步的時(shí)候,從服務(wù)器的數(shù)據(jù)會(huì)被清空,所以RDB文件的過(guò)期鍵一般不會(huì)對(duì)從服務(wù)器產(chǎn)生影響。

AOF: AOF文件不會(huì)受過(guò)期鍵的影響。如果有過(guò)期鍵未被刪除,會(huì)執(zhí)行以下動(dòng)作: 客戶(hù)端請(qǐng)求時(shí)(過(guò)期鍵):

1. 從數(shù)據(jù)庫(kù)充刪除被訪(fǎng)問(wèn)的過(guò)期鍵;

2. 追加一條DEL 命令到AOF文件;

3. 向執(zhí)行請(qǐng)求的客戶(hù)端回復(fù)nil(空)。

復(fù)制:

1. 主服務(wù)器刪除過(guò)期鍵之后,向從服務(wù)器發(fā)送一條DEL指令,告知?jiǎng)h除該過(guò)期鍵。

2. 從服務(wù)器接收到get指令的時(shí)候不會(huì)對(duì)過(guò)期鍵進(jìn)行處理,只會(huì)當(dāng)做未過(guò)期鍵一樣返回。(為了保持主從服務(wù)器數(shù)據(jù)的一致性)

3. 從服務(wù)器只有接到主服務(wù)器發(fā)送的DEL指令后才會(huì)刪除過(guò)期鍵。

清理內(nèi)存全局策略

當(dāng)前已用內(nèi)存超過(guò)maxmemory限定時(shí),將觸發(fā)主動(dòng)清理策略。因?yàn)閮?nèi)存已經(jīng)使用完了,然而緩存的數(shù)據(jù)中,可能存在一些長(zhǎng)時(shí)間沒(méi)有使用的數(shù)據(jù),這時(shí)候我們可以根據(jù)一定的策略,進(jìn)行有選擇的刪除清理,以保障內(nèi)存中緩存的都盡可能是熱點(diǎn)數(shù)據(jù)。

volatile-lru:只對(duì)設(shè)置了過(guò)期時(shí)間的key進(jìn)行LRU(默認(rèn)值)因此采用這種策略的redis,請(qǐng)將所有key設(shè)置過(guò)期時(shí)間。一般線(xiàn)上我們也推薦設(shè)置過(guò)期時(shí)間。

allkeys-lru : 刪除lru算法的key,這種策略不區(qū)分是否設(shè)置過(guò)期時(shí)間,key是否過(guò)期,是判斷哪些是最近最少使用的,進(jìn)行刪除,避免有的設(shè)置了過(guò)期時(shí)間,而有的沒(méi)有設(shè)置,永不過(guò)期。

volatile-random:隨機(jī)刪除即將過(guò)期key,隨機(jī)刪除,但只是刪除快要過(guò)期的當(dāng)中去隨機(jī)刪除。如果你沒(méi)有設(shè)置過(guò)期時(shí)間,則不會(huì)刪除。

allkeys-random:隨機(jī)刪除,這是類(lèi)似volatile-random,不同的是,它不區(qū)分是否過(guò)期,對(duì)所有key有效。

volatile-ttl : 刪除即將過(guò)期的。這個(gè)策略,則不計(jì)算LRU原則,而是只判斷即將要過(guò)期的,如果沒(méi)有設(shè)置過(guò)期時(shí)間,則不會(huì)刪除。

noeviction : 永不過(guò)期,返回錯(cuò)誤。如果你所有的key都設(shè)置的永不過(guò)期,那么你有000萬(wàn)用戶(hù)登錄過(guò),你的redis將會(huì)很快內(nèi)存用完。無(wú)法寫(xiě)入的問(wèn)題。線(xiàn)上杜絕全部都是永不過(guò)期。

Lru是什么?就是按照最近最少使用的原則,比如長(zhǎng)時(shí)間沒(méi)有登錄過(guò)的用戶(hù),就可以刪除它的key,下次登錄從數(shù)據(jù)庫(kù)讀取出來(lái)。因?yàn)閞edis大多在內(nèi)存操作,因此內(nèi)存是很寶貴的,一定是給最常用的進(jìn)行緩存,也就是緩存熱點(diǎn)數(shù)據(jù)。

看完今天的內(nèi)容,是不是應(yīng)該理解一下數(shù)據(jù)庫(kù)管理的抱怨,數(shù)據(jù)庫(kù)被爆滿(mǎn),內(nèi)存枯竭,其實(shí)很多都是我們程序?qū)懭霐?shù)據(jù)的時(shí)候,不配置過(guò)期時(shí)間,導(dǎo)致實(shí)際上存了大量不常用的數(shù)據(jù),而內(nèi)存經(jīng)常不夠用,或是內(nèi)存消耗過(guò)高。

尊敬的程序員朋友們,今天的小知識(shí)mark到了嗎?

責(zé)任編輯:張燕妮 來(lái)源: 頭條科技
相關(guān)推薦

2021-09-09 18:12:22

內(nèi)存分段式網(wǎng)絡(luò)

2019-10-28 11:30:43

架構(gòu)數(shù)據(jù)結(jié)構(gòu)布隆過(guò)濾器

2023-07-18 19:11:21

配置信令系統(tǒng)

2018-08-03 12:21:02

2021-05-09 10:28:31

Windows10操作系統(tǒng)微軟

2023-05-23 10:01:51

冪等性抽象代數(shù)

2011-11-25 13:52:45

dll后門(mén)木馬bits

2023-03-06 07:50:19

內(nèi)存回收Go

2014-07-23 10:19:02

小米4

2017-12-28 10:44:08

JavaScript瀏覽器網(wǎng)頁(yè)

2023-05-30 07:35:06

RTX 40NVIDIA顯卡

2021-11-05 11:10:13

MyBatisSQL查詢(xún)

2020-10-29 11:08:06

CPUMySQL數(shù)據(jù)庫(kù)

2019-11-11 13:40:45

Python 開(kāi)發(fā)編程語(yǔ)言

2019-05-27 08:09:43

WiFi無(wú)線(xiàn)信道上網(wǎng)

2020-02-25 23:36:04

代碼開(kāi)發(fā)工具

2010-07-06 09:06:54

維基百科數(shù)據(jù)中心斷電宕機(jī)

2022-10-17 10:13:58

谷歌云游戲

2020-03-31 16:02:23

戴爾

2022-12-07 07:35:20

B站裁員隱情
點(diǎn)贊
收藏

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