Redis 發佈與訂閱 和 鍵的過期時間

發佈和訂閱

每當有消息被髮送至給定頻道時, 頻道的所有訂閱者都會收到消息.

訂閱

SUBSCRIBE channel [channel …]

訂閱給定的一個或多個頻道的信息.

返回接收到的信息(請參見下面的代碼說明).

# 訂閱 msg 和 chat_room 兩個頻道

# 1 - 6 行是執行 subscribe 之後的反饋信息
# 第 7 - 9 行纔是接收到的第一條信息
# 第 10 - 12 行是第二條

redis> subscribe msg chat_room
Reading messages... (press Ctrl-C to quit)
1) "subscribe"       # 返回值的類型:顯示訂閱成功
2) "msg"             # 訂閱的頻道名字
3) (integer) 1       # 目前已訂閱的頻道數量

1) "subscribe"
2) "chat_room"
3) (integer) 2

1) "message"         # 返回值的類型:信息
2) "msg"             # 來源(從那個頻道發送過來)
3) "hello moto"      # 信息內容

1) "message"
2) "chat_room"
3) "testing...haha"

UNSUBSCRIBE [channel [channel …]]

指示客戶端退訂給定的頻道.

如果沒有頻道被指定, 也即是, 一個無參數的 UNSUBSCRIBE 調用被執行, 那麼客戶端使用 SUBSCRIBE 命令訂閱的所有頻道都會被退訂. 在這種情況下, 命令會返回一個信息, 告知客戶端所有被退訂的頻道.


PSUBSCRIBE pattern [pattern …]

訂閱一個或多個符合給定模式的頻道.

每個模式以 * 作爲匹配符, 比如 it* 匹配所有以 it 開頭的頻道( it.news it.blog it.tweets 等等), news.* 匹配所有以 news. 開頭的頻道( news.it news.global.today 等等), 諸如此類.

返回接收到的信息(請參見下面的代碼說明)

# 訂閱 news.* 和 tweet.* 兩個模式

# 第 1 - 6 行是執行 psubscribe 之後的反饋信息
# 第 7 - 10 纔是接收到的第一條信息
# 第 11 - 14 是第二條
# 以此類推。。。

redis> psubscribe news.* tweet.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"                  # 返回值的類型:顯示訂閱成功
2) "news.*"                      # 訂閱的模式
3) (integer) 1                   # 目前已訂閱的模式的數量

1) "psubscribe"
2) "tweet.*"
3) (integer) 2

1) "pmessage"                    # 返回值的類型:信息
2) "news.*"                      # 信息匹配的模式
3) "news.it"                     # 信息本身的目標頻道
4) "Google buy Motorola"         # 信息的內容

1) "pmessage"
2) "tweet.*"
3) "tweet.huangz"
4) "hello"

1) "pmessage"
2) "tweet.*"
3) "tweet.joe"
4) "@huangz morning"

1) "pmessage"
2) "news.*"
3) "news.life"
4) "An apple a day, keep doctors away"

PUNSUBSCRIBE [pattern [pattern …]]

指示客戶端退訂所有給定模式.

如果沒有模式被指定, 也即是, 一個無參數的 PUNSUBSCRIBE 調用被執行, 那麼客戶端使用 PSUBSCRIBE pattern [pattern …] 命令訂閱的所有模式都會被退訂. 在這種情況下, 命令會返回一個信息, 告知客戶端所有被退訂的模式.

發佈

PUBLISH channel message

將信息 message 發送到指定的頻道 channel.

返回接收到信息 message 的訂閱者數量.

# 對沒有訂閱者的頻道發送信息

redis> publish bad_channel "can any body hear me?"
(integer) 0


# 向有一個訂閱者的頻道發送信息

redis> publish msg "good morning"
(integer) 1


# 向有多個訂閱者的頻道發送信息

redis> publish chat_room "hello~ everyone"
(integer) 3

鍵的過期時間

在使用 Redis 存儲數據的時候, 有些數據可能在某個時間點之後就不再有用了, 用戶可以使用 DEL 命令顯示的刪除這些無用元素, 也可以通過 Redis 的過期時間特性來讓鍵在給定的時限之後自動刪除.

當我們說一個鍵"帶有生存時間" 或 "會在特定時間之後過期" 時, 我們指的是 Redis 會在這個鍵的過期時間達到時自動刪除該鍵.

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 命令, 新指定的生存時間會取代舊的生存時間.

過期時間的精確度

設置成功返回 1. 當 key 不存在或者不能爲 key 設置生存時間時, 返回 0.


TTL key

以秒爲單位, 返回給定 key 的剩餘生存時間(TTL, time to live).

當 key 不存在時, 返回 -2. 當 key 存在但沒有設置剩餘生存時間時, 返回 -1. 否則, 以秒爲單位, 返回 key 的剩餘生存時間.


PEXPIRE key milliseconds

這個命令和 EXPIRE 命令的作用類似, 但是它以毫秒爲單位設置 key 的生存時間, 而不像 EXPIRE 命令那樣, 以秒爲單位.

設置成功, 返回 1 key 不存在或設置失敗, 返回 0.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章