发布订阅、事务和脚本
发布订阅
- Redis 发布订阅:发布者将消息发送到channel中,订阅了这个channel的订阅者可以获取这个channel中的数据
- Redis 订阅者可以订阅任意数量的channel
- Redis 发布订阅架构:发布者和订阅者都是 Redis 的客户端,channel是Redis的服务端
- 发布者
- 订阅者
- channel
Redis 发布订阅的命令
- publish channel message:将消息发送到指定的channel中(返回订阅了该频道的订阅者数量)
- publish mychannel "This is redis message"
- subscribe channel1 ... channelN:订阅一个或多个channel
- subscribe mychannel
- unsubscribe channel1 ... channelN:退订一个或多个channel
- unsubscribe mychannel
- psubscribe pattern1 ... patternN:订阅一个或者多个符合给定模式的的频道(每个模式以 * 作为通配符)
- psubscribe my*
- psubscribe mychannel
- punsubscribe patter1 ... patternN:退订一个或者多个符合给定模式的的频道(每个模式以 * 作为通配符)
- punsubscribe my*
- pubsub channles [pattern]:查看所有被subscribe命令订阅的频道(使用pattern则表示返回频道的名称满足对应的模板)
- pubsub channels
- pubsub channels my*
- pub numsub channel ... channelN:查看频道的订阅者数目(不包括订阅模式的客户端订阅者)
- pubsub numsub mychannel4 mychannel5 mychannel6
- pubsub numpat:所有客户端使用订阅模式(使用命令PSUBSCRIBE)订阅的模式数量的总和
- pubsub numpat
事务
- Redis 事务的特性
- 事务中可以一次执行多个命令进行批量操作
- Redis 单条命令的执行是原子性的
- Redis 事务的执行并不是原子性的( Redis 没有在事务上增加任何维持原子性的机制)
- 事务执行的三个阶段
- 开始事务:使用 MULTI 表示一个事务的开启
- 事务入队列
- 执行事务:使用 EXEC 表示事务开始执行
- Redis 事务的三个重要保证
- 批量操作在发送 EXEC 命令前被放入队列缓存
- 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败都不影响其他命令的执行
- 在事务执行过程中,其他客户端提交的命令请求不会插入到事务的执行命令序列中
- Redis 事务的五个命令
- multi:标记一个事务块的开启
- exec:执行事务块内的所有的命令(返回事务块内多有命令的返回值 )
- discard:取消事务(放弃执行事务块内的所有命令)
- Watch key_name1 ... key_nameN:监听一个或者多个key(如果在事务执行之前这些Key被其他命令所修改,那么事务将被打断)
- unwatch:取消所有的监听
- 事务实例:先以 Multi 开启一个事务,然后将多个命令入队到事务中,最后由 EXEC 命令触发事务(并执行事务中的所有命令)
#监听characteristic watch characteristic #开启一个任务 multi #任务入队 set name "This is Redis" sadd characteristic key-value In-memory-database get name smembers characteristic hget characteristic name #触发事务的执行 exec
脚本
- Redis 脚本使用 lua 解释器来执行脚本
- Redis2.6 通过内嵌支持 Lua 环境
Redis 脚本的命令
- eval script numkeys key_name1 ... key_nameN arg1 ... argN:执行一个脚本script
- script:脚本程序代码
- numkeys:指定 key 的数目
- key_name1 ... key_nameN:脚本中引用到的key
- arg1 ... argN:脚本中引用到的参数
- 注意点:脚本中引用key_name和arg参数,可以使用全局变量KEYS和ARGV数组进行引用(KEYS和ARGV都必须大写)
- 实例: eval "return {KEYS[1],ARGV[1],KEYS[2],ARGV[2]}" 2 name age Weiking 27
- script load script:将脚本加载到脚本缓存中(不会立即执行该脚本;返回脚本的sha1校验和)
- script load "return {KEYS[1],ARGV[1],KEYS[2],ARGV[2]}"
- script load "return {KEYS[0]},ARGV[0],KEYS[1],ARGV[1]}"
- script exists sha11 ... sha1N:判断 sha1 对应的脚本是否已经加载到脚本缓存中
- script exists da95252e2c27e41cd53b9114f28b4ba84e7d64d4
- script flush:用于清空所有的脚本缓存
- script kill:杀死当前正在运行所有的脚本(当且仅当这个脚本没有执行过任何写操作时候该命令才会生效)
- 该命令的作用主要作用是用于终止运行时间过长的脚本(比如一个因为 BUG 而发生无限循环的脚本)
- script kill
- evalsha sha1 numkeys key_name1 ... key_nameN arg1 ... argN:根据给定的 sha 校验码,执行脚本缓存中的脚本
- sha1:脚本缓存中脚本对应的 sha 码
- numkeys:指定 key 的数目
- key_name1 ... key_nameN:脚本中引用到的key
- arg1 ... argN:脚本中引用到的参数
- 实例:evalsha da95252e2c27e41cd53b9114f28b4ba84e7d64d4 2 name age Weiking 27