1.DEL
DEL key [key ...]
刪除給定的一個或多個key佛南。
不存在的key會被忽略。
返回值:
被刪除key的數(shù)量灭翔。
# 刪除單個 key
redis> SET name huangz
OK
redis> DEL name
(integer) 1
# 刪除一個不存在的 key
redis> EXISTS phone
(integer) 0
redis> DEL phone # 失敗魏烫,沒有 key 被刪除
(integer) 0
# 同時刪除多個 key
redis> SET name "redis"
OK
redis> SET type "key-value store"
OK
redis> SET website "redis.com"
OK
redis> DEL name type website
(integer) 3
2.DUMP
DUMP key
序列化給定key,并返回被序列化的值肝箱,使用 RESTORE 命令可以將這個值反序列化為 Redis 鍵哄褒。
序列化生成的值有以下幾個特點:
它帶有 64 位的校驗和,用于檢測錯誤煌张, RESTORE 在進行反序列化之前會先檢查校驗和呐赡。
值的編碼格式和 RDB 文件保持一致。
RDB 版本會被編碼在序列化值當中骏融,如果因為 Redis 的版本不同造成 RDB 格式不兼容链嘀,那么 Redis 會拒絕對這個值進行反序列化操作。
序列化的值不包括任何生存時間信息档玻。
返回值:
如果key不存在怀泊,那么返回nil。
否則误趴,返回序列化之后的值霹琼。
redis> SET greeting "hello, dumping world!"
OK
redis> DUMP greeting
"\x00\x15hello, dumping world!\x06\x00E\xa0Z\x82\xd8r\xc1\xde"
redis> DUMP not-exists-key
(nil)
3.EXISTS
EXISTS key
檢查給定key是否存在。
返回值:
若key存在,返回1枣申,否則返回0售葡。
redis> SET db "redis"
OK
redis> EXISTS db
(integer) 1
redis> DEL db
(integer) 1
redis> EXISTS db
(integer) 0
4.EXPIRE
SDIFFSTORE destination key [key ...]
為給定key設置生存時間,當key過期時(生存時間為0)忠藤,它會被自動刪除挟伙。
在 Redis 中,帶有生存時間的key被稱為『易失的』(volatile)熄驼。
生存時間可以通過使用DEL
命令來刪除整個key來移除像寒,或者被SET
和GETSET
命令覆寫(overwrite),這意味著瓜贾,如果一個命令只是修改(alter)一個帶生存時間的key的值而不是用一個新的key值來代替(replace)它的話诺祸,那么生存時間不會被改變。
比如說祭芦,對一個key執(zhí)行INCR
命令筷笨,對一個列表進行LPUSH
命令,或者對一個哈希表執(zhí)行HSET
命令龟劲,這類操作都不會修改key本身的生存時間胃夏。
另一方面,如果使用 RENAME 對一個key進行改名昌跌,那么改名后的key的生存時間和改名前一樣仰禀。
RENAME 命令的另一種可能是,嘗試將一個帶生存時間的key改名成另一個帶生存時間的another_key蚕愤,這時舊的another_key(以及它的生存時間)會被刪除答恶,然后舊的key會改名為another_key,因此萍诱,新的another_key的生存時間也和原本的key一樣悬嗓。
使用PERSIST
命令可以在不刪除key的情況下,移除key的生存時間裕坊,讓key重新成為一個『持久的』(persistent)key包竹。
更新生存時間
可以對一個已經(jīng)帶有生存時間的key執(zhí)行EXPIRE
命令,新指定的生存時間會取代舊的生存時間籍凝。
過期時間的精確度
在 Redis 2.4 版本中周瞎,過期時間的延遲在 1 秒鐘之內 —— 也即是,就算key
已經(jīng)過期饵蒂,但它還是可能在過期之后一秒鐘之內被訪問到声诸,而在新的 Redis 2.6 版本中,延遲被降低到 1 毫秒之內苹享。
返回值:
設置成功返回1双絮。
當key不存在或者不能為key設置生存時間時(比如在低于 2.1.3 版本的 Redis 中你嘗試更新key的生存時間),返回0得问。
redis> SET cache_page "www.google.com"
OK
redis> EXPIRE cache_page 30 # 設置過期時間為 30 秒
(integer) 1
redis> TTL cache_page # 查看剩余生存時間
(integer) 23
redis> EXPIRE cache_page 30000 # 更新過期時間
(integer) 1
redis> TTL cache_page
(integer) 29996
5.EXPIREAT
EXPIREAT key timestamp
EXPIREAT 的作用和 EXPIRE 類似囤攀,都用于為key設置生存時間。
不同在于 EXPIREAT 命令接受的時間參數(shù)是 UNIX 時間戳(unix timestamp)宫纬。
返回值:
如果生存時間設置成功焚挠,返回1。
當key不存在或沒辦法設置生存時間漓骚,返回0蝌衔。
redis> SET cache www.google.com
OK
redis> EXPIREAT cache 1355292000 # 這個 key 將在 2012.12.12 過期
(integer) 1
redis> TTL cache
(integer) 45081860
6.KEYS
KEYS pattern
查找所有符合給定模式pattern的key。
KEYS *
匹配數(shù)據(jù)庫中所有key蝌蹂。
KEYS h?llo
匹配hello噩斟,hallo和hxllo等。
KEYS h*llo
匹配hllo和heeeeello等孤个。
KEYS h[ae]llo
匹配hello和hallo剃允,但不匹配hillo。
特殊符號用\隔開
KEYS 的速度非称肜穑快斥废,但在一個大的數(shù)據(jù)庫中使用它仍然可能造成性能問題,
如果你需要從一個數(shù)據(jù)集中查找特定的key给郊,你最好還是用 Redis 的集合結構(set)來代替牡肉。
返回值:
符合給定模式的key
列表。
redis> MSET one 1 two 2 three 3 four 4 # 一次設置 4 個 key
OK
redis> KEYS *o*
1) "four"
2) "two"
3) "one"
redis> KEYS t??
1) "two"
redis> KEYS t[w]*
1) "two"
redis> KEYS * # 匹配數(shù)據(jù)庫內所有 key
1) "four"
2) "three"
3) "two"
4) "one"
SISMEMBER key member
將key原子性地從當前實例傳送到目標實例的指定數(shù)據(jù)庫上淆九,一旦傳送成功统锤,key
保證會出現(xiàn)在目標實例上,而當前實例上的key會被刪除吩屹。
這個命令是一個原子操作跪另,它在執(zhí)行的時候會阻塞進行遷移的兩個實例,直到以下任意結果發(fā)生:遷移成功煤搜,遷移失敗免绿,等待超時。
命令的內部實現(xiàn)是這樣的:它在當前實例對給定key執(zhí)行 DUMP
命令 擦盾,將它序列化嘲驾,然后傳送到目標實例,目標實例再使用 RESTORE
對數(shù)據(jù)進行反序列化迹卢,并將反序列化所得的數(shù)據(jù)添加到數(shù)據(jù)庫中辽故;當前實例就像目標實例的客戶端那樣,只要看到 RESTORE
命令返回OK腐碱,它就會調用 DEL
刪除自己數(shù)據(jù)庫上的key誊垢。
timeout參數(shù)以毫秒為格式掉弛,指定當前實例和目標實例進行溝通的最大間隔時間。這說明操作并不一定要在timeout毫秒內完成喂走,只是說數(shù)據(jù)傳送的時間不能超過這個timeout數(shù)殃饿。
MIGRATE
命令需要在給定的時間規(guī)定內完成 IO 操作。如果在傳送數(shù)據(jù)時發(fā)生 IO 錯誤芋肠,或者達到了超時時間乎芳,那么命令會停止執(zhí)行,并返回一個特殊的錯誤:IOERR帖池。
當IOERR出現(xiàn)時奈惑,有以下兩種可能:
- key可能存在于兩個實例
- key可能只存在于當前實例
唯一不可能發(fā)生的情況就是丟失key,因此睡汹,如果一個客戶端執(zhí)行 MIGRATE 命令肴甸,并且不幸遇上IOERR錯誤,那么這個客戶端唯一要做的就是檢查自己數(shù)據(jù)庫上的key是否已經(jīng)被正確地刪除囚巴。
如果有其他錯誤發(fā)生雷滋,那么 MIGRATE 保證key只會出現(xiàn)在當前實例中。(當然文兢,目標實例的給定數(shù)據(jù)庫上可能有和key同名的鍵晤斩,不過這和 MIGRATE 命令沒有關系)。
可選項:
COPY:不移除源實例上的key姆坚。
REPLACE:替換目標實例上已存在的key澳泵。
返回值:
遷移成功時返回OK,否則返回相應的錯誤兼呵。
#先啟動兩個 Redis 實例兔辅,一個使用默認的 6379 端口,一個使用 7777 端口击喂。
$ ./redis-server &
[1] 3557
...
$ ./redis-server --port 7777 &
[2] 3560
...
#然后用客戶端連上 6379 端口的實例维苔,設置一個鍵,然后將它遷移到 7777 端口的實例上:
$ ./redis-cli
redis 127.0.0.1:6379> flushdb
OK
redis 127.0.0.1:6379> SET greeting "Hello from 6379 instance"
OK
redis 127.0.0.1:6379> MIGRATE 127.0.0.1 7777 greeting 0 1000
OK
#遷移成功后 key 被刪除
redis 127.0.0.1:6379> EXISTS greeting
(integer) 0
#使用另一個客戶端懂昂,查看 7777 端口上的實例:
$ ./redis-cli -p 7777
redis 127.0.0.1:7777> GET greeting
"Hello from 6379 instance"
8.MOVE
MOVE key db
將當前數(shù)據(jù)庫的key移動到給定的數(shù)據(jù)庫db當中介时。
如果當前數(shù)據(jù)庫(源數(shù)據(jù)庫)和給定數(shù)據(jù)庫(目標數(shù)據(jù)庫)有相同名字的給定key,或者key不存在于當前數(shù)據(jù)庫凌彬,那么MOVE沒有任何效果沸柔。
因此,也可以利用這一特性铲敛,將 MOVE 當作鎖(locking)原語(primitive)褐澎。
返回值:
移動成功返回1,失敗則返回0伐蒋。
# 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"
9.SMOVE
SMOVE source destination member
OBJECT 命令允許從內部察看給定key的 Redis 對象。
它通常用在除錯(debugging)或者了解為了節(jié)省空間而對key使用特殊編碼的情況闹蒜。
當將Redis用作緩存程序時寺枉,你也可以通過 OBJECT 命令中的信息,決定key的驅逐策略(eviction policies)绷落。
OBJECT 命令有多個子命令:
- OBJECT REFCOUNT <key>
返回給定key姥闪,引用所儲存的值的次數(shù)。此命令主要用于除錯砌烁。 - OBJECT ENCODING <key>
返回給定key筐喳,鎖儲存的值所使用的內部表示(representation)。 - OBJECT IDLETIME <key>
返回給定key函喉,自儲存以來的空閑時間(idle避归, 沒有被讀取也沒有被寫入),以秒為單位管呵。
對象可以以多種方式編碼:
- 字符串可以被編碼為raw(一般字符串)或int(為了節(jié)約內存梳毙,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)會自動轉換成通用類型(general type)懂从。
返回值:
REFCOUNT和IDLETIME返回數(shù)字。
ENCODING返回相應的編碼類型
# 設置一個字符串
redis> SET game "COD"
OK
# 只有一個引用
redis> OBJECT REFCOUNT game
(integer) 1
# 等待一陣蹲蒲。番甩。。然后查看空閑時間
redis> OBJECT IDLETIME game
(integer) 90
# 提取game届搁, 讓它處于活躍(active)狀態(tài)
redis> GET game
"COD"
# 不再處于空閑狀態(tài)
redis> OBJECT IDLETIME game
(integer) 0
# 字符串的編碼方式
redis> OBJECT ENCODING game
"raw"
# 非常長的數(shù)字會被編碼為字符串
redis> SET big-number 23102930128301091820391092019203810281029831092
OK
redis> OBJECT ENCODING big-number
"raw"
# 而短的數(shù)字則會被編碼為整數(shù)
redis> SET small-number 12345
OK
redis> OBJECT ENCODING small-number
"int"
10.PERSIST
PERSIST key
移除給定key的生存時間缘薛,將這個key從『易失的』(帶生存時間key)轉換成『持久的』(一個不帶生存時間窍育、永不過期的key)。
返回值:
當生存時間移除成功時宴胧,返回1.
如果key不存在或key沒有設置生存時間漱抓,返回0。
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
11.PEXPIRE
PEXPIRE key milliseconds
這個命令和 EXPIRE 命令的作用類似恕齐,但是它以毫秒為單位設置 key的生存時間乞娄,而不像 EXPIRE 命令那樣,以秒為單位显歧。
返回值:
設置成功仪或,返回 1
key不存在或設置失敗,返回 0
redis> SET mykey "Hello"
OK
redis> PEXPIRE mykey 1500
(integer) 1
redis> TTL mykey # TTL 的返回值以秒為單位
(integer) 2
redis> PTTL mykey # PTTL 可以給出準確的毫秒數(shù)
(integer) 1499
12.PEXPIREAT
PEXPIREAT key milliseconds-timestamp
這個命令和 EXPIREAT 命令類似士骤,但它以毫秒為單位設置 key的過期 unix 時間戳范删,而不是像 EXPIREAT 那樣,以秒為單位拷肌。
返回值:
如果生存時間設置成功到旦,返回 1。
當 key不存在或沒辦法設置生存時間時巨缘,返回 0 添忘。(查看 EXPIRE 命令獲取更多信息)
redis> SET mykey "Hello"
OK
redis> PEXPIREAT mykey 1555555555005
(integer) 1
redis> TTL mykey # TTL 返回秒
(integer) 223157079
redis> PTTL mykey # PTTL 返回毫秒
(integer) 223157079318
13.PTTL
PTTL key
這個命令類似于 TTL 命令,但它以毫秒為單位返回 key 的剩余生存時間若锁,而不是像 TTL 命令那樣昔汉,以秒為單位。
返回值:
當 key不存在時拴清,返回 -2靶病。
當 key存在但沒有設置剩余生存時間時,返回 -1口予。
否則娄周,以毫秒為單位,返回 key的剩余生存時間沪停。
# 不存在的 key
redis> FLUSHDB
OK
redis> PTTL key
(integer) -2
# key 存在煤辨,但沒有設置剩余生存時間
redis> SET key value
OK
redis> PTTL key
(integer) -1
# 有剩余生存時間的 key
redis> PEXPIRE key 10086
(integer) 1
redis> PTTL key
(integer) 6179
14.RANDOMKEY
RANDOMKEY
從當前數(shù)據(jù)庫中隨機返回(不刪除)一個 key。
返回值:
當數(shù)據(jù)庫不為空時木张,返回一個 key众辨。
當數(shù)據(jù)庫為空時,返回 nil舷礼。
# 數(shù)據(jù)庫不為空
redis> MSET fruit "apple" drink "beer" food "cookies" # 設置多個 key
OK
redis> RANDOMKEY
"fruit"
redis> RANDOMKEY
"food"
redis> KEYS * # 查看數(shù)據(jù)庫內所有key鹃彻,證明 RANDOMKEY 并不刪除 key
1) "food"
2) "drink"
3) "fruit"
# 數(shù)據(jù)庫為空
redis> FLUSHDB # 刪除當前數(shù)據(jù)庫所有 key
OK
redis> RANDOMKEY
(nil)
15.RENAME
RENAME key newkey
將 key改名為 newkey。
當 key和 newkey相同妻献,或者 key不存在時蛛株,返回一個錯誤团赁。
當 newkey已經(jīng)存在時, RENAME 命令將覆蓋舊值谨履。
返回值:
改名成功時提示 OK 欢摄,失敗時候返回一個錯誤。
# key 存在且 newkey 不存在
redis> SET message "hello world"
OK
redis> RENAME message greeting
OK
redis> EXISTS message # message 不復存在
(integer) 0
redis> EXISTS greeting # greeting 取而代之
(integer) 1
# 當 key 不存在時笋粟,返回錯誤
redis> RENAME fake_key never_exists
(error) ERR no such key
# newkey 已存在時怀挠, RENAME 會覆蓋舊 newkey
redis> SET pc "lenovo"
OK
redis> SET personal_computer "dell"
OK
redis> RENAME pc personal_computer
OK
redis> GET pc
(nil)
redis:1> GET personal_computer # 原來的值 dell 被覆蓋了
"lenovo"
16.RENAMENX
RENAMENX key newkey
當且僅當 newkey 不存在時,將 key改名為 newkey 害捕。
當 key 不存在時绿淋,返回一個錯誤。
返回值:
修改成功時吨艇,返回 1立肘。
如果 newkey 已經(jīng)存在画切,返回 0。