玩轉Redis-高級程序員必知的Key命令

《玩轉Redis》系列文章主要講述Redis的基礎及中高級應用,文章基於Redis5.0.4+。本文主要講述Redis的Key相關命令,主要包含如下內容:git

  • 【Key過時命令】:EXPIRE、PEXPIRE、EXPIREAT、PEXPIREAT、TTL、PTTL;
  • 【其餘Key命令】:DEL、EXISTS、KEYS、DUMP、MIGRATE、MOVE、PERSIST、RANDOMKEY、RENAME、RENAMENX、RESTORE、TOUCH、TYPE、UNLINK、WAIT、OBJECT、SORT;

最新思惟導圖原圖可於公衆號【zxiaofan】留言獲取。github

Redis-最新思惟導圖原圖

一、Key過時命令

1.一、Key過時命令簡述

  • 設置過時時間爲一段時間後(EXPIRE、PEXPIRE);
  • 設置過時時間爲指定時間點(EXPIREAT、PEXPIREAT);
  • 查詢過時時間(TTL、PTTL);
命令 功能 參數
EXPIRE 設置key的過時時間 key seconds
PEXPIRE 設置key的過時時間(毫秒) key milliseconds
EXPIREAT 設置key的過時時間爲Unix時間戳(since 1970-01-01) key timestamp
PEXPIREAT 設置key的過時時間爲Unix毫秒時間戳(since 1970-01-01) key milliseconds-timestamp
TTL 查詢指定key的剩餘生存時間 key
PTTL 查詢指定key的剩餘生存時間(毫秒) key

1.二、Key過時命令注意

  • Redis Version >= 2.6.0後,過時時間支持毫秒;
  • 過時時間支持設置一段時間後過時,也支持設置指定時間點過時;
  • 過時時間和電腦時鐘相關,若是修改時鐘爲將來的時間,則key會當即過時;
  • key被rename後,新key過時時間沿用舊key的過時時間;
  • version<=2.4時,過時精度有0-1S偏差,Redis2.6起(支持PSETEX),偏差縮小到0-1MS;
  • 以上6個命令時間複雜度都是O(1);
  • 【TTL、PTTL】
    • Redis version <= 2.6:key不存在或存在且未設置過時時間返回-1;
    • Redis version >=Redis 2.8:key不存在返回-2;存在且未設置過時時間返回-1;

1.三、Key過時命令詳細對比分析

Key過時命令詳細對比分析


1.四、Key過時命令示例

127.0.0.1:6378> set dyh @zxiaofan
OK
127.0.0.1:6378> expire dyh 5
(integer) 1
127.0.0.1:6378> ttl dyh
(integer) 0
127.0.0.1:6378> expire dyh 5
(integer) 0
127.0.0.1:6378> ttl dyh
(integer) -2
127.0.0.1:6378> set dyh @zxiaofan
OK
127.0.0.1:6378> expire dyh 50
(integer) 1
127.0.0.1:6378> ttl dyh
(integer) 47
127.0.0.1:6378> ttl dyh
(integer) 44
127.0.0.1:6378> pexpire dyh 3000
(integer) 1
127.0.0.1:6378> pttl dyh
(integer) -2
127.0.0.1:6378> set dyh @zxiaofan
OK
127.0.0.1:6378> pexpire dyh 30000
(integer) 1
127.0.0.1:6378> pttl dyh
(integer) 26575
127.0.0.1:6378> pttl dyh
(integer) 25039
127.0.0.1:6378> pexpireat dyh 1572536378000
(integer) 0
127.0.0.1:6378> pttl dyh
(integer) -2
127.0.0.1:6378> set dyh @zxiaofan
OK
127.0.0.1:6378> pexpireat dyh 1572536378000
(integer) 1
127.0.0.1:6378> ttl dyh
(integer) 86359
127.0.0.1:6378> ttl dyh
(integer) 86357
複製代碼

二、Redis其餘Key命令

2.一、Redis其餘Key命令簡述

Redis的Key命令衆多,支持各式各樣的功能:刪除、查找、迭代、判斷、排序、移動等。shell

命令
功能 參數
DEL 刪除指定key key [key ...]
EXISTS 判斷指定key是否存在 key [key ...]
KEYS 查找指定Pattern的key pattern
DUMP 返回指定key序列化後的值 key
MIGRATE 原子遷移指定key到指定實例的指定DB host port key | "" destination-db timeout [COPY] [REPLACE] [KEYS key [key ...]]
MOVE 移動key到指定DB key db
PERSIST 移除key的超時時間 key
RANDOMKEY 返回一個隨機key 無參
RENAME 重命名key key newkey
RENAMENX newkey不存在時重命名key key newkey
RESTORE 反序列化數據並存儲到指定key key ttl serialized-value [REPLACE] [ABSTTL] [IDLETIME seconds] [FREQ frequency]
SORT 返回list、set、sorted list排序後的數據 key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC
TOUCH (批量)修改key的最後訪問時間 key [key ...]
TYPE 查詢key類型 key
UNLINK 將keys從keyspace中刪除,後續將異步刪除value key [key ...]
WAIT 阻塞客戶端直到超時或以前的寫命令被同步到指定數量的副本 numreplicas timeout(毫秒)
OBJECT 調試key對應的value,經常使用於優化 subcommand [arguments [arguments ...]]

2.二、Redis其餘Key命令注意

  • 【EXISTS】判斷指定key是否存在數據庫

    • key存在返回1,不存在返回0;
    • 參數key有多個時,返回存在key的數量;
    • 3.0.3支持多參數;
  • 【KEYS】查找指定Pattern的key安全

    • 命令功能強大,但性能低下,建議使用SCAN替代;
    • 掃描1百萬key須要40ms,大數據庫下性能很是低下;
    • 僅用於調試或特殊操做,如鍵空間keyspace改變;
    • pattern通配符:
      • ?:任一字符; *:任意多個字符
      • [ae]:匹配a或e; [^e]:匹配非e
      • [a-b]:匹配a-b之間(含)的字符
      • \ : 字符轉義
  • 【DUMP】返回指定key序列化後的值bash

    • 序列化的值不包含過時時間;
    • 序列化結果包含64位校驗和用於檢查錯誤;
    • 編碼格式和RDB使用的格式一致;
    • 序列化值包含RDB版本信息,RDB格式不兼容的Redis版本,將拒絕處理序列化的值(拒絕反序列化操做);
  • 【MIGRATE】原子遷移指定key到指定實例的指定DB微信

    • 原理:源DB執行DUMP+DEL;目標DB執行RESTORE。源DB DUMP》目標DB RESTORE》目標DB返回「OK」則源DB DEL;
    • 遷移時會阻塞2個實例,直到成功或者超時(毫秒)、異常;
    • 遷移多key:key參數爲「」,keys指定多key;
    • 超時(毫秒)不是指完成時間,而是指數據傳輸時間;
    • IOERR:
      • MIGRATE須要在指定時間完成IO操做,若是IO異常或超時將返回IOERR;
      • 可能產生2種場景:一、key存在於2個實例;二、key僅存在於源實例;
      • key丟失不願能發生;
      • 若是遇到超時,應檢查key是否存在於目標實例;
    • 若是返回異常(ERR開頭),MIGRATE保證key僅存在於源實例(除非目標實例有同名key);
    • AUTH不能放在KEYS參數後;
  • 【MOVE】移動key倒指定DB數據結構

    • 當前DB不存在該key ==》 不移動;
    • 目標DB已有該key ==》 不移動;
  • 【RENAME】重命名key異步

    • key不存在:error(no such key);
    • <Redis3.2.0,若新舊key名字相同,會返回異常"ERR source and destination objects are the same";
    • 原理:先刪除key再添加新key;
    • 若是原key是big key,會致使高延遲;
    • 注意和【RENAMENX】對比學習;
  • 【RESTORE】反序列化數據並存儲到指定key性能

    • 序列化值可經過DUMP得到;
    • ttl爲0表示不設置超時時間,不然設置超時時間(單位毫秒);
    • Redis》=5..0:支持ABSTTL修飾符,ttl表示Unix時間戳(毫秒);
    • IDLETIME seconds:設置反序列化的值的idletime,idletime可經過Object idletime key 查詢;
    • FREQ frequency:設置反序列化的值的FREQ,FREQ 可經過Object freq key 查詢;
    • key已存在:返回(error) BUSYKEY Target key name already exists.【或者使用REPLACE修飾符】;
    • RESTORE將檢查RDB版本信息以及數據校驗和,不匹配將返回異常;
    • RESTORE時間複雜度:O(1)+O(N*M)
      • O(1):建立新key;
      • N:組成value的數據結構的元素數量;
      • M:組成value的數據結構的元素的平均大小;
      • value是小字符串:O(1)+O(1*M)且M較小,故近似當作O(1);
      • value是sorted set:複雜度是O(NMlog(N)),由於插入數據到sorted sets是O(log(N));
  • 【SORT】返回list、set、sorted list排序後的數據

    • 默認按照數值由小到大排序,按照雙精度浮點數進行比較;
    • 逆序:DESC;
    • 字母順序排序:ALPHA,不使用此修飾符會異常;
    • 正確設置!LC_COLLATE環境變量後,可以使用lIMIT修飾符;
    • 外部key排序:SORT user_id BY user_level_* DESC GET user_name_*;
      • *實際是user_id(列表)中value的佔位符;
      • by對應key不存在時,將不會排序;
      • GET返回排序結果對應的值;
        • #將返回列表元素自己;
    • STORE resultkey:保存排序結果到指定key;
  • 【TYPE】查詢key類型

    • 返回類型:string, list, set, zset, hash and stream;
  • 【UNLINK】將keys從keyspace中刪除,後續將異步刪除value

    • 和DEL相似。刪除key:DEL、UNLINK都是同步;刪除value:DEL是同步,UNLINK是異步;
    • 經常使用於刪除大key(4.0.0以前可以使用Pipeline批量刪除value);
  • 【WAIT】阻塞客戶端直到超時或以前的寫命令被同步到指定數量的副本

    • WAIT命令返回時,當前鏈接全部以前的寫命令必定會被指定數量的副本接收;
    • 若是WAIT命令是多事物的一部分,WAIT將不會阻塞而是儘快返回參數指定的副本數量;
    • timeout爲0意味着一直阻塞;
    • 不論成功失敗,WAIT都將返回處理的副本數量,客戶端應檢查返回結果是否大於等於預期;
    • 【一致性】
      • WAIT不保證強一致性;
      • 在哨兵Sentinel或Redis Cluster的故障轉移中,能夠提升數據安全性;
    • 【實現細節】
      • 基於PSYNC(Redis主從同步)特性,副本會帶上已處理過的偏移量,可應用於多種場景:
      • 一、檢測副本超時狀況;二、鏈接斷開後再同步;三、實現WAIT;
      • WAIT場景中:當客戶端執行寫命令後,Redis會記錄副本的偏移量。執行WAIT時,Redis會檢測副本是否已經完成該操做或者已經執行更新的操做;
  • 【OBJECT】調試key對應的value,經常使用於優化

    • refcount或idletime子命令:返回數字;
      • 返回指定key對應value被引用的次數;
      • 場景:整數共享對象池節省內存;
    • encoding子命令:返回value的底層結構;
      • 返回key對應的value的底層結構;
    • IDLETIME
      • 返回key被閒置(未寫未讀)的時間(秒);
      • 當Redis內存策略是LRU或noeviction時可用;
    • FREQ
      • 返回key的對數訪問頻率計數器;
      • 結合SCAN獲取熱key;
    • key不存在:返回nil;
    • OBJECT能夠了解value的類型;
    • 根據調試信息設置key的回收策略;

2.三、Redis其餘Key命令詳細對比分析

  • DEL、UNLINK、EXISTS、KEYS、DUMP詳細對比分析:

    Redis其餘Key命令詳細對比分析1

  • MIGRATE、MOVE、PERSIST、RENAME、RENAMENX詳細對比分析:

    Redis其餘Key命令詳細對比分析2

  • RESTORE、RANDOMKEY、TOUCH、TYPE、WAIT詳細對比分析:

    Redis其餘Key命令詳細對比分析3

  • OBJECT、SORT詳細對比分析:

    Redis其餘Key命令詳細對比分析4


2.四、Redis其餘Key命令示例

2.4.一、unlink、del、exists、keys示例

127.0.0.1:6378> set key1 dyh
OK
127.0.0.1:6378> set key2 @zxiaofan
OK
127.0.0.1:6378> unlink key1
(integer) 1
127.0.0.1:6378> del key2
(integer) 1
127.0.0.1:6378> exists key1 key2
(integer) 0
127.0.0.1:6378> keys key*
1) "key3"
2) "keylist"
3) "key4"
4) "key"
127.0.0.1:6378> keys key?
1) "key3"
2) "key4"
127.0.0.1:6378> keys key[35]
1) "key3"
127.0.0.1:6378> keys key[^3]
1) "key4"
複製代碼

2.4.二、dump示例

127.0.0.1:6378> set key2 @zxiaofan
OK
127.0.0.1:6378> get key2
"@zxiaofan"
127.0.0.1:6378> dump key2
"\x00\t@zxiaofan\t\x00\xe8\xd2c%\x02\xc7]="
複製代碼

2.4.三、move示例

127.0.0.1:6378> set key1 hi
OK
127.0.0.1:6378> set key2 @zxiaofan
OK
127.0.0.1:6378> select 1
OK
127.0.0.1:6378[1]> del key1
(integer) 0
127.0.0.1:6378[1]> set key2 @zxiaofan-db1
OK
127.0.0.1:6378[1]> select 0
OK
127.0.0.1:6378> move key1 1
(integer) 1
127.0.0.1:6378> move key2 1
(integer) 0
127.0.0.1:6378> get key1
(nil)
127.0.0.1:6378> get key2
"@zxiaofan"
127.0.0.1:6378> select 1
OK
127.0.0.1:6378[1]> get key2
"@zxiaofan-db1"
複製代碼

2.4.四、rename、renamenx示例

127.0.0.1:6378> set key2 @zxiaofan
OK
127.0.0.1:6378> rename key2 key2019
OK
127.0.0.1:6378> rename key2 key2019
(error) ERR no such key
127.0.0.1:6378> set key1 hi
OK
127.0.0.1:6378> rename key2019 key1
OK
127.0.0.1:6378> get key1
"@zxiaofan"
127.0.0.1:6378> set key2 @zxiaofan
OK
127.0.0.1:6378> renamenx key2019 key1
(error) ERR no such key
127.0.0.1:6378> renamenx key2 key1
(integer) 0
127.0.0.1:6378> rename key2 key1
OK
複製代碼

2.4.五、type示例

127.0.0.1:6378> set key2 @zxiaofan
OK
127.0.0.1:6378> type key2
string
127.0.0.1:6378> set key1 1
OK
127.0.0.1:6378> type key1
string
127.0.0.1:6378> lpush listkey csdn github zxiaofan.com
(integer) 6
127.0.0.1:6378> type listkey
list
127.0.0.1:6378> hmset hashkey name zxiaofan blog csdn
OK
127.0.0.1:6378> type hashkey
hash
複製代碼

2.4.五、RANDOMKEY示例

127.0.0.1:6378> RANDOMKEY
"list3"
127.0.0.1:6378> RANDOMKEY
"num4"
127.0.0.1:6378> RANDOMKEY
"dyh"
127.0.0.1:6378> mget list3 num4 dyh
1) (nil)
2) "200"
3) "@zxiaofan"
127.0.0.1:6378> 
複製代碼

三、總結

關於Redis的Key命令,你掌握了多少了呢?不清楚的趕忙往上翻翻。

  • 過時時間支持哪幾種;
  • 如何查詢指定key的過時時間;
  • 如何移除指定key的過時時間;
  • 如何判斷Redis中是否存在某些key,若存在返回值是什麼;
  • 功能強大的KEYS命令通配符支持哪些;
  • key能夠重命名嗎,重命名須要注意什麼;
  • SORT排序支持哪幾種數據類型,各數據類型默認排序規則是怎樣的;
  • UNLINK和DEL的區別是什麼;
  • OBJECT命令都有哪些子命令,如何應用於調試分析;

Redis的Key相關命令到此結束了嗎?路漫漫其修遠兮...

  • SCAN系列命令(SCAN / SSCAN / HSCAN /ZSCAN),如何高性能處理海量Redis數據;
  • SORT實戰中如何排序;
  • Object實戰中如何用於性能分析。

敬請關注後續《玩轉Redis》系列文章。


祝君好運!
Life is all about choices!
未來的你必定會感激如今拼命的本身!
CSDN】【GitHub】【OSCHINA】【掘金】【微信公衆號
歡迎訂閱zxiaofan的微信公衆號,掃碼或直接搜索zxiaofan

相關文章
相關標籤/搜索