1. 程式人生 > 其它 >redis第一篇Key(鍵

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
的 Redis 物件的數量,而 M 則是這些物件的平均大小。 如果序列化的物件是比較小的字串,那麼複雜度為 O(1) 。
返回值:
如果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來移除,或者被SETGETSET命令覆寫(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),可以用INCRRPUSH命令在 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