redis第一篇Key(鍵
DEL
DEL key [key ...]
刪除給定的一個或多個key。
不存在的key會被忽略。
- 可用版本:
- >= 1.0.0
- 時間複雜度:
- O(N),N為被刪除的key的數量。 刪除單個字串型別的key,時間複雜度為O(1)。 刪除單個列表、集合、有序集合或雜湊表型別的key,時間複雜度為O(M),M為以上資料結構內的元素數量。
- 返回值:
- 被刪除key的數量。
-
# 刪除單個 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
DUMP
DUMP key
序列化給定key,並返回被序列化的值,使用RESTORE命令可以將這個值反序列化為 Redis 鍵。
序列化生成的值有以下幾個特點:
- 它帶有 64 位的校驗和,用於檢測錯誤,RESTORE在進行反序列化之前會先檢查校驗和。
- 值的編碼格式和 RDB 檔案保持一致。
- RDB 版本會被編碼在序列化值當中,如果因為 Redis 的版本不同造成 RDB 格式不相容,那麼 Redis 會拒絕對這個值進行反序列化操作。
序列化的值不包括任何生存時間資訊。
- 可用版本:
- >= 2.6.0
- 時間複雜度:
-
查詢給定鍵的複雜度為 O(1) ,對鍵進行序列化的複雜度為 O(N*M) ,其中 N 是構成key
- 返回值:
- 如果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)
EXISTS
EXISTS key
檢查給定key是否存在。
- 可用版本:
- >= 1.0.0
- 時間複雜度:
- O(1)
- 返回值:
- 若key存在,返回1,否則返回0。
redis> SET db "redis" OK redis> EXISTS db (integer) 1 redis> DEL db (integer) 1 redis> EXISTS db (integer) 0
EXPIRE
EXPIRE key seconds
為給定key設定生存時間,當key過期時(生存時間為0),它會被自動刪除。
在 Redis 中,帶有生存時間的key被稱為『易失的』(volatile)。
生存時間可以通過使用DEL命令來刪除整個key來移除,或者被SET和GETSET命令覆寫(overwrite),這意味著,如果一個命令只是修改(alter)一個帶生存時間的key的值而不是用一個新的key值來代替(replace)它的話,那麼生存時間不會被改變。
比如說,對一個key執行INCR命令,對一個列表進行LPUSH命令,或者對一個雜湊表執行HSET命令,這類操作都不會修改key本身的生存時間。
另一方面,如果使用RENAME對一個key進行改名,那麼改名後的key的生存時間和改名前一樣。
RENAME命令的另一種可能是,嘗試將一個帶生存時間的key改名成另一個帶生存時間的another_key,這時舊的another_key(以及它的生存時間)會被刪除,然後舊的key會改名為another_key,因此,新的another_key的生存時間也和原本的key一樣。
使用PERSIST命令可以在不刪除key的情況下,移除key的生存時間,讓key重新成為一個『持久的』(persistent)key。
更新生存時間
可以對一個已經帶有生存時間的key執行EXPIRE命令,新指定的生存時間會取代舊的生存時間。
過期時間的精確度
在 Redis 2.4 版本中,過期時間的延遲在 1 秒鐘之內 —— 也即是,就算key已經過期,但它還是可能在過期之後一秒鐘之內被訪問到,而在新的 Redis 2.6 版本中,延遲被降低到 1 毫秒之內。
Redis 2.1.3 之前的不同之處
在 Redis 2.1.3 之前的版本中,修改一個帶有生存時間的key會導致整個key被刪除,這一行為是受當時複製(replication)層的限制而作出的,現在這一限制已經被修復。
- 可用版本:
- >= 1.0.0
- 時間複雜度:
- O(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
模式:導航會話
假設你有一項 web 服務,打算根據使用者最近訪問的 N 個頁面來進行物品推薦,並且假設使用者停止閱覽超過 60 秒,那麼就清空閱覽記錄(為了減少物品推薦的計算量,並且保持推薦物品的新鮮度)。
這些最近訪問的頁面記錄,我們稱之為『導航會話』(Navigation session),可以用INCR和RPUSH命令在 Redis 中實現它:每當使用者閱覽一個網頁的時候,執行以下程式碼:
MULTI RPUSH pagewviews.user:<userid> http://..... EXPIRE pagewviews.user:<userid> 60 EXEC
如果使用者停止閱覽超過 60 秒,那麼它的導航會話就會被清空,當用戶重新開始閱覽的時候,系統又會重新記錄導航會話,繼續進行物品推薦。
EXPIREAT
EXPIREAT key timestamp
EXPIREAT的作用和EXPIRE類似,都用於為key設定生存時間。
不同在於EXPIREAT命令接受的時間引數是 UNIX 時間戳(unix timestamp)。
- 可用版本:
- >= 1.2.0
- 時間複雜度:
- O(1)
- 返回值:
- 如果生存時間設定成功,返回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