網(wǎng)站被黑了怎么恢復(fù)重慶企業(yè)站seo
目錄
SET
GET
KEYS?
EXISTS?
DEL
EXPIRE?
TTL?
?redis中的過(guò)期策略是怎么實(shí)現(xiàn)的(面試)
上文介紹reids的安裝以及基本概念,本章節(jié)主要介紹?Redis的基本使用命令的使用
Redis 是一個(gè)基于鍵值對(duì)(KEY - VALUE)存儲(chǔ)的高性能數(shù)據(jù)庫(kù)。在這種存儲(chǔ)模式下,數(shù)據(jù)以鍵(KEY)和值(VALUE)的形式進(jìn)行組織和存儲(chǔ)。
- KEY 是唯一的? 只對(duì)應(yīng) String類型
- 值(VALUE)支持多種數(shù)據(jù)類型(String,Set,Hash,List,Sorted Set.....)
redis中命令不區(qū)分大小寫(xiě)
?進(jìn)入redis中
redis-cli
root@iZbp122ygczhdyhc5r271kZ:~# redis-cli
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379>
SET
SET
命令用于在 Redis 中設(shè)置一個(gè)鍵值對(duì)?;菊Z(yǔ)法是SET key value [
1)set方法
127.0.0.1:6379> set key1 value1
OK
127.0.0.1:6379> set key2 value2
OK
127.0.0.1:6379> set key3 value3
OK
2)過(guò)期時(shí)間設(shè)置(EX 和 PX)?
EX
用于設(shè)置鍵值對(duì)的過(guò)期時(shí)間,單位是秒。
127.0.0.1:6379> set key4 value4 ex 20
OK
127.0.0.1:6379> ttl key4
(integer) 15
ttl查詢剩余多少秒
PX
則是用于設(shè)置過(guò)期時(shí)間,單位是毫秒?
127.0.0.1:6379> set key5 value5 px 5000
OK
127.0.0.1:6379> ttl key5
(integer) 2
3)條件設(shè)置(NX 和 XX)
NX
(Not eXists)表示只有當(dāng)鍵不存在時(shí)才設(shè)置鍵值對(duì)?
127.0.0.1:6379> keys *
1) "key3"
2) "key2"
3) "key1"
127.0.0.1:6379> set key4 value4 nx
OK
127.0.0.1:6379> get key4
1) "value4"
XX
(eXists)與NX
相反,只有當(dāng)鍵已經(jīng)存在時(shí)才設(shè)置鍵值對(duì)。?
GET
GET
命令用于獲取指定鍵(key)對(duì)應(yīng)的的值(value)。如果鍵不存在,GET
命令會(huì)返回nil
。
127.0.0.1:6379> get key1
"value1"
127.0.0.1:6379> get key2
"value2"
127.0.0.1:6379> get key3
"value3"
127.0.0.1:6379> get key4
(nil)
如果存在根據(jù)key值 返回對(duì)應(yīng)的value?
否則將返回一個(gè)空(nil)
KEYS?
- 在 Redis 中,
keys
命令是一個(gè)用于查找符合特定模式(pattern)的鍵(keys)的命令。它返回所有與給定模式匹配的鍵的列表。
通配符介紹
*
:可以匹配任意數(shù)量(包括零個(gè))的字符。例如,keys *
會(huì)返回所有的鍵,因?yàn)樗ヅ淙魏捂I名。而keys user:*
會(huì)返回所有以user:
開(kāi)頭的鍵,像user:1
、user:abc
等都符合這個(gè)模式。?
:匹配一個(gè)任意的字符。例如,keys user:??
會(huì)匹配像user:12
、user:ab
這樣長(zhǎng)度為固定 4 個(gè)字符(user:
加上后面兩個(gè)任意字符)的鍵,因?yàn)?code>?只匹配一個(gè)字符。?
先設(shè)置好一些值,以便演示?
127.0.0.1:6379> set heool 1
OK
127.0.0.1:6379> set hello 2
OK
127.0.0.1:6379> set hllow 3
OK
127.0.0.1:6379> set hallo 4
OK
127.0.0.1:6379> set hhhhhh 5
OK
127.0.0.1:6379> set heool 6
OK
1)?匹配一個(gè)字符?
127.0.0.1:6379> keys h?llo
1) "hallo"
2) "hello"
2)* 匹配0個(gè)或多個(gè)字符?
127.0.0.1:6379> keys h*
1) "hallo"
2) "heool"
3) "hello"
4) "hhhhhh"
5) "hllow"
3)【abcde】只能匹配abcde,別的不行 相當(dāng)與固定選項(xiàng)
127.0.0.1:6379> keys h[ab]llo
1) "hallo"
4)【^e】 只有e匹配不了 其他都可以匹配
127.0.0.1:6379> keys h[^e]*
1) "hallo"
2) "hhhhhh"
3) "hllow"
5)【a-b】可以匹配a-b區(qū)間的字符 包括倆側(cè)
127.0.0.1:6379> keys h[a-e]llo
1) "hallo"
2) "hello"
注意:
KEYS * 慎用
因?yàn)闉榘阉械慕Y(jié)果顯示出來(lái),有可能會(huì)使系統(tǒng)崩潰,導(dǎo)致所有的數(shù)據(jù)丟失
keys的時(shí)間復(fù)雜度:O(N)?
EXISTS?
?在 Redis 中,
exists
命令用于檢查給定的一個(gè)或多個(gè)鍵(keys)是否存在。它返回一個(gè)整數(shù)值,表示給定鍵存在的數(shù)量。語(yǔ)法為
exists key [key...]
。
127.0.0.1:6379> keys *
1) "hallo"
2) "heool"
3) "hello"
4) "hhhhhh"
5) "hllow"
127.0.0.1:6379> exists hallo
(integer) 1
127.0.0.1:6379> exists hallo heool hello
(integer) 3
127.0.0.1:6379> exists a
(integer) 0
如果存在則返回
1
,不存在返回0
。如果同時(shí)檢查多個(gè)鍵,它會(huì)返回存在的鍵的數(shù)量。時(shí)間復(fù)雜度:O(1)
DEL
?
del
命令是 Redis 中用于刪除一個(gè)或多個(gè)鍵(keys)及其對(duì)應(yīng)的值(values)的命令。其語(yǔ)法是del key [key...]
。
127.0.0.1:6379> keys *
1) "hallo"
2) "heool"
3) "hello"
4) "hhhhhh"
5) "hllow"
127.0.0.1:6379> del hallo
(integer) 1
127.0.0.1:6379> del heool dello
(integer) 1
127.0.0.1:6379> del hhhhhh hllow
(integer) 2
127.0.0.1:6379> del a
(integer) 0
如果鍵不存在,
del
命令會(huì)返回0
,表示沒(méi)有鍵被刪除;如果鍵存在并成功刪除,會(huì)返回1
(如果同時(shí)刪除多個(gè)鍵,返回成功刪除的鍵的數(shù)量)。?時(shí)間復(fù)雜度:O(1)
EXPIRE?
在 Redis 中,
expire
命令用于為一個(gè)已經(jīng)存在的鍵(key)設(shè)置過(guò)期時(shí)間。語(yǔ)法為expire key seconds
,其中key
是要設(shè)置過(guò)期時(shí)間的鍵,seconds
是過(guò)期時(shí)間的秒數(shù)。
127.0.0.1:6379> keys *
1) "key3"
2) "hello"
3) "key2"
4) "key1"
127.0.0.1:6379> expire key1 10
(integer) 1
127.0.0.1:6379> ttl key1
(integer) 6
127.0.0.1:6379> get key1
(nil)
?一旦過(guò)期時(shí)間到達(dá),Redis 會(huì)自動(dòng)刪除這個(gè)鍵值對(duì)。
時(shí)間復(fù)雜度:O(1)
TTL?
- 在 Redis 中,
ttl
(Time To Live)命令用于獲取一個(gè)鍵(key)的剩余生存時(shí)間(以秒為單位)。語(yǔ)法是ttl key
。
127.0.0.1:6379> keys *
1) "key3"
2) "hello"
127.0.0.1:6379> expire hello 10
(integer) 1
127.0.0.1:6379> ttl hello
(integer) 6
127.0.0.1:6379> ttl hello
(integer) -2
127.0.0.1:6379> ttl key3
(integer) -1
127.0.0.1:6379> get hello
(nil)
- 例如,對(duì)于一個(gè)已經(jīng)設(shè)置了過(guò)期時(shí)間的鍵,執(zhí)行命令會(huì)返回該鍵剩余的生存時(shí)間秒數(shù)。如果鍵不存在或者沒(méi)有設(shè)置過(guò)期時(shí)間,
ttl
命令返回-1
;如果鍵已經(jīng)過(guò)期,ttl
命令返回-2
。
?redis中的過(guò)期策略是怎么實(shí)現(xiàn)的(面試)
惰性刪除(Lazy Deletion):
- 當(dāng)客戶端訪問(wèn)一個(gè)鍵時(shí),Redis 會(huì)檢查這個(gè)鍵是否已經(jīng)過(guò)期。如果鍵已經(jīng)過(guò)期,那么在執(zhí)行相應(yīng)的操作(如
GET
、SET
等)之前,Redis 會(huì)先刪除這個(gè)過(guò)期的鍵,然后返回鍵不存在的結(jié)果(如nil
)。- 例如,當(dāng)執(zhí)行
GET key
操作時(shí),Redis 內(nèi)部會(huì)有一個(gè)檢查機(jī)制,先判斷鍵是否過(guò)期。如果key
已經(jīng)過(guò)期,Redis 會(huì)執(zhí)行刪除操作,然后返回nil
,就好像這個(gè)鍵從來(lái)不存在一樣。?定期刪除
- Redis 會(huì)定期從設(shè)置了過(guò)期時(shí)間的鍵中隨機(jī)抽取一部分鍵進(jìn)行檢查,將其中過(guò)期的鍵刪除。這個(gè)檢查過(guò)程是在 Redis 的內(nèi)部循環(huán)事件(Event Loop)中進(jìn)行的,有一定的時(shí)間間隔和檢查數(shù)量限制。
- 具體來(lái)說(shuō),Redis 會(huì)使用一個(gè)近似的 LRU(Least Recently Used)算法來(lái)確定要檢查的鍵。它會(huì)維護(hù)一個(gè)過(guò)期鍵的樣本池,每次從這個(gè)樣本池中抽取一定比例的鍵進(jìn)行檢查。例如,可能會(huì)每次抽取 100 個(gè)鍵進(jìn)行檢查,發(fā)現(xiàn)過(guò)期的鍵就立即刪除。
Redis 過(guò)期策略的綜合應(yīng)用
- 在實(shí)際的 Redis 應(yīng)用中,惰性刪除和定期刪除是結(jié)合使用的。這種綜合策略的目的是在保證內(nèi)存使用效率的同時(shí),盡量減少對(duì)系統(tǒng)性能的影響。
- 例如,對(duì)于一個(gè)高流量的緩存系統(tǒng),大部分時(shí)間依靠惰性刪除來(lái)處理過(guò)期鍵,因?yàn)榫彺鏀?shù)據(jù)通常是頻繁訪問(wèn)的,過(guò)期鍵在被訪問(wèn)時(shí)能夠及時(shí)被刪除。同時(shí),定期刪除機(jī)制會(huì)在后臺(tái)默默地工作,定期清理那些長(zhǎng)時(shí)間未被訪問(wèn)的過(guò)期鍵,以防止內(nèi)存占用過(guò)多。通過(guò)這種方式,Redis 能夠在高效利用內(nèi)存和提供高性能服務(wù)之間取得平衡。
結(jié)語(yǔ):?寫(xiě)博客不僅僅是為了分享學(xué)習(xí)經(jīng)歷,同時(shí)這也有利于我鞏固知識(shí)點(diǎn),總結(jié)該知識(shí)點(diǎn),由于作者水平有限,對(duì)文章有任何問(wèn)題的還請(qǐng)指出,接受大家的批評(píng),讓我改進(jìn)。同時(shí)也希望讀者們不吝嗇你們的點(diǎn)贊+收藏+關(guān)注,你們的鼓勵(lì)是我創(chuàng)作的最大動(dòng)力!?