動態(tài)網(wǎng)站制作視頻教程軟件優(yōu)化
目錄
- Redis通用命令
- Redis中最核心的兩個命令
- get
- set
- Redis全局命令
- keys
- 語法
- 注意事項
- exists
- del(delete)
- expire
- ttl
- redis的key的過期策略是怎么實現(xiàn)的?
- 了解拓展
- type
- 總結(jié)
Redis通用命令
Redis的命令非常非常多,所以
1. 掌握常用命令(多操作練習(xí))
2. 學(xué)會使用Redis的文檔
Redis官方鏈接
Redis中最核心的兩個命令
get
根據(jù)key來取value
set
把key和value存儲進(jìn)去
key和value本質(zhì)都是字符串
必須要進(jìn)入redis客戶端才能執(zhí)行redis命令
set key value
redis中的命令不區(qū)分大小寫
get key
get命令直接輸入key就能得到value,如果當(dāng)前key不存在,會返回一個nui 和 null/NULL是一個意思
Redis全局命令
Redis支持很多種數(shù)據(jù)結(jié)構(gòu),整體來說Redis是鍵值對結(jié)構(gòu),key固定就是字符串,value實際上會有很多種類型(常用的有 字符串,哈希表,列表,集合,有序集合)————操作不同的數(shù)據(jù)結(jié)構(gòu),就會有不同的命令
全局命令,就是能夠任意搭配任意一個數(shù)據(jù)結(jié)構(gòu)來使用的命令
keys
用來查詢當(dāng)前服務(wù)器上匹配的key,通過一些特殊符號(通配符)來描述key的模樣,匹配上述模樣的key就能被查詢出來
語法
keys pattern/*pattern 用來描述另外的字符串是長什么樣的
具體寫法,支持那些通配符?
1. ? 匹配任意一個字符
2. * 匹配0個或者多個任意字符
3. [abcde] 只能匹配到a,b,c,d,e
4. [^e] 排除e,只有e匹配不了,其他的都能匹配
5. [a-b] 匹配a-b這個范圍內(nèi)的字符,包含兩側(cè)邊界
*/
-
? 匹配任意一個字符
-
*** ** 匹配0個或者多個任意字符
-
[abcde] 只能匹配到a,b,c,d,e
-
[^e] 排除e,只有e匹配不了,其他的都能匹配
-
[a-b] 匹配a-b這個范圍內(nèi)的字符,包含兩側(cè)邊界
注意事項
keys的時間復(fù)雜度為O(n),所以,在生產(chǎn)環(huán)境上,一般都會禁止使用keys命令,尤其是keys
生產(chǎn)環(huán)境上的keys可能會非常的多,而redis是一個單線程的服務(wù)器,執(zhí)行keys*的時間非常長,就導(dǎo)致redis服務(wù)器被阻塞了,無法給其他客戶端提供服務(wù)
redis經(jīng)常會用于做緩存,擋在mysql的前面,玩意Redis被一個kesy*阻塞住,此時其他的redis操作就超時了,此時這些請求就會直接查數(shù)據(jù)庫,突然有一大波請求過來,mysql措手不及,就容易掛,從而導(dǎo)致整個系統(tǒng)直接癱瘓
exists
EXISTS key [key ...] 判斷某個key是否存在
返回值:key存在的個數(shù)。 針對多個key來說是非常有用的
時間復(fù)雜度 O(1) ————> redis組織這些key就是按照哈希表的方式來組織的 相當(dāng)于unordered_map<key,value>
del(delete)
DEL key [key ...] 刪除指定的key,可以一次刪除一個或者多個在之前學(xué)mysql的時候,刪除類的操作,就很危險,一旦刪除了之后,數(shù)據(jù)局就沒了
但是redis主要的應(yīng)用場景,就是作為緩存,此時 redis里存的只是熱點數(shù)據(jù)
全量數(shù)據(jù)存在mysql數(shù)據(jù)庫中,此時如果把redis中的key刪除了幾個,一般來說問題不大
如果把redis作為數(shù)據(jù)庫,此時誤刪數(shù)據(jù)影響就大了
expire
EXPIRE key seconds
時間復(fù)雜度 O(1)
返回值:1表示成功,0表示設(shè)置失敗
設(shè)置毫秒: pexpire key ms
作用是給指定的key設(shè)置過期時間,key存活時間超出這個指定的值,就會被自動刪除
比如手機(jī)驗證碼,幾分鐘內(nèi)有效,就可以用到,還有外賣優(yōu)惠券,在指定時間之內(nèi)有效等
ttl
TTL key
獲取指定的過期時間
返回值:剩余的過期時間。 -1表示沒有關(guān)聯(lián)過期時間,-2表示key不存在
redis的key的過期策略是怎么實現(xiàn)的?
一個redis中可能同時存在很多很多key,這些key中可能有很大一部分都有過期時間,此時,redis服務(wù)器咋知道哪些key已經(jīng)過期要被刪除,哪些key還沒過期?
如果直接遍歷所有的key,顯然是行不通的,效率非常低
Redis整體的策略是:
-
定期刪除
-
? +
-
惰性刪除
- 什么叫惰性刪除,假設(shè)這個key已經(jīng)到時間了,但是暫時還沒刪除它,key還存在,緊接著后面又一次訪問正好用到了這個key,于是這次訪問會讓redis服務(wù)器觸發(fā)刪除key的操作,同時返回一個nil——————感覺這種方式有點像單例模式里的懶漢模式
- 為什么對于定期刪除的時間,有明確的要求? 因為redis是單線程的程序,如果掃描過期key消耗的時間太長,正常處理請求命令就被阻塞了
- 雖然有了這兩種策略結(jié)合,但是整體效果一般,仍然會有很多過期的key殘留,沒有及時刪除掉,所以redis為了對上述進(jìn)行補(bǔ)充,還提供了一系列的內(nèi)存淘汰策略
了解拓展
定時刪除:設(shè)置定時器,在時間到了之后,對其刪除。
- redis中并沒有采取定時器的方式來實現(xiàn)過期key的刪除,所以定期刪除和定時器并沒有關(guān)系
定時器:在某個時間到達(dá)之后,執(zhí)行指定的任務(wù)
實現(xiàn)方式:
- 基于優(yōu)先級隊列/堆
在redis過期key的場景中,就可以通過“過期時間越早,優(yōu)先級越高”,過期時間早的,先出隊列。也就意味著,此時定時器中只要分配一個線程,讓這個線程去檢查隊首元素,看是否過期即可,如果隊首元素還沒過期,后續(xù)元素一定沒有過期。掃描線程不需要遍歷所有的key,只盯住這一個隊首元素即可;另外在掃描線程檢查隊首元素過期時間的時候,也不能檢查的太頻繁,此時做法就可以根據(jù)當(dāng)前時刻和隊首元素的過期時間,設(shè)置一個等待時間,等時間差不多到了,系統(tǒng)再喚醒在這個線程?!?gt;此時掃描線程不需要高頻掃描隊首元素,把CPU的開銷也省了下來。
- 基于時間輪實現(xiàn)的定時器
把時間劃分成很多小段,沒小段上都掛著一個鏈表,每個鏈表都代表一個要執(zhí)行的任務(wù)(相當(dāng)于一個函數(shù)指針),每次走到一個格子,就會把這個格子上的鏈表的任務(wù)嘗試執(zhí)行以下。
Redis并沒有采取上述的方案
type
語法:TYPE key
時間復(fù)雜度:O(1)
返回值:key對應(yīng)的vualue的數(shù)據(jù)類型[none,string,list,set,zset,hash,stream,...]
總結(jié)
- keys:用來查看匹配規(guī)則的key
- exists:用來判定指定key是否存在
- del:刪除指定的key
- expire:給key設(shè)置過期時間
- ttl:查詢key的過期時間
- type:查詢key對應(yīng)的value的類型