KEY
返回所有滿?樣式(pattern)的key。?持如下統(tǒng)配樣式。
- h?llo 匹配 hello , hallo 和 hxllo
- h*llo 匹配 hllo 和 heeeello
- h[ae]llo 匹配 hello 和 hallo 但不匹配 hillo
- h[^e]llo 匹配 hallo , hbllo ,…但不匹配 hello
- h[a-b]llo 匹配 hallo 和 hbllo
語(yǔ)法:
KEYS pattern
時(shí)間復(fù)雜度:O(N)
返回值:匹配pattern的所有key。
?例:
redis> MSET firstname Jack lastname Stuntman age 35
"OK"
redis> KEYS *name*
1) "firstname"
2) "lastname"
redis> KEYS a??
1) "age"
redis> KEYS *
1) "age"
2) "firstname"
3) "lastname"
EXISTS
判斷某個(gè)key是否存在。
語(yǔ)法:
EXISTS key [key ...]
時(shí)間復(fù)雜度:O(1)
返回值:key存在的個(gè)數(shù)。
?例:
redis> SET key1 "Hello"
"OK"
redis> EXISTS key1
(integer) 1
redis> EXISTS nosuchkey
(integer) 0
redis> SET key2 "World"
"OK"
redis> EXISTS key1 key2 nosuchkey
(integer) 2
貼士:一個(gè)exists語(yǔ)句就是一次網(wǎng)絡(luò)請(qǐng)求響應(yīng),因此盡量用一個(gè)exists語(yǔ)句來(lái)判斷多個(gè)key是否存在。
DEL
刪除指定的key。
語(yǔ)法:
DEL key [key ...]
時(shí)間復(fù)雜度:O(1)
返回值:刪除掉的key的個(gè)數(shù)。
?例:
redis> SET key1 "Hello"
"OK"
redis> SET key2 "World"
"OK"
redis> DEL key1 key2 key3
(integer) 2
EXPIRE
為指定的key添加秒級(jí)的過(guò)期時(shí)間
語(yǔ)法:
EXPIRE key seconds
時(shí)間復(fù)雜度:O(1)
返回值:1表?設(shè)置成功。0表?設(shè)置失敗
實(shí)例:
我們不設(shè)置expire它的默認(rèn)有效期是永久,即ttl后會(huì)返回-1代表永久有效。
TTL
獲取指定key的過(guò)期時(shí)間,秒級(jí)。
語(yǔ)法:
TTL key
時(shí)間復(fù)雜度:O(1)
返回值:剩余過(guò)期時(shí)間。-1表?沒(méi)有關(guān)聯(lián)過(guò)期時(shí)間,-2表?key不存在。
實(shí)例:
EXPIRE和TTL命令都有對(duì)應(yīng)的?持毫秒為單位的版本:PEXPIRE和PTTL
Redis的key過(guò)期策略
一個(gè)redis中可能同時(shí)存在很多很多key. 這些key中可能有很大一部分都有過(guò)期時(shí)間. 此時(shí), redis 服務(wù)器咋知道哪些key已經(jīng)過(guò)期要被刪除,哪些key還沒(méi)過(guò)期??
如果直接遍歷所有的key ,顯然是行不通的.效率非常低~~
過(guò)期策略一般有以下三種:
1,定時(shí)過(guò)期
- 每個(gè)設(shè)置過(guò)期時(shí)間的key都需要?jiǎng)?chuàng)建一個(gè)定時(shí)器,到過(guò)期時(shí)間就會(huì)立即清除。該策略可以立即清除過(guò)期的數(shù)據(jù),對(duì)內(nèi)存很友好;但是會(huì)占用大量的CPU資源去處理過(guò)期的數(shù)據(jù),從而影響緩存的響應(yīng)時(shí)間和吞吐量。
2,惰性過(guò)期
- 只有當(dāng)訪問(wèn)一個(gè)key時(shí),才會(huì)判斷該key是否已過(guò)期,過(guò)期則清除。該策略可以最大化地節(jié)省CPU資源,卻對(duì)內(nèi)存非常不友好。極端情況可能出現(xiàn)大量的過(guò)期key沒(méi)有再次被訪問(wèn),從而不會(huì)被清除,占用大量?jī)?nèi)存。
3,定期過(guò)期
- 每隔一定的時(shí)間,會(huì)掃描一定數(shù)量的數(shù)據(jù)庫(kù)的expires字典中一定數(shù)量的key,并清除其中已過(guò)期的key。該策略是前兩者的一個(gè)折中方案。通過(guò)調(diào)整定時(shí)掃描的時(shí)間間隔和每次掃描的限定耗時(shí),可以在不同情況下使得CPU和內(nèi)存資源達(dá)到最優(yōu)的平衡效果。
Redis中同時(shí)使用了惰性過(guò)期和定期過(guò)期兩種過(guò)期策略。
Redis過(guò)期刪除采用的是定期刪除,默認(rèn)是每100ms檢測(cè)一次,遇到過(guò)期的key則進(jìn)行刪除,這里的檢測(cè)并不是順序檢測(cè),而是隨機(jī)檢測(cè)。那這樣會(huì)不會(huì)有漏網(wǎng)之魚(yú)?顯然Redis也考慮到了這一點(diǎn),當(dāng)我們?nèi)プx/寫(xiě)一個(gè)已經(jīng)過(guò)期的key時(shí),會(huì)觸發(fā)Redis的惰性刪除策略,直接會(huì)干掉過(guò)期的key。
為什么不用定時(shí)刪除策略?
定時(shí)刪除,用一個(gè)定時(shí)器來(lái)負(fù)責(zé)監(jiān)視key,過(guò)期則自動(dòng)刪除。雖然內(nèi)存及時(shí)釋放,但是十分消耗CPU資源。在大并發(fā)請(qǐng)求下,CPU要將時(shí)間應(yīng)用在處理請(qǐng)求,而不是刪除key,因此沒(méi)有采用這一策略.
定期刪除+惰性刪除是如何工作的呢?
定期刪除:redis默認(rèn)每個(gè)100ms檢查,是否有過(guò)期的key,有過(guò)期key則刪除。需要說(shuō)明的是,redis不是每個(gè)100ms將所有的key檢查一次,而是隨機(jī)抽取進(jìn)行檢查(如果每隔100ms,全部key進(jìn)行檢查,redis豈不是卡死)。因此,如果只采用定期刪除策略,會(huì)導(dǎo)致很多key到時(shí)間沒(méi)有刪除。
于是,惰性刪除派上用場(chǎng)。也就是說(shuō)在你獲取某個(gè)key的時(shí)候,redis會(huì)檢查一下,這個(gè)key如果設(shè)置了過(guò)期時(shí)間那么是否過(guò)期了?如果過(guò)期了此時(shí)就會(huì)刪除。
采用定期刪除+惰性刪除就沒(méi)其他問(wèn)題了么?
不是的,如果定期刪除沒(méi)刪除key,然后你也沒(méi)即時(shí)去請(qǐng)求key,也就是說(shuō)惰性刪除也沒(méi)生效。這樣,redis的內(nèi)存會(huì)越來(lái)越高。那么就應(yīng)該采用內(nèi)存淘汰機(jī)制。
緩存淘汰 eviction
Redis自身實(shí)現(xiàn)了緩存淘汰
Redis的內(nèi)存淘汰策略是指在Redis的用于緩存的內(nèi)存不足時(shí),怎么處理需要新寫(xiě)入且需要申請(qǐng)額外空間的數(shù)據(jù)。
- noeviction:當(dāng)內(nèi)存不足以容納新寫(xiě)入數(shù)據(jù)時(shí),新寫(xiě)入操作會(huì)報(bào)錯(cuò)。
- allkeys-lru:當(dāng)內(nèi)存不足以容納新寫(xiě)入數(shù)據(jù)時(shí),在鍵空間中,移除最近最少使用的key。
- allkeys-random:當(dāng)內(nèi)存不足以容納新寫(xiě)入數(shù)據(jù)時(shí),在鍵空間中,隨機(jī)移除某個(gè)key。
- volatile-lru:當(dāng)內(nèi)存不足以容納新寫(xiě)入數(shù)據(jù)時(shí),在設(shè)置了過(guò)期時(shí)間的鍵空間中,移除最近最少使用的key。
- volatile-random:當(dāng)內(nèi)存不足以容納新寫(xiě)入數(shù)據(jù)時(shí),在設(shè)置了過(guò)期時(shí)間的鍵空間中,隨機(jī)移除某個(gè)key。
- volatile-ttl:當(dāng)內(nèi)存不足以容納新寫(xiě)入數(shù)據(jù)時(shí),在設(shè)置了過(guò)期時(shí)間的鍵空間中,有更早過(guò)期時(shí)間的key優(yōu)先移除。
- redis 4.x 后支持LFU策略,最少頻率使用,allkeys-lfu,volatile-lfu
TYPE
返回key對(duì)應(yīng)value的數(shù)據(jù)類型。
語(yǔ)法:
TYPE key
時(shí)間復(fù)雜度:O(1)
返回值: none ,string , list , set ,zset ,hash and stream。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-551593.html
redis> SET key1 "value"
"OK"
redis> LPUSH key2 "value"
(integer) 1
redis> SADD key3 "value"
(integer) 1
redis> TYPE key1
"string"
redis> TYPE key2
"list"
redis> TYPE key3
"set"
the end!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-551593.html
到了這里,關(guān)于Redis基本全局命令(含key過(guò)期策略)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!