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ò) |