本文主要介绍 Redis 发布订阅、事务、脚本、连接四个方面的命令。
Redis 发布订阅
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。Redis 客户端可以订阅任意数量的频道。一个频道也可以被多个客户端订阅。
实例
创建了订阅频道名为 redisChat
1 | 127.0.0.1:6379> subscribe redisChat |
重新开启个 redis 客户端,然后在同一个频道 redisChat 发布消息,订阅者就能接收到消息。
1 | 127.0.0.1:6379> publish redisChat "Redis is a great caching technique" |
1 | 127.0.0.1:6379> subscribe redisChat |
Redis psubscribe
命令
订阅一个或多个符合给定模式的频道。可用版本 >= 2.0.0
每个模式以 * 作为匹配符,比如 redis* 匹配所有以 redis 开头的频道( redis.news 、 redis.blog等等)。
punsubscribe
命令用于退订所有给定模式的频道。与 psubscribe
类似。
语法
psubscribe pattern [pattern ...]
返回值
接收到的信息。
Redis subscribe
命令
用于订阅给定的一个或多个频道的信息。可用版本 >= 2.0.0
unsubscribe
命令用于退订所有给定模式的频道。与 subscribe
类似。
语法
subscribe channel [channel ...]
返回值
接收到的信息
Redis publish
命令
用于将信息发送到指定的频道。可用版本 >= 2.0.0
语法
publish channel message
返回值
接收到信息的订阅者数量。
Redis pubsub
命令
pubsub
是一个查看订阅与发布系统状态的内省命令,它由数个不同格式的子命令组成。可用版本 >= 2.8.0
语法
pubsub <subcommand> [argument [argument ...]]
channels
子命令
列出当前的活跃频道。活跃频道指的是那些至少有一个订阅者的频道,订阅模式的客户端不计算在内。
语法
pubsub channels [pattern]
pattern 参数是可选的,如果不给出 pattern 参数,那么列出订阅与发布系统中的所有活跃频道。如果给出 pattern 参数,那么只列出和给定模式 pattern 相匹配的那些活跃频道。
复杂度
O(N) , N 为活跃频道的数量(对于长度较短的频道和模式来说,将进行模式匹配的复杂度视为常数)。
返回值
一个由活跃频道组成的列表。
numsub
子命令
返回给定频道的订阅者数量, 订阅模式的客户端不计算在内。
语法
pubsub numsub [channel-1 ... channel-N]
复杂度
O(N), N 为给定频道的数量。
返回值
一个多条批量回复(Multi-bulk reply),回复中包含给定的频道,以及频道的订阅者数量。 格式为:频道 channel-1,channel-1 的订阅者数量,频道 channel-2,channel-2 的订阅者数量,诸如此类。 回复中频道的排列顺序和执行命令时给定频道的排列顺序一致。不给定任何频道而直接调用这个命令也是可以的,在这种情况下,命令只返回一个空列表。
numpat
子命令
返回订阅模式的数量。这个命令返回的不是订阅模式的客户端的数量,而是客户端订阅的所有模式的数量总和。当有多个客户端订阅相同的模式时,相同的订阅也被计算在内
语法
pubsub numpat
复杂度
O(1) 。
返回值
一个整数回复(Integer reply)。
Redis 事务
Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:
- 批量操作在发送
exec
命令前被放入队列缓存。 - 收到
exec
命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。 - 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
一个事务从开始到执行会经历三个阶段:开始事务->命令入队。->执行事务。
Redis multi
与exec
命令
用于标记一个事务块的开始。事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由exec
命令原子性(atomic)地执行。可用版本 >= 1.2.0
语法
multi
返回值
总是返回 OK 。
实例
1 | 127.0.0.1:6379> multi |
Redis discard
命令
用于取消事务,放弃执行事务块内的所有命令。可用版本 >= 2.0.0
语法
discard
返回值
总是返回 OK 。
实例
1 | 127.0.0.1:6379> multi |
Redis watch
命令
用于监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。可用版本 >= 2.2.0
语法
watch key [key ...]
返回值
总是返回 OK 。
Redis unwatch
命令
用于取消watch
命令对所有 key 的监视。可用版本 >= 2.2.0
语法
redis Unwatch 命令基本语法如下:
redis 127.0.0.1:6379> UNWATCH
返回值
总是返回 OK 。
Redis 脚本
Redis 脚本使用 Lua 解释器来执行脚本。 Redis 2.6 版本通过内嵌支持 Lua 环境。执行脚本的常用命令为 EVAL。
语法
EVAL script numkeys key [key ...] arg [arg ...]
实例
1 | 127.0.0.1:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second |
Redis eval
命令
使用 Lua 解释器执行脚本。可用版本 >= 2.6.0
语法
EVAL script numkeys key [key ...] arg [arg ...]
参数说明:
script: 参数是一段 Lua 5.1 脚本程序。脚本不必(也不应该)定义为一个 Lua 函数。
numkeys: 用于指定键名参数的个数。
key [key …]: 从 EVAL 的第三个参数开始算起,表示在脚本中所用到的那些 Redis 键(key),这些键名参数可以在 Lua 中通过全局变量 KEYS 数组,用 1 为基址的形式访问( KEYS[1] , KEYS[2] ,以此类推)。
arg [arg …]: 附加参数,在 Lua 中通过全局变量 ARGV 数组访问,访问的形式和 KEYS 变量类似( ARGV[1] 、 ARGV[2] ,诸如此类)。
Redis evalsha
命令
根据给定的 sha1 校验码,执行缓存在服务器中的脚本。可用版本 >= 2.6.0
将脚本缓存到服务器的操作可以通过SCRIPT LOAD
命令进行。
这个命令的其他地方,比如参数的传入方式,都和 EVAL
命令一样。
语法
EVALSHA sha1 numkeys key [key ...] arg [arg ...]
参数说明:
sha1 : 通过SCRIPT LOAD
生成的 sha1 校验码。
numkeys: 用于指定键名参数的个数。
key [key …]: 从 EVAL 的第三个参数开始算起,表示在脚本中所用到的那些 Redis 键(key),这些键名参数可以在 Lua 中通过全局变量 KEYS 数组,用 1 为基址的形式访问( KEYS[1] , KEYS[2] ,以此类推)。
arg [arg …]: 附加参数,在 Lua 中通过全局变量 ARGV 数组访问,访问的形式和 KEYS 变量类似( ARGV[1] 、 ARGV[2] ,诸如此类)。
实例
1 | 127.0.0.1:6379> SCRIPT LOAD "return 'hello freya'" |
Redis script exists
命令
用于校验指定的脚本是否已经被保存在缓存当中。可用版本 >= 2.6.0
语法
SCRIPT EXISTS sha1 [sha1 ...]
返回值
一个列表,包含 0 和 1 ,前者表示脚本不存在于缓存,后者表示脚本已经在缓存里面了。
列表中的元素和给定的 SHA1 校验和保持对应关系,比如列表的第三个元素的值就表示第三个 SHA1 校验和所指定的脚本在缓存中的状态。
实例
1 | 127.0.0.1:6379> SCRIPT LOAD "return 'hello freya'" |
Redis script kill
命令
用于杀死当前正在运行的 Lua 脚本,当且仅当这个脚本没有执行过任何写操作时,这个命令才生效。可用版本 >= 2.6.0
这个命令主要用于终止运行时间过长的脚本,比如一个因为 BUG 而发生无限循环的脚本。
script kill
执行之后,当前正在运行的脚本会被杀死,执行这个脚本的客户端会从EVAL
命令的阻塞当中退出,并收到一个错误作为返回值。
语法
script kill
返回值
总是返回 OK
Redis 连接
Redis 连接命令主要是用于连接 redis 服务。
实例
1 | 127.0.0.1:6379> auth "password" |
Redis auth
命令
用于检测给定的密码和配置文件中的密码是否相符。可用版本 >= 1.0.0
语法
auth pwd
返回值
密码匹配时返回 OK ,否则返回一个错误。
Redis echo
命令
用于打印给定的字符串。可用版本 >= 1.0.0
语法
echo message
返回值
返回字符串本身。
Redis Quit 命令
用于关闭与当前客户端与redis服务的连接。可用版本 >= 1.0.0
一旦所有等待中的回复(如果有的话)顺利写入到客户端,连接就会被关闭。
返回值
总是返回 OK 。
实例
1 | 127.0.0.1:6379> quit |
Redis select
命令
用于切换到指定的数据库,数据库索引号 index 用数字值指定,以 0 作为起始索引值。可用版本 >= 1.0.0
语法
select index
返回值
总是返回 OK 。