发布和订阅
每当有消息被发送至给定频道时, 频道的所有订阅者都会收到消息.
订阅
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 来移除, 或者被 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
命令, 新指定的生存时间会取代旧的生存时间.
过期时间的精确度
设置成功返回 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.