Redis命令4

本文主要介绍 Redis 发布订阅、事务、脚本、连接四个方面的命令。

Redis 发布订阅

Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。Redis 客户端可以订阅任意数量的频道。一个频道也可以被多个客户端订阅。

实例

创建了订阅频道名为 redisChat

1
2
3
4
5
127.0.0.1:6379> subscribe redisChat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redisChat"
3) (integer) 1

重新开启个 redis 客户端,然后在同一个频道 redisChat 发布消息,订阅者就能接收到消息。

1
2
127.0.0.1:6379> publish redisChat "Redis is a great caching technique"
(integer) 1
1
2
3
4
5
6
7
8
127.0.0.1:6379> subscribe redisChat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redisChat"
3) (integer) 1
1) "message"
2) "redisChat"
3) "Redis is a great caching technique"

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 事务可以一次执行多个命令, 并且带有以下三个重要的保证:

  1. 批量操作在发送exec命令前被放入队列缓存。
  2. 收到exec命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
  3. 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

一个事务从开始到执行会经历三个阶段:开始事务->命令入队。->执行事务。

Redis multiexec命令

用于标记一个事务块的开始。事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由exec命令原子性(atomic)地执行。可用版本 >= 1.2.0

语法

multi

返回值

总是返回 OK 。

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr user_id
QUEUED
127.0.0.1:6379> incr user_id
QUEUED
127.0.0.1:6379> incr user_id
QUEUED
127.0.0.1:6379> ping
QUEUED
127.0.0.1:6379> exec
1) (integer) 1
2) (integer) 2
3) (integer) 3
4) PONG
127.0.0.1:6379>

Redis discard命令

用于取消事务,放弃执行事务块内的所有命令。可用版本 >= 2.0.0

语法

discard

返回值

总是返回 OK 。

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr user_id
QUEUED
127.0.0.1:6379> incr user_id
QUEUED
127.0.0.1:6379> ping
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> exec
(error) ERR EXEC without MULTI
127.0.0.1:6379>

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
2
3
4
5
6
127.0.0.1:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
1) "key1"
2) "key2"
3) "first"
4) "second"
127.0.0.1:6379>

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
2
3
4
5
127.0.0.1:6379> SCRIPT LOAD "return 'hello freya'"
"bb758a1044e9f9b9e531491d56a9677c432e7216"
127.0.0.1:6379> evalsha "bb758a1044e9f9b9e531491d56a9677c432e7216" 0
"hello freya"
127.0.0.1:6379>

Redis script exists 命令

用于校验指定的脚本是否已经被保存在缓存当中。可用版本 >= 2.6.0

语法

SCRIPT EXISTS sha1 [sha1 ...]

返回值

一个列表,包含 0 和 1 ,前者表示脚本不存在于缓存,后者表示脚本已经在缓存里面了。

列表中的元素和给定的 SHA1 校验和保持对应关系,比如列表的第三个元素的值就表示第三个 SHA1 校验和所指定的脚本在缓存中的状态。

实例

1
2
3
4
5
6
7
8
9
127.0.0.1:6379> SCRIPT LOAD "return 'hello freya'"
"bb758a1044e9f9b9e531491d56a9677c432e7216"
127.0.0.1:6379> script exists "bb758a1044e9f9b9e531491d56a9677c432e7216"
1) (integer) 1
127.0.0.1:6379> script flush
OK
127.0.0.1:6379> script exists "bb758a1044e9f9b9e531491d56a9677c432e7216"
1) (integer) 0
127.0.0.1:6379>

Redis script kill 命令

用于杀死当前正在运行的 Lua 脚本,当且仅当这个脚本没有执行过任何写操作时,这个命令才生效。可用版本 >= 2.6.0

这个命令主要用于终止运行时间过长的脚本,比如一个因为 BUG 而发生无限循环的脚本。

script kill执行之后,当前正在运行的脚本会被杀死,执行这个脚本的客户端会从EVAL命令的阻塞当中退出,并收到一个错误作为返回值。

语法

script kill

返回值

总是返回 OK

Redis 连接

Redis 连接命令主要是用于连接 redis 服务。

实例

1
2
3
4
127.0.0.1:6379> auth "password"
OK
127.0.0.1:6379> ping
PONG

Redis auth 命令

用于检测给定的密码和配置文件中的密码是否相符。可用版本 >= 1.0.0

语法

auth pwd

返回值

密码匹配时返回 OK ,否则返回一个错误。

Redis echo 命令

用于打印给定的字符串。可用版本 >= 1.0.0

语法

echo message

返回值

返回字符串本身。

Redis Quit 命令

用于关闭与当前客户端与redis服务的连接。可用版本 >= 1.0.0

一旦所有等待中的回复(如果有的话)顺利写入到客户端,连接就会被关闭。

返回值

总是返回 OK 。

实例

1
2
127.0.0.1:6379> quit
$

Redis select 命令

用于切换到指定的数据库,数据库索引号 index 用数字值指定,以 0 作为起始索引值。可用版本 >= 1.0.0

语法

select index

返回值

总是返回 OK 。