Redis基礎(chǔ)(3)——過期時(shí)間

Redis過期時(shí)間

命令介紹

在實(shí)際開發(fā)中會遇到一些有時(shí)效的數(shù)據(jù)尼摹。過了一段時(shí)間就需要?jiǎng)h除這些數(shù)據(jù)以避免系統(tǒng)資源的浪費(fèi)丰泊。關(guān)系數(shù)據(jù)庫一般需要額外的一個(gè)字段來記錄過期時(shí)間铣口,然后定期檢測刪除過期的數(shù)據(jù)。而在redis中拼弃,可以使用EXPIRE命令設(shè)置一個(gè)key的過期時(shí)間搀矫,到時(shí)間之后Redis會自動刪除它抹沪。

命令

EXPIRE key seconds
// seconds表示過期的時(shí)間,單位為秒瓤球。

PEXPIRE key milliseconds
// milliseconds表示過期時(shí)間融欧,單位為毫秒。

TTL key
// 返回值是key的剩余時(shí)間
// 若返回值為-1卦羡,則表示沒有為key設(shè)置過期時(shí)間
// 若返回值為-2噪馏,則表示該key不存在

PERSIST key
// 取消鍵的過期設(shè)置,如果過期時(shí)間被成功清除虹茶,則返回1逝薪,否則返回0

EXPIREAT key time
// time表示過期時(shí)間,為Unix時(shí)間戳

PEXPIREAT key time
// time表示過期時(shí)間蝴罪,為Unix時(shí)間戳董济,單位為ms

版本差異:在2.6版本中,TTL的返回值不論key是否存在要门,只要沒有過期時(shí)間都會返回-1.直到2.8版本后兩種情況才得以分開虏肾。

  • 除了PERSIST命令之外,使用SET或者GETSET命令為key重新賦值也可以取消過期時(shí)間欢搜。>* 使用EXPIRE會重新設(shè)置key的過期時(shí)間封豪。
  • 其他只對鍵值操作的命令(如 INCR、LPUSH炒瘟、HSET吹埠、ZREM)均不會影響鍵的過期時(shí)間疮装。
  • EXPIRE命令的seconds參數(shù)必須是整數(shù)缘琅,所以最精確的單位為1s
  • 如果使用WATCH命令監(jiān)測了一個(gè)擁有過期時(shí)間的key,該key到期之后自動刪除廓推,并不會被WATCH命令認(rèn)為是鍵被改變刷袍。

實(shí)現(xiàn)訪問頻率的控制

方法一
# 限制每分鐘只能訪問10次
$isKeyExists = EXISTS rate.limiting:$IP
if $isKeyExists is 1
    $times = INCR rate.limiting:$IP
    if $times > 100
        print 訪問頻率超過限制,請稍后再試
        exit
else
    MULTI
    INCR rate.limiting:$IP
    EXPIRE rate.limiting:$IP
    EXEC

方法一有一個(gè)bug樊展,即在同一分鐘的最后一秒訪問9次呻纹,在下一分鐘的第一秒訪問了10次堆生,這相當(dāng)于在2s的時(shí)間內(nèi)訪問了19次。因此我們提出方法二雷酪;

# 限制每分鐘訪問次數(shù)不超過10
$listLength = LLEN rate.limiting:$IP
if $ilstLength < 10
    LPUSH rate.limiting:$IP now()
else
    $time = LINDEX rate.limiting:$IP -1
    if now()-$time < 60
        print 訪問頻率超過限制
    else
        LPUSH rate.limiting:$IP now()
        LTRIM rate.limiting:$IP 0 9

方法二適用于限制次數(shù)較小的情況淑仆,不然會占用較多的空間。

實(shí)現(xiàn)緩存

為了提高網(wǎng)站的負(fù)載能力太闺,需要將一些請求頻率較高糯景,但是對CPU或者IO資源消耗比較大的操作的結(jié)果緩存起來嘁圈,并設(shè)置一段時(shí)間自動過期

下例為學(xué)生排名的一個(gè)緩存?zhèn)未a

$rank = GET cache:rank
if not rank
    $rank = 計(jì)算排名……
    MULTI
    SET cache:rank $rank
    EXPIRE cache:rank 7200
    EXEC

當(dāng)內(nèi)存有限省骂,如果大量使用緩存key并且緩存時(shí)間過長會導(dǎo)致redis占滿內(nèi)存;另一方面最住,如果為了防止redis占滿內(nèi)存而設(shè)置了較短的生存時(shí)間钞澳,那么就可能導(dǎo)致緩存命中率過低并且大量內(nèi)存閑置。為緩存設(shè)置合理的生存時(shí)間是很困難的涨缚,因此轧粟,可以限制redis可以使用的最大內(nèi)存,并讓redis按照規(guī)則淘汰不需要的緩存鍵脓魏,這種方式在只將redis用作緩存系統(tǒng)時(shí)非常實(shí)用兰吟。

具體的設(shè)置方法為:

修改配置文件的maxmemory參數(shù),限制redis最大可用內(nèi)存的大忻琛(單位是字節(jié))混蔼,當(dāng)超過這個(gè)限制Redis會根據(jù)maxmemory-policy參數(shù)來指定相應(yīng)的策略來刪除不需要的key直到Redis占用內(nèi)存小于指定閾值。

maxmemory-policy 支持的規(guī)則:

其中LRU指(least recently used)即最近最少使用珊燎,其認(rèn)為最近最少使用的key在未來一段時(shí)間也不會被用到惭嚣,當(dāng)需要空間時(shí),是可以被刪除的悔政。

規(guī)則 說明
volatile-lru 使用LRU算法刪除一個(gè)設(shè)置了過期時(shí)間的key
allkeys-lru 使用LRU算法刪除一個(gè)key
volatile-random 隨機(jī)刪除一個(gè)設(shè)置了過期時(shí)間的key
allkeys-random 隨機(jī)刪除一個(gè)key
volatile-ttl 刪除過期時(shí)間最近的一個(gè)key
noeviction 不刪除key晚吞,只報(bào)錯(cuò)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市谋国,隨后出現(xiàn)的幾起案子槽地,更是在濱河造成了極大的恐慌,老刑警劉巖芦瘾,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捌蚊,死亡現(xiàn)場離奇詭異,居然都是意外死亡旅急,警方通過查閱死者的電腦和手機(jī)逢勾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來藐吮,“玉大人溺拱,你說我怎么就攤上這事逃贝。” “怎么了迫摔?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵沐扳,是天一觀的道長。 經(jīng)常有香客問我句占,道長沪摄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任纱烘,我火速辦了婚禮杨拐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘擂啥。我一直安慰自己哄陶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布哺壶。 她就那樣靜靜地躺著屋吨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪山宾。 梳的紋絲不亂的頭發(fā)上至扰,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機(jī)與錄音资锰,去河邊找鬼敢课。 笑死,一個(gè)胖子當(dāng)著我的面吹牛台妆,可吹牛的內(nèi)容都是我干的翎猛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼接剩,長吁一口氣:“原來是場噩夢啊……” “哼切厘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起懊缺,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤疫稿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后鹃两,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體遗座,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年俊扳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了途蒋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡馋记,死狀恐怖号坡,靈堂內(nèi)的尸體忽然破棺而出懊烤,到底是詐尸還是另有隱情,我是刑警寧澤宽堆,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布腌紧,位于F島的核電站,受9級特大地震影響畜隶,放射性物質(zhì)發(fā)生泄漏壁肋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一籽慢、第九天 我趴在偏房一處隱蔽的房頂上張望浸遗。 院中可真熱鬧,春花似錦嗡综、人聲如沸乙帮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至驾茴,卻和暖如春盼樟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锈至。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工晨缴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人峡捡。 一個(gè)月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓击碗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親们拙。 傳聞我的和親對象是個(gè)殘疾皇子稍途,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容