溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何在Redis命令中使用Keys

發(fā)布時(shí)間:2021-05-26 10:28:32 來(lái)源:億速云 閱讀:208 作者:Leah 欄目:數(shù)據(jù)庫(kù)

這篇文章給大家介紹如何在Redis命令中使用Keys,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

DEL

刪除指定的鍵值對(duì),如果指定的key不存在,則忽略。DEL命令的時(shí)間復(fù)雜度是O(N),對(duì)于除字符串外的其他數(shù)據(jù)類型,命令的時(shí)間復(fù)雜度為O(M),M是值的元素的個(gè)數(shù)。所以,在生產(chǎn)環(huán)境盡量避免一次性刪除過(guò)多復(fù)雜數(shù)據(jù)類型的操作。

127.0.0.1:6379> SET key1 "jackey"
OK
127.0.0.1:6379> SET key2 "zhe"
OK
127.0.0.1:6379> DEL key1 key2 key3
(integer) 2

DUMP

最早可用版本2.6.0

使用一種Redis的格式序列化指定鍵存儲(chǔ)的值??捎檬褂肦ESTORE命令將這個(gè)值反序列化。

這種序列化格式有以下3個(gè)特點(diǎn):

  • 它包含有64位的校驗(yàn)和,用于錯(cuò)誤檢查,RESTORE命令在反序列化之前會(huì)先檢查校驗(yàn)和

  • 值的編碼格式和RDB文件的編碼格式相同

  • RDB的版本會(huì)被序列化到值中,因此,不同版本的Redis可能會(huì)因?yàn)椴患嫒軷DB版本而拒絕反序列化

序列化的值不包含過(guò)期時(shí)間的相關(guān)信息,可以使用PTTL命令獲取當(dāng)前值的存活時(shí)間。如果值不存在則會(huì)返回nil

127.0.0.1:6379> SET key1 "jackey"
OK
127.0.0.1:6379> DUMP key1
"\x00\x06jackey\b\x00\xec\x89'G'X\xfc:"
127.0.0.1:6379> DUMP not-exist-key
(nil)

DUMP時(shí)間復(fù)雜度分為兩部分:訪問(wèn)key值的時(shí)間復(fù)雜度為O(1),而序列化值的時(shí)間復(fù)雜度為O(N*M),N是組成值的元素的數(shù)量,M是元素的平均大小。如果序列化比較短的字符串,則該命令的時(shí)間復(fù)雜度可以看做O(1)。

EXISTS

最早可用版本1.0.0

用于判斷key是否存在。3.0.3版本以后支持多參數(shù),即可以一次性判斷多個(gè)key,返回值是存在的key的數(shù)量。對(duì)于判斷單個(gè)key是否存在,會(huì)返回1或者0,因此,該命令是向后兼容的。

需要注意的是:如果參數(shù)中有重復(fù)的存在命令,則返回結(jié)果不會(huì)去重。

127.0.0.1:6379> SET key1 "jackey"
OK
127.0.0.1:6379> SET key2 "zhe"
OK
127.0.0.1:6379> EXISTS key1
(integer) 1
127.0.0.1:6379> EXISTS not-exist-key
(integer) 0
127.0.0.1:6379> EXISTS key1 key2 not-exist-key
(integer) 2
127.0.0.1:6379> EXISTS key1 key1 key1
(integer) 3

EXPIRE

最早可用版本1.0.0

為指定的key設(shè)置存活時(shí)間。存活時(shí)間會(huì)被DEL,SET,GETSET和所有的STORE命令刪除或者覆蓋。如果我們只修改key的值而不修改存活時(shí)間或者保存到一個(gè)新的key中,則原來(lái)的key的存活時(shí)間保持不變。如果使用RENAME對(duì)一個(gè)key重命名,那么原有key的存活時(shí)間會(huì)賦給新的key。

如果想要清除存活時(shí)間,使指定的key成為一個(gè)永久的key,則可以使用PERSIST命令,我們稍后會(huì)詳細(xì)介紹這個(gè)命令。

如果使用EXPIRE/PEXPIRE為某個(gè)key設(shè)置的存活時(shí)間為非正數(shù),或者使用EXPIREAT/PEXPIREAT設(shè)置了一個(gè)過(guò)去的時(shí)間,則這個(gè)key會(huì)直接被刪除。

127.0.0.1:6379> EXPIRE key1 -1
(integer) 1
127.0.0.1:6379> EXISTS key1
(integer) 0

對(duì)一個(gè)已經(jīng)有存活時(shí)間的key再次使用EXPIRE設(shè)置存活時(shí)間,則將key的存活時(shí)間更新,在許多應(yīng)用中我們都會(huì)用到這一點(diǎn)。

注意:在Redis的2.1.3版本之前,如果修改一個(gè)帶有存活時(shí)間的key的值,則會(huì)刪除整個(gè)key。

關(guān)于時(shí)間精度,Redis2.4版本中,一個(gè)key過(guò)期的一秒內(nèi)仍可以訪問(wèn),而到了2.6版本,這一時(shí)間已經(jīng)被精確到了1毫秒。因?yàn)閺?.6版本開始,存活時(shí)間保存的是絕對(duì)時(shí)間(Unix的時(shí)間戳),而這就意味著,你的計(jì)算機(jī)的時(shí)間需要保證可靠,如果你將RDB文件放到另一臺(tái)機(jī)器上加載,當(dāng)這兩臺(tái)機(jī)器的時(shí)間差距較大時(shí),你就會(huì)發(fā)現(xiàn)可能有些key被刪除了或者有些key的存活時(shí)間被延長(zhǎng)了。

下面我們?cè)趤?lái)討論一下Redis究竟是如何使key過(guò)期的,Redis的過(guò)期策略有兩種:一種是被動(dòng)的,一種是主動(dòng)的。

被動(dòng)過(guò)期就是當(dāng)客戶端訪問(wèn)某個(gè)key,服務(wù)端會(huì)去檢查這個(gè)key的存活時(shí)間,判斷是否過(guò)期。當(dāng)然,這種過(guò)期策略存在一定的問(wèn)題,如果某個(gè)key一直都不訪問(wèn),就不會(huì)被發(fā)現(xiàn)它過(guò)期了,那么它將永遠(yuǎn)“茍活”在內(nèi)存中。所以Redis會(huì)定期隨機(jī)的查看被設(shè)置過(guò)存活時(shí)間的key,看它們是否過(guò)期,如果過(guò)期了,就會(huì)及時(shí)清理掉。Redis每秒會(huì)做10次下面的操作:

  • 隨機(jī)查看20個(gè)設(shè)置過(guò)存活時(shí)間的key(從設(shè)置存活時(shí)間的set中?。?/p>

  • 刪除所有過(guò)期的key

  • 如果過(guò)期的key超過(guò)25%,那么會(huì)從第一步開始再執(zhí)行一次

EXPIREAT

最早可用版本1.2.0

此命令和EXPIRE的作用相同,不同之處是它的參數(shù)需要傳Unix時(shí)間戳(即從1970年1月1日起的毫秒數(shù))。

127.0.0.1:6379> GET key2
"zhe"
127.0.0.1:6379> EXPIREAT key2 1537733374
(integer) 1
127.0.0.1:6379> TTL key2
(integer) 12960

KEYS

最早可用版本1.0.0

這個(gè)命令會(huì)返回匹配到的所有key,時(shí)間復(fù)雜度為O(N)。在官方文檔中說(shuō),在入門級(jí)的筆記本電腦上,Redis掃描100萬(wàn)條key只需要40毫秒,但是我們?nèi)匀灰苊庠谏a(chǎn)環(huán)境使用這個(gè)命令。特別是千萬(wàn)不要使用KEYS *這樣的命令,因?yàn)槟悴恢郎a(chǎn)環(huán)境存在多少key,這樣的命令有可能使你的生產(chǎn)環(huán)境的Redis陷入很長(zhǎng)一段時(shí)間的不可用狀態(tài)。所以,請(qǐng)馬上刪除應(yīng)用層代碼中的KEYS命令或者抓緊時(shí)間更新自己的簡(jiǎn)歷。

如果需要查找key,可以使用SCAN命令或者sets命令。

雖然我們非常不建議使用KEYS命令,但是它的匹配策略還是要介紹一下的:

?是單個(gè)字符的通配符,*是任意個(gè)數(shù)的通配符,[ae]會(huì)匹配到a或e,^e表示不匹配e,a-c表示匹配a或b或c,特殊符號(hào)使用\隔開。

127.0.0.1:6379> MSET key1hello jackey key2hello zhe age 3
OK
127.0.0.1:6379> KEYS key?hello
1) "key1hello"
2) "key2hello"
127.0.0.1:6379> KEYS k*
1) "key1hello"
2) "key2hello"
127.0.0.1:6379> KEYS *age*
1) "age"
127.0.0.1:6379> KEYS *
1) "age"
2) "key1hello"
3) "key2hello"

MIGRATE

最早可用版本2.6.0

這個(gè)命令用來(lái)將源實(shí)例的key以原子操作傳輸?shù)侥繕?biāo)實(shí)例,然后將源實(shí)例的key刪除。相當(dāng)于在源實(shí)例執(zhí)行了DUMP+DEL操作,在目標(biāo)實(shí)例執(zhí)行了RESTORE操作。這一操作會(huì)阻塞進(jìn)行傳輸?shù)膬蓚€(gè)實(shí)例,在傳輸過(guò)程中,key總會(huì)存在于一個(gè)實(shí)例中,除非發(fā)生超時(shí)錯(cuò)誤。在3.2版本以后,MIGRATE可以將多個(gè)key作為管線一次性傳輸。

在執(zhí)行MIGRATE命令時(shí),必須要設(shè)置一個(gè)超時(shí)時(shí)間,如果到了超時(shí)時(shí)間命令仍未執(zhí)行完,則會(huì)拋出一個(gè)IOERR。但返回這個(gè)錯(cuò)誤時(shí),兩個(gè)實(shí)例的狀態(tài)可能有兩種:要么兩個(gè)實(shí)例都存在指定的key,要么只有源實(shí)例存在指定的key??傊琸ey是不會(huì)丟失的。

從3.0.6版本開始,MIGRATE支持一次傳輸多個(gè)key,為了保證不過(guò)載或者出現(xiàn)環(huán)形操作,MIGRATE需要使用KEYS參數(shù),而原來(lái)指定的key的參數(shù)要被設(shè)置為空字符串。

MIGRATE 192.168.1.34 6379 "" 0 5000 KEYS key1 key2 key3

這里還有兩個(gè)選填參數(shù)需要介紹:一個(gè)是COPY,加上這個(gè)參數(shù)的話,傳輸完成后不會(huì)刪除源實(shí)例中的key。另一個(gè)是REPLACE,這個(gè)參數(shù)的作用是替換目標(biāo)實(shí)例已存在的key。這兩個(gè)參數(shù)在3.0版本以后才可以使用。

MOVE

最早可用版本1.0.0

不知道大家還記不記得前文中我們提到過(guò)的SELECT命令,SELECT用來(lái)切換數(shù)據(jù)庫(kù)。使用MOVE命令就是將當(dāng)前數(shù)據(jù)庫(kù)的key移動(dòng)到指定的數(shù)據(jù)庫(kù)中,如果指定庫(kù)中已經(jīng)存在這個(gè)key或者當(dāng)前庫(kù)不存在這個(gè)key,那么這個(gè)命令什么也不做。

127.0.0.1:6379> KEYS *
1) "age"
2) "key1hello"
3) "key2hello"
127.0.0.1:6379> MOVE age 1
(integer) 1
127.0.0.1:6379> KEYS *
1) "key1hello"
2) "key2hello"
127.0.0.1:6379> SELECT 1
OK
127.0.0.1:6379[1]> KEYS *
1) "age"

OBJECT

最早可用版本2.2.3

OBJECT用來(lái)查看Redis對(duì)象內(nèi)部的相關(guān)信息。這一命令在調(diào)試時(shí)經(jīng)常被使用。下面我們來(lái)介紹OBJECT命令的具體用法:

  • OBJECT REFCOUNT key:返回指定key的值的引用數(shù)量

  • OBJECT ENCODING key:返回指定key的內(nèi)部存儲(chǔ)使用的編碼格式

  • OBJECT IDLETIME key:返回指定key的空閑時(shí)間(有多長(zhǎng)時(shí)間沒(méi)有被讀寫),目前最小精度為10秒,這一命令經(jīng)常在Redis淘汰機(jī)制中使用(淘汰策略為L(zhǎng)RU或noeviction)

  • OBJECT FREQ key:返回指定key訪問(wèn)頻率的對(duì)數(shù),當(dāng)淘汰策略為L(zhǎng)FU時(shí),這一命令會(huì)被用到

  • OBJECT HELP:返回幫助信息

對(duì)象的編碼格式也有很多種:

  • Strings會(huì)被編碼為raw或int

  • Lists會(huì)被編碼為ziplist或linkedlist

  • Sets會(huì)被編碼為intset或hashtable

  • Hashs會(huì)被編碼為ziplist或hashtable

  • Sorted Sets會(huì)被編碼為ziplist或skiplist

127.0.0.1:6379> OBJECT REFCOUNT key1hello
(integer) 1
127.0.0.1:6379> OBJECT IDLETIME key2hello
(integer) 3637
127.0.0.1:6379> OBJECT ENCODING age
"int"

PERSIST

最早可用版本2.2.0

刪除指定key的過(guò)期時(shí)間,使之變成永久的key。

PEXPIRE

最早可用版本2.6.0

PEXPIRE的作用和EXPIRE一樣,只不過(guò)參數(shù)中的時(shí)間單位是毫秒。

PEXPIREAT

最早可用版本2.6.0

作用和EXPIREAT相同,參數(shù)同樣是毫秒。

PTTL

最早可用版本2.6.0

返回指定key的剩余存活時(shí)間的毫秒數(shù)。2.8以后的版本返回值有些變化,如果key不存在,則返回-2;如果key是永久的,則返回-1。

RANDOMKEY

最早可用版本1.0.0

此命令用于從當(dāng)前數(shù)據(jù)庫(kù)返回一個(gè)隨機(jī)的key。

RENAME

最早可用版本1.0.0

重命名一個(gè)key。如果key不存在,則會(huì)返回錯(cuò)誤。而如果新的key已經(jīng)存在,則此命令會(huì)覆蓋原來(lái)的key(它其實(shí)是執(zhí)行了一個(gè)隱式的DEL命令,因此如果原來(lái)的key存儲(chǔ)的對(duì)象很大的話, 刪除操作延時(shí)會(huì)很高)。在3.2版本以前,如果源key和目標(biāo)key相同的話,會(huì)報(bào)錯(cuò)。

RENAMENX

如果新的key不存在的話,重命名key,如果存在的話返回0,成功返回1。

RESTORE

最早可用版本2.6.0

用法:RESTORE key ttl serialized-value [REPLACE]

此命令是將一組數(shù)據(jù)反序列化,并存到key。如果ttl是0,則key是永久的。在Redis3.0版本以后,如果不使用REPLACE參數(shù)并且key已經(jīng)存在,則會(huì)返回一個(gè)錯(cuò)誤“Target key name is busy”。

SCAN

最早可用版本2.8.0

用法:SCAN cursor MATCH pattern COUNT count

其中cursor為游標(biāo),MATCH和COUNT為可選參數(shù)。

SCAN命令和SSCAN、HSCAN、ZSCAN命令都用于增量的迭代元素集,它每次返回小部分?jǐn)?shù)據(jù),不會(huì)像KEYS那樣阻塞Redis。SCAN命令是基于游標(biāo)的,每次調(diào)用后,都會(huì)返回一個(gè)游標(biāo),用于下一次迭代。當(dāng)游標(biāo)返回0時(shí),表示迭代結(jié)束。

SCAN每次返回的數(shù)量并不固定,也有可能返回?cái)?shù)據(jù)為空。另外,SCAN命令和KEYS命令一樣支持匹配。

我們?cè)赗edis里存入10000個(gè)key用于測(cè)試。

結(jié)果如下:

127.0.0.1:6379> scan 0 match key24* count 1000
1) "1688"
2) 1) "key2411"
 2) "key2475"
 3) "key2494"
 4) "key2406"
 5) "key2478"
127.0.0.1:6379> scan 1688 match key24* count 1000
1) "2444"
2) 1) "key2458"
 2) "key249"
 3) "key2407"
 4) "key2434"
 5) "key241"
 6) "key2497"
 7) "key2435"
 8) "key2413"
 9) "key2421"
 10) "key248"
127.0.0.1:6379> scan 2444 match key24* count 1000
1) "818"
2) 1) "key2459"
 2) "key2462"
 3) "key2409"
 4) "key2454"
 5) "key2431"
 6) "key2423"
 7) "key2476"
 8) "key2428"
 9) "key2493"
 10) "key2420"
127.0.0.1:6379> scan 818 match key24* count 1000
1) "9190"
2) 1) "key2402"
 2) "key2415"
 3) "key2429"
 4) "key2424"
 5) "key2425"
 6) "key2400"
 7) "key2472"
 8) "key2479"
 9) "key2448"
 10) "key245"
 11) "key2487"
 12) "key2430"
 13) "key2405"
127.0.0.1:6379> scan 9190 match key24* count 1000
1) "12161"
2) 1) "key2488"
 2) "key2437"
 3) "key2404"
 4) "key2440"
 5) "key2461"
 6) "key2416"
 7) "key2436"
 8) "key2403"
 9) "key2460"
 10) "key2452"
 11) "key2449"
 12) "key2482"
127.0.0.1:6379> scan 12161 match key24* count 1000
1) "11993"
2) 1) "key2483"
 2) "key2491"
 3) "key242"
 4) "key2466"
 5) "key2446"
 6) "key2465"
 7) "key243"
 8) "key2438"
 9) "key2457"
 10) "key246"
 11) "key2422"
 12) "key2418"
127.0.0.1:6379> scan 11993 match key24* count 1000
1) "7853"
2) 1) "key2498"
 2) "key2451"
 3) "key2439"
 4) "key2495"
 5) "key2408"
 6) "key2410"
127.0.0.1:6379> scan 7853 match key24* count 1000
1) "5875"
2) 1) "key2486"
 2) "key2490"
 3) "key244"
 4) "key2401"
 5) "key2463"
 6) "key2481"
 7) "key2477"
 8) "key2468"
 9) "key2433"
 10) "key2489"
 11) "key2455"
 12) "key2426"
 13) "key24"
 14) "key2450"
 15) "key2414"
 16) "key2442"
 17) "key2473"
 18) "key2467"
 19) "key2469"
 20) "key2456"
127.0.0.1:6379> scan 5875 match key24* count 1000
1) "14311"
2) 1) "key2453"
 2) "key2492"
 3) "key2480"
 4) "key2427"
 5) "key2443"
 6) "key2417"
 7) "key2432"
 8) "key240"
 9) "key2445"
 10) "key2484"
 11) "key2444"
 12) "key247"
 13) "key2485"
127.0.0.1:6379> scan 14311 match key24* count 1000
1) "16383"
2) 1) "key2441"
 2) "key2474"
 3) "key2447"
 4) "key2471"
 5) "key2470"
 6) "key2464"
 7) "key2412"
 8) "key2419"
 9) "key2499"
 10) "key2496"
127.0.0.1:6379> scan 16383 match key24* count 1000
1) "0"
2) (empty list or set)

可以看到雖然我們?cè)O(shè)置的count為1000,但Redis每次返回的數(shù)值只有10個(gè)左右。

SORT

最早可用版本1.0.0

當(dāng)有N個(gè)元素需要排序,并且要返回M個(gè)元素時(shí),SORT命令的時(shí)間復(fù)雜度為O(N+M*log(M))

此命令用于返回或保存list,set和sorted set的鍵,默認(rèn)將數(shù)字或者可排序的key進(jìn)行排序,Redis會(huì)將其視為雙精度浮點(diǎn)數(shù)。

如果想要對(duì)字符串按字典順序排序,可以使用ALPHA參數(shù)。

如果想要按照外部字段進(jìn)行排序,可以使用BY參數(shù)。

TOUCH

最早可用版本3.2.1

修改某一個(gè)或多個(gè)key的最后訪問(wèn)時(shí)間,如果key不存在,則忽略。

TTL

最早可用版本1.0.0

返回指定key的剩余存活時(shí)間,單位為秒。

在2.6版本及以前,如果key不存在或者是永久key,都會(huì)返回-1。從2.8版本開始,如果key不存在,則返回-2,如果key為永久key,則返回-1。

TYPE

最早可用版本1.0.0

返回key存儲(chǔ)的值的類型。類型即為我們?cè)赗edis基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)一文中描述的5中數(shù)據(jù)類型。

String

String是最基本的,也是最常用的類型。它是二進(jìn)制安全的,也就是說(shuō),我們可以將對(duì)象序列化成json字符串作為value值存入Redis。在分配內(nèi)存時(shí),Redis會(huì)為一個(gè)字符串分配一些冗余的空間,以避免因字符串的值改變而出現(xiàn)頻繁的內(nèi)存分配操作。當(dāng)字符串長(zhǎng)度小于1M時(shí),每次擴(kuò)容都會(huì)加倍現(xiàn)有空間,當(dāng)長(zhǎng)度大于1M時(shí),每次擴(kuò)容,增加1M,Redis字符串的最大長(zhǎng)度是512M。

Hash

Hash是鍵值對(duì)集合,相當(dāng)于Java中的HashMap,實(shí)際結(jié)構(gòu)也和HashMap一樣,是數(shù)組+鏈表的結(jié)構(gòu)。所不同的是擴(kuò)容的方式不同,HashMap是進(jìn)行一次rehash,而Redis為了不阻塞服務(wù),會(huì)創(chuàng)建一個(gè)新的數(shù)組,在查詢時(shí)會(huì)同時(shí)查詢兩個(gè)Hash,然后在逐漸將舊的Hash內(nèi)容轉(zhuǎn)移到新的中去。一個(gè)Hash最大可以存儲(chǔ)232-1個(gè)鍵值對(duì)。

List

List相當(dāng)于Java中的LinkedList,它的插入和刪除操作的時(shí)間復(fù)雜度為O(1),而查詢操作的時(shí)間復(fù)雜度為O(n)。我們可以利用List的rpush、rpop、lpush和lpop命令來(lái)構(gòu)建隊(duì)列或者棧。列表最多可以存儲(chǔ)232-1個(gè)元素。

Set

Set是String類型的無(wú)序集合,并且元素唯一,相當(dāng)于Java中的HashSet,它的插入、刪除、查詢操作的時(shí)間復(fù)雜度都是O(1)。其最大元素?cái)?shù)也是232-1個(gè)。

zset

zset可以看做是Java中SortedSet和HashMap的結(jié)合,一方面它不允許元素重復(fù),另一方面,它通過(guò)score為每個(gè)元素進(jìn)行排序。

UNLINK

最早可用版本4.0.0

這個(gè)命令和DEL類似,會(huì)刪除指定的key。所不同的是,此命令的時(shí)間復(fù)雜度為O(1),它先將key從keyspace中刪除,此時(shí)指定的key已經(jīng)刪除,但是內(nèi)存沒(méi)有釋放。所以,這個(gè)命令會(huì)在另一個(gè)線程中做釋放內(nèi)存的操作。這一步的操作時(shí)間復(fù)雜度為O(N)。

WAIT

最早可用版本3.0.0

這個(gè)命令會(huì)阻塞客戶端,直到前面所有的寫操作都完成并且保存了指定數(shù)量的副本。該命令總會(huì)返回副本數(shù)量或者超時(shí)。

關(guān)于如何在Redis命令中使用Keys就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI