Redis相關key操作的常用的命令 第二章
Redis相關key操作的常用的命令 第二章
KEYS pattern
Redis KEYS 命令用于查找所有匹配給定模式 pattern 的 key 。
盡管這個操作的時間復雜度是 O(N),但是常量時間相當小。
例如,在一個普通筆記本上跑 Redis,掃描 100 萬個 key 只要40毫秒。
Warning: 生產(chǎn)環(huán)境使用 KEYS 命令需要非常小心。在大的數(shù)據(jù)庫上執(zhí)行命令會影響性能。
這個命令適合用來調(diào)試和特殊操作,像改變鍵空間布局。
不要在你的代碼中使用 KEYS 。如果你需要一個尋找鍵空間中的key子集,考慮使用 SCAN 或 sets。
匹配模式:
h?llo 匹配 hello, hallo 和 hxllo h*llo 匹配 hllo 和 heeeello h[ae]llo 匹配 hello and hallo, 不匹配 hillo h[^e]llo 匹配 hallo, hbllo, ... 不匹配 hello h[a-b]llo 匹配 hallo 和 hbllo 使用 \ 轉(zhuǎn)義你想匹配的特殊字符。
語法 redis KEYS 命令基本語法如下:
redis 127.0.0.1:6379> KEYS PATTERN 返回值 數(shù)組: 以數(shù)組的形式返回匹配模式 pattern 的 key 的列表。
*例子
#?創(chuàng)建一些?key?并賦值
redis>?MSET?firstname?Jack?lastname?Stuntman?age?35
"OK"
#?查找含有?name?的?key
redis>?KEYS?*name*
1)?"lastname"
2)?"firstname"
#?查找以?a?為開頭長度為?3?的?key
redis>?KEYS?a??
1)?"age"
# redis 獲取所有的 key 使用?*。
redis>?KEYS?*
1)?"age"
2)?"lastname"
3)?"firstname"
redis>?
MIGRATE host port key|"" destination-db timeout [COPY] [REPLACE] [AUTH password] [AUTH2 username password] [KEYS key [key ...]]
將 key 原子性地從當前實例傳送到目標實例的指定數(shù)據(jù)庫上,一旦傳送成功, key 會出現(xiàn)在目標實例上,而當前實例上的 key 會被刪除。
MIGRATE 命令是一個原子操作,它在執(zhí)行的時候會阻塞進行遷移的兩個實例,直到以下任意結(jié)果發(fā)生:遷移成功,遷移失敗,等待超時。
Redis 3.2 以上版本支持一個命令遷移多個 key,通過使用空的雙引號 ”” 替換 key,并在命令結(jié)尾增加 KEYS 命令,匹配要遷移的多個key
命令的內(nèi)部實現(xiàn)是這樣的:它在當前實例對給定 key 執(zhí)行 DUMP 命令 ,將它序列化,然后傳送到目標實例,目標實例再使用 RESTORE 對數(shù)據(jù)進行反序列化,并將反序列化所得的數(shù)據(jù)添加到數(shù)據(jù)庫中;當前實例就像目標實例的客戶端那樣,只要看到 RESTORE 命令返回 OK ,它就會調(diào)用 DEL 刪除自己數(shù)據(jù)庫上的 key 。
timeout 參數(shù)以毫秒為格式,指定當前實例和目標實例進行傳輸?shù)淖畲箝g隔時間。這說明操作并不一定要在 timeout 毫秒內(nèi)完成,只是說數(shù)據(jù)傳送的時間不能超過這個 timeout 。
MIGRATE 命令需要在給定的時間規(guī)定內(nèi)完成 IO 操作。如果在傳送數(shù)據(jù)時發(fā)生 IO 錯誤,或者達到了超時時間,那么命令會停止執(zhí)行,并返回一個特殊的錯誤:IOERR 。當 IOERR 出現(xiàn)時,有以下兩種可能的結(jié)果
可能存在于兩個實例??赡苤淮嬖谟谠磳嵗3瑫r不會導致 key 丟失。但是如果一個客戶端執(zhí)行 MIGRATE 命令,并且不幸遇上超時,需要檢查 key 是否出現(xiàn)在目的實例上。
如果有其它錯誤發(fā)生,那么 MIGRATE 保證 key 只會出現(xiàn)在當前實例中。(當然,目標實例的給定數(shù)據(jù)庫上可能有和 key 同名的鍵,不過這和 MIGRATE 命令沒有關系)。
如果源實例中沒有要遷移的key,返回NOKEY 。比如鍵過期的情況,NOKEY并不是一個錯誤。
一次遷移多個 key Redis 3.0.6 起MIGRATE 支持批量遷移。需要使用 KEYS 選項,使用空字符串替換 key,要遷移的 key 列在 KEYS 命令之后:
MIGRATE?192.168.1.34?6379?""?0?5000?KEYS?key1?key2?key3
當所有 key 都不存在時返回 NOKEY ,即使只有一個key存在也執(zhí)行成功。
Options COPY -- 復制,不刪除源實例中的 key。REPLACE -- 替換,替換目標實例中的存在的 key。KEYS -- 如果 key 參數(shù)是一個空字符串,會遷移 KEYS 命令后所有的 key 。AUTH -- 使用密碼訪問目標數(shù)據(jù)庫。AUTH2 -- 使用用戶名和密碼對訪問數(shù)據(jù)庫。(Redis 6 以上 ACL auth )。歷史
= 3.0.0: 增加 COPY 和REPLACE 選項。= 3.0.6: 增加 KEYS 選項。= 4.0.7: 增加 AUTH 選項。= 6.0.0: 增加 AUTH2 選項。返回值 字符串: 遷移成功時返回 OK ,如果在源實例中找不到 key 返回 NOKEY 。
MOVE key db
Redis MOVE 命令用于將當前數(shù)據(jù)庫的 key 移動到選定的數(shù)據(jù)庫 db 當中。
如果 key 在目標數(shù)據(jù)庫中已存在,或者 key 在源數(shù)據(jù)庫中不存,則key 不會被移動。
語法 redis Move 命令基本語法如下:
redis?127.0.0.1:6379>?MOVE?KEY_NAME?DESTINATION_DATABASE
返回值 整數(shù), : 1 如果 key 被移動。0 如果 key 沒有被移動。
key 存在于當前數(shù)據(jù)庫
redis默認使用數(shù)據(jù)庫 0,為了清晰起見,這里再顯式指定一次。
redis>?SELECT?0?????????????????????????????
OK
redis>?SET?song?"secret?base?-?Zone"
OK
#?將?song?移動到數(shù)據(jù)庫?1
redis>?MOVE?song?1?????????????????????????
(integer)?1
#?song?已經(jīng)被移走
redis>?EXISTS?song??????????????????????????
(integer)?0
#?使用數(shù)據(jù)庫?1
redis>?SELECT?1????????????????????????????
OK
#?證實?song?被移到了數(shù)據(jù)庫?1?
#?(注意命令提示符變成了"redis:1",表明正在使用數(shù)據(jù)庫?1)
redis:1>?EXISTS?song????????????????????????
(integer)?1
#?當?key?不存在的時候
redis:1>?EXISTS?fake_key
(integer)?0
#?試圖從數(shù)據(jù)庫?1?移動一個不存在的?key?到數(shù)據(jù)庫?0,失敗
redis:1>?MOVE?fake_key?0????????????????????
(integer)?0
#?使用數(shù)據(jù)庫0
redis:1>?select?0??????????????????????????
OK
#?證實?fake_key?不存在
redis>?EXISTS?fake_key?????????????????????
(integer)?0
#?當源數(shù)據(jù)庫和目標數(shù)據(jù)庫有相同的?key?時
#?使用數(shù)據(jù)庫0
redis>?SELECT?0?????????????????????????????
OK
redis>?SET?favorite_fruit?"banana"
OK
#?使用數(shù)據(jù)庫1
redis>?SELECT?1?????????????????????????????
OK
redis:1>?SET?favorite_fruit?"apple"
OK
#?使用數(shù)據(jù)庫0,并試圖將?favorite_fruit?移動到數(shù)據(jù)庫?1
redis:1>?SELECT?0??????????????????????????
OK
#?因為兩個數(shù)據(jù)庫有相同的?key,MOVE?失敗
redis>?MOVE?favorite_fruit?1???????????????
(integer)?0
#?數(shù)據(jù)庫?0?的?favorite_fruit?沒變
redis>?GET?favorite_fruit???????????????????
"banana"
redis>?SELECT?1
OK
#?數(shù)據(jù)庫?1?的?favorite_fruit?也是
redis:1>?GET?favorite_fruit?????????????????
"apple"
OBJECT subcommand [arguments [arguments ...]]
OBJECT 命令允許從內(nèi)部察看給定 key 的 Redis 對象, 它通常用在除錯(debugging)或者了解為了節(jié)省空間而對 key 使用特殊編碼的情況。當將Redis用作緩存程序時,你也可以通過 OBJECT 命令中的信息,決定 key 的驅(qū)逐策略(eviction policies)。
OBJECT 命令有多個子命令:
OBJECT REFCOUNT
字符串可以被編碼為 raw (一般字符串)或 int (為了節(jié)約內(nèi)存,Redis 會將字符串表示的 64 位有符號整數(shù)編碼為整數(shù)來進行儲存)。列表可以被編碼為 ziplist 或 linkedlist 。ziplist 是為節(jié)約大小較小的列表空間而作的特殊表示。集合可以被編碼為 intset 或者 hashtable 。intset 是只儲存數(shù)字的小集合的特殊表示。哈希表可以編碼為 zipmap 或者 hashtable 。zipmap 是小哈希表的特殊表示。有序集合可以被編碼為 ziplist 或者 skiplist 格式。ziplist 用于表示小的有序集合,而 skiplist 則用于表示任何大小的有序集合。假如你做了什么讓 Redis 沒辦法再使用節(jié)省空間的編碼時(比如將一個只有 1 個元素的集合擴展為一個有 100 萬個元素的集合),特殊編碼類型(specially encoded types)會自動轉(zhuǎn)換成通用類型(general type)。
語法 redis OBJECT 命令基本語法如下:
redis?127.0.0.1:6379>?OBJECT?subcommand?[arguments?[arguments]]?
返回值
REFCOUNT 和 IDLETIME 返回數(shù)字。ENCODING 返回相應的編碼類型。
Subcommands?refcount?and?idletime?return?integers.
Subcommand?encoding?returns?a?bulk?reply.
例子
redis>?lpush?mylist?"Hello?World"
(integer)?4
redis>?object?refcount?mylist
(integer)?1
redis>?object?encoding?mylist
"ziplist"
redis>?object?idletime?mylist
(integer)?10
In?the?following?example?you?can?see?how?the?encoding?changes?once?Redis?is?no?longer?able?to?use?the?space?saving?encoding.
redis>?set?foo?1000
OK
redis>?object?encoding?foo
"int"
redis>?append?foo?bar
(integer)?7
redis>?get?foo
"1000bar"
redis>?object?encoding?foo
"raw"
PERSIST key
Redis PERSIST 命令用于刪除給定 key 的過期時間,使得 key 永不過期。
Redis PERSIST 命令用于刪除給定 key 的過期時間,使得 key 永不過期。
語法 redis PERSIST 命令基本語法如下:
redis?127.0.0.1:6379>?PERSIST?KEY_NAME
返回值
整數(shù),?specifically:
1?當過期時間移除成功時
0?如果?key?不存在或?key?沒有設置過期時間
例子
redis>?SET?mykey?"Hello"
"OK"
#?為?key?設置生存時間
redis>?EXPIRE?mykey?10
(integer)?1
redis>?TTL?mykey
(integer)?10
#?移除?key?的生存時間
redis>?PERSIST?mykey
(integer)?1
redis>?TTL?mykey
(integer)?-1
redis>?
PEXPIRE key milliseconds
PEXPIRE 跟 EXPIRE 基本一樣,只是過期時間單位是毫秒。
語法 redis PEXPIRE 命令基本語法如下:
PEXPIRE?key?milliseconds
返回值 整數(shù), specifically:
1 過期設置成功。0 key 不存在或設置失敗。例子
redis>?SET?mykey?"Hello"
"OK"
redis>?PEXPIRE?mykey?1500
(integer)?1
redis>?TTL?mykey
(integer)?1
redis>?PTTL?mykey
(integer)?1498
redis>?
PEXPIREAT key milliseconds-timestamp
Redis PEXPIREAT 命令用于設置 key 的過期時間,時間的格式是uinx時間戳并精確到毫秒。
Redis PEXPIREAT 命令用于設置 key 的過期時間,時間的格式是uinx時間戳并精確到毫秒。
語法 redis PEXPIREAT 命令基本語法如下:
redis?127.0.0.1:6379>?PEXPIREAT?KEY_NAME?TIME_IN_MILLISECONDS_IN_UNIX_TIMESTAMP
返回值 整數(shù):
1 設置成功返回 0 如果 key 不存在
例子
#?創(chuàng)建一個?key?并賦值
redis>?SET?rediscomcn?"Hello"
"OK"
#?為?key?設置過期時間
redis>?PEXPIREAT?rediscomcn?1555555555005
(integer)?1
redis>?TTL?rediscomcn
(integer)?-2
redis>?PTTL?rediscomcn
(integer)?-2
redis>?
PTTL key
Redis PTTL 命令以毫秒為單位返回 key 的剩余過期時間。
語法 redis PTTL 命令基本語法如下:
redis?127.0.0.1:6379>?PTTL?KEY_NAME
Redis 2.6 之前的版本如果 key 不存在或者 key 沒有關聯(lián)超時時間則返回 -1 。
Redis 2.8 起:
key 不存在返回 -2 key 存在但是沒有關聯(lián)超時時間返回 -1 返回值 整數(shù): 當 key 不存在時,返回 -2 。當 key 存在但沒有設置剩余生存時間時,返回 -1 。否則,以毫秒為單位,返回 key 的剩余生存時間。
例子
redis>?SET?mykey?"Hello"
"OK"
#?key?存在,但沒有設置剩余生存時間
redis>?PTTL?mykey
(integer)?-1
redis>?EXPIRE?mykey?1
(integer)?1
#?有剩余生存時間的?key
redis>?PTTL?mykey
(integer)?1000
redis>???
