共計 8483 個字符,預計需要花費 22 分鐘才能閱讀完成。
自動寫代碼機器人,免費開通
這篇文章給大家介紹如何在 Redis 命令中使用 Keys,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
DEL
刪除指定的鍵值對,如果指定的 key 不存在,則忽略。DEL 命令的時間復雜度是 O(N),對于除字符串外的其他數據類型,命令的時間復雜度為 O(M),M 是值的元素的個數。所以,在生產環境盡量避免一次性刪除過多復雜數據類型的操作。
127.0.0.1:6379 SET key1 jackey
127.0.0.1:6379 SET key2 zhe
127.0.0.1:6379 DEL key1 key2 key3
(integer) 2
DUMP
最早可用版本 2.6.0
使用一種 Redis 的格式序列化指定鍵存儲的值??捎檬褂?RESTORE 命令將這個值反序列化。
這種序列化格式有以下 3 個特點:
它包含有 64 位的校驗和,用于錯誤檢查,RESTORE 命令在反序列化之前會先檢查校驗和
值的編碼格式和 RDB 文件的編碼格式相同
RDB 的版本會被序列化到值中,因此,不同版本的 Redis 可能會因為不兼容 RDB 版本而拒絕反序列化
序列化的值不包含過期時間的相關信息,可以使用 PTTL 命令獲取當前值的存活時間。如果值不存在則會返回 nil
127.0.0.1:6379 SET key1 jackey
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 時間復雜度分為兩部分:訪問 key 值的時間復雜度為 O(1),而序列化值的時間復雜度為 O(N*M),N 是組成值的元素的數量,M 是元素的平均大小。如果序列化比較短的字符串,則該命令的時間復雜度可以看做 O(1)。
EXISTS
最早可用版本 1.0.0
用于判斷 key 是否存在。3.0.3 版本以后支持多參數,即可以一次性判斷多個 key,返回值是存在的 key 的數量。對于判斷單個 key 是否存在,會返回 1 或者 0,因此,該命令是向后兼容的。
需要注意的是:如果參數中有重復的存在命令,則返回結果不會去重。
127.0.0.1:6379 SET key1 jackey
127.0.0.1:6379 SET key2 zhe
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 設置存活時間。存活時間會被 DEL,SET,GETSET 和所有的 STORE 命令刪除或者覆蓋。如果我們只修改 key 的值而不修改存活時間或者保存到一個新的 key 中,則原來的 key 的存活時間保持不變。如果使用 RENAME 對一個 key 重命名,那么原有 key 的存活時間會賦給新的 key。
如果想要清除存活時間,使指定的 key 成為一個永久的 key,則可以使用 PERSIST 命令,我們稍后會詳細介紹這個命令。
如果使用 EXPIRE/PEXPIRE 為某個 key 設置的存活時間為非正數,或者使用 EXPIREAT/PEXPIREAT 設置了一個過去的時間,則這個 key 會直接被刪除。
127.0.0.1:6379 EXPIRE key1 -1
(integer) 1
127.0.0.1:6379 EXISTS key1
(integer) 0
對一個已經有存活時間的 key 再次使用 EXPIRE 設置存活時間,則將 key 的存活時間更新,在許多應用中我們都會用到這一點。
注意:在 Redis 的 2.1.3 版本之前,如果修改一個帶有存活時間的 key 的值,則會刪除整個 key。
關于時間精度,Redis2.4 版本中,一個 key 過期的一秒內仍可以訪問,而到了 2.6 版本,這一時間已經被精確到了 1 毫秒。因為從 2.6 版本開始,存活時間保存的是絕對時間(Unix 的時間戳),而這就意味著,你的計算機的時間需要保證可靠,如果你將 RDB 文件放到另一臺機器上加載,當這兩臺機器的時間差距較大時,你就會發現可能有些 key 被刪除了或者有些 key 的存活時間被延長了。
下面我們在來討論一下 Redis 究竟是如何使 key 過期的,Redis 的過期策略有兩種:一種是被動的,一種是主動的。
被動過期就是當客戶端訪問某個 key,服務端會去檢查這個 key 的存活時間,判斷是否過期。當然,這種過期策略存在一定的問題,如果某個 key 一直都不訪問,就不會被發現它過期了,那么它將永遠“茍活”在內存中。所以 Redis 會定期隨機的查看被設置過存活時間的 key,看它們是否過期,如果過期了,就會及時清理掉。Redis 每秒會做 10 次下面的操作:
隨機查看 20 個設置過存活時間的 key(從設置存活時間的 set 中?。?/p>
刪除所有過期的 key
如果過期的 key 超過 25%,那么會從第一步開始再執行一次
EXPIREAT
最早可用版本 1.2.0
此命令和 EXPIRE 的作用相同,不同之處是它的參數需要傳 Unix 時間戳(即從 1970 年 1 月 1 日起的毫秒數)。
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
這個命令會返回匹配到的所有 key,時間復雜度為 O(N)。在官方文檔中說,在入門級的筆記本電腦上,Redis 掃描 100 萬條 key 只需要 40 毫秒,但是我們仍然要避免在生產環境使用這個命令。特別是千萬不要使用 KEYS * 這樣的命令,因為你不知道生產環境存在多少 key,這樣的命令有可能使你的生產環境的 Redis 陷入很長一段時間的不可用狀態。所以,請馬上刪除應用層代碼中的 KEYS 命令或者抓緊時間更新自己的簡歷。
如果需要查找 key,可以使用 SCAN 命令或者 sets 命令。
雖然我們非常不建議使用 KEYS 命令,但是它的匹配策略還是要介紹一下的:
?是單個字符的通配符,* 是任意個數的通配符,[ae] 會匹配到 a 或 e,^e 表示不匹配 e,a- c 表示匹配 a 或 b 或 c,特殊符號使用 \ 隔開。
127.0.0.1:6379 MSET key1hello jackey key2hello zhe age 3
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
這個命令用來將源實例的 key 以原子操作傳輸到目標實例,然后將源實例的 key 刪除。相當于在源實例執行了 DUMP+DEL 操作,在目標實例執行了 RESTORE 操作。這一操作會阻塞進行傳輸的兩個實例,在傳輸過程中,key 總會存在于一個實例中,除非發生超時錯誤。在 3.2 版本以后,MIGRATE 可以將多個 key 作為管線一次性傳輸。
在執行 MIGRATE 命令時,必須要設置一個超時時間,如果到了超時時間命令仍未執行完,則會拋出一個 IOERR。但返回這個錯誤時,兩個實例的狀態可能有兩種:要么兩個實例都存在指定的 key,要么只有源實例存在指定的 key??傊琸ey 是不會丟失的。
從 3.0.6 版本開始,MIGRATE 支持一次傳輸多個 key,為了保證不過載或者出現環形操作,MIGRATE 需要使用 KEYS 參數,而原來指定的 key 的參數要被設置為空字符串。
MIGRATE 192.168.1.34 6379 0 5000 KEYS key1 key2 key3
這里還有兩個選填參數需要介紹:一個是 COPY,加上這個參數的話,傳輸完成后不會刪除源實例中的 key。另一個是 REPLACE,這個參數的作用是替換目標實例已存在的 key。這兩個參數在 3.0 版本以后才可以使用。
MOVE
最早可用版本 1.0.0
不知道大家還記不記得前文中我們提到過的 SELECT 命令,SELECT 用來切換數據庫。使用 MOVE 命令就是將當前數據庫的 key 移動到指定的數據庫中,如果指定庫中已經存在這個 key 或者當前庫不存在這個 key,那么這個命令什么也不做。
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
127.0.0.1:6379[1] KEYS *
1) age
OBJECT
最早可用版本 2.2.3
OBJECT 用來查看 Redis 對象內部的相關信息。這一命令在調試時經常被使用。下面我們來介紹 OBJECT 命令的具體用法:
OBJECT REFCOUNT key:返回指定 key 的值的引用數量
OBJECT ENCODING key:返回指定 key 的內部存儲使用的編碼格式
OBJECT IDLETIME key:返回指定 key 的空閑時間(有多長時間沒有被讀寫),目前最小精度為 10 秒,這一命令經常在 Redis 淘汰機制中使用(淘汰策略為 LRU 或 noeviction)
OBJECT FREQ key:返回指定 key 訪問頻率的對數,當淘汰策略為 LFU 時,這一命令會被用到
OBJECT HELP:返回幫助信息
對象的編碼格式也有很多種:
Strings 會被編碼為 raw 或 int
Lists 會被編碼為 ziplist 或 linkedlist
Sets 會被編碼為 intset 或 hashtable
Hashs 會被編碼為 ziplist 或 hashtable
Sorted Sets 會被編碼為 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 的過期時間,使之變成永久的 key。
PEXPIRE
最早可用版本 2.6.0
PEXPIRE 的作用和 EXPIRE 一樣,只不過參數中的時間單位是毫秒。
PEXPIREAT
最早可用版本 2.6.0
作用和 EXPIREAT 相同,參數同樣是毫秒。
PTTL
最早可用版本 2.6.0
返回指定 key 的剩余存活時間的毫秒數。2.8 以后的版本返回值有些變化,如果 key 不存在,則返回 -2;如果 key 是永久的,則返回 -1。
RANDOMKEY
最早可用版本 1.0.0
此命令用于從當前數據庫返回一個隨機的 key。
RENAME
最早可用版本 1.0.0
重命名一個 key。如果 key 不存在,則會返回錯誤。而如果新的 key 已經存在,則此命令會覆蓋原來的 key(它其實是執行了一個隱式的 DEL 命令,因此如果原來的 key 存儲的對象很大的話,刪除操作延時會很高)。在 3.2 版本以前,如果源 key 和目標 key 相同的話,會報錯。
RENAMENX
如果新的 key 不存在的話,重命名 key,如果存在的話返回 0,成功返回 1。
RESTORE
最早可用版本 2.6.0
用法:RESTORE key ttl serialized-value [REPLACE]
此命令是將一組數據反序列化,并存到 key。如果 ttl 是 0,則 key 是永久的。在 Redis3.0 版本以后,如果不使用 REPLACE 參數并且 key 已經存在,則會返回一個錯誤“Target key name is busy”。
SCAN
最早可用版本 2.8.0
用法:SCAN cursor MATCH pattern COUNT count
其中 cursor 為游標,MATCH 和 COUNT 為可選參數。
SCAN 命令和 SSCAN、HSCAN、ZSCAN 命令都用于增量的迭代元素集,它每次返回小部分數據,不會像 KEYS 那樣阻塞 Redis。SCAN 命令是基于游標的,每次調用后,都會返回一個游標,用于下一次迭代。當游標返回 0 時,表示迭代結束。
SCAN 每次返回的數量并不固定,也有可能返回數據為空。另外,SCAN 命令和 KEYS 命令一樣支持匹配。
我們在 Redis 里存入 10000 個 key 用于測試。
結果如下:
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)
可以看到雖然我們設置的 count 為 1000,但 Redis 每次返回的數值只有 10 個左右。
SORT
最早可用版本 1.0.0
當有 N 個元素需要排序,并且要返回 M 個元素時,SORT 命令的時間復雜度為 O(N+M*log(M))
此命令用于返回或保存 list,set 和 sorted set 的鍵,默認將數字或者可排序的 key 進行排序,Redis 會將其視為雙精度浮點數。
如果想要對字符串按字典順序排序,可以使用 ALPHA 參數。
如果想要按照外部字段進行排序,可以使用 BY 參數。
TOUCH
最早可用版本 3.2.1
修改某一個或多個 key 的最后訪問時間,如果 key 不存在,則忽略。
TTL
最早可用版本 1.0.0
返回指定 key 的剩余存活時間,單位為秒。
在 2.6 版本及以前,如果 key 不存在或者是永久 key,都會返回 -1。從 2.8 版本開始,如果 key 不存在,則返回 -2,如果 key 為永久 key,則返回 -1。
TYPE
最早可用版本 1.0.0
返回 key 存儲的值的類型。類型即為我們在 Redis 基礎數據結構一文中描述的 5 中數據類型。
String
String 是最基本的,也是最常用的類型。它是二進制安全的,也就是說,我們可以將對象序列化成 json 字符串作為 value 值存入 Redis。在分配內存時,Redis 會為一個字符串分配一些冗余的空間,以避免因字符串的值改變而出現頻繁的內存分配操作。當字符串長度小于 1M 時,每次擴容都會加倍現有空間,當長度大于 1M 時,每次擴容,增加 1M,Redis 字符串的最大長度是 512M。
Hash
Hash 是鍵值對集合,相當于 Java 中的 HashMap,實際結構也和 HashMap 一樣,是數組 + 鏈表的結構。所不同的是擴容的方式不同,HashMap 是進行一次 rehash,而 Redis 為了不阻塞服務,會創建一個新的數組,在查詢時會同時查詢兩個 Hash,然后在逐漸將舊的 Hash 內容轉移到新的中去。一個 Hash 最大可以存儲 232- 1 個鍵值對。
List
List 相當于 Java 中的 LinkedList,它的插入和刪除操作的時間復雜度為 O(1),而查詢操作的時間復雜度為 O(n)。我們可以利用 List 的 rpush、rpop、lpush 和 lpop 命令來構建隊列或者棧。列表最多可以存儲 232- 1 個元素。
Set
Set 是 String 類型的無序集合,并且元素唯一,相當于 Java 中的 HashSet,它的插入、刪除、查詢操作的時間復雜度都是 O(1)。其最大元素數也是 232- 1 個。
zset
zset 可以看做是 Java 中 SortedSet 和 HashMap 的結合,一方面它不允許元素重復,另一方面,它通過 score 為每個元素進行排序。
UNLINK
最早可用版本 4.0.0
這個命令和 DEL 類似,會刪除指定的 key。所不同的是,此命令的時間復雜度為 O(1),它先將 key 從 keyspace 中刪除,此時指定的 key 已經刪除,但是內存沒有釋放。所以,這個命令會在另一個線程中做釋放內存的操作。這一步的操作時間復雜度為 O(N)。
WAIT
最早可用版本 3.0.0
這個命令會阻塞客戶端,直到前面所有的寫操作都完成并且保存了指定數量的副本。該命令總會返回副本數量或者超時。
關于如何在 Redis 命令中使用 Keys 就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
向 AI 問一下細節