发布订阅、事务和脚本

发布订阅

  1. Redis 发布订阅:发布者将消息发送到channel中,订阅了这个channel的订阅者可以获取这个channel中的数据
  2. Redis 订阅者可以订阅任意数量的channel
  3. Redis 发布订阅架构:发布者和订阅者都是 Redis 的客户端,channel是Redis的服务端
    1. 发布者
    2. 订阅者
    3. channel

Redis 发布订阅的命令

  1. publish channel message:将消息发送到指定的channel中(返回订阅了该频道的订阅者数量)
    1. publish mychannel "This is redis message"
  2. subscribe channel1 ... channelN:订阅一个或多个channel
    1. subscribe mychannel
  3. unsubscribe channel1 ... channelN:退订一个或多个channel
    1. unsubscribe mychannel
  4. psubscribe pattern1 ... patternN:订阅一个或者多个符合给定模式的的频道(每个模式以 * 作为通配符)
    1. psubscribe my*
    2. psubscribe mychannel
  5. punsubscribe patter1 ... patternN:退订一个或者多个符合给定模式的的频道(每个模式以 * 作为通配符)
    1. punsubscribe my*
  6. pubsub channles [pattern]:查看所有被subscribe命令订阅的频道(使用pattern则表示返回频道的名称满足对应的模板)
    1. pubsub channels
    2. pubsub channels my*
  7. pub numsub channel ... channelN:查看频道的订阅者数目(不包括订阅模式的客户端订阅者)
    1. pubsub numsub mychannel4  mychannel5 mychannel6
  8. pubsub numpat:所有客户端使用订阅模式(使用命令PSUBSCRIBE)订阅的模式数量的总和
    1. pubsub numpat 

 

事务

  1. Redis 事务的特性
    1. 事务中可以一次执行多个命令进行批量操作
    2. Redis 单条命令的执行是原子性的
    3. Redis 事务的执行并不是原子性的( Redis 没有在事务上增加任何维持原子性的机制)
  2. 事务执行的三个阶段
    1. 开始事务:使用 MULTI 表示一个事务的开启
    2. 事务入队列
    3. 执行事务:使用 EXEC 表示事务开始执行
  3. Redis 事务的三个重要保证
    1. 批量操作在发送 EXEC 命令前被放入队列缓存
    2. 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败都不影响其他命令的执行
    3. 在事务执行过程中,其他客户端提交的命令请求不会插入到事务的执行命令序列中
  4. Redis 事务的五个命令
    1. multi:标记一个事务块的开启
    2. exec:执行事务块内的所有的命令(返回事务块内多有命令的返回值 )
    3. discard:取消事务(放弃执行事务块内的所有命令)
    4. Watch key_name1 ... key_nameN:监听一个或者多个key(如果在事务执行之前这些Key被其他命令所修改,那么事务将被打断)
    5. unwatch:取消所有的监听
  5. 事务实例:先以 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

脚本

  1. Redis 脚本使用 lua 解释器来执行脚本
  2. Redis2.6 通过内嵌支持 Lua 环境

Redis 脚本的命令

  1. eval script numkeys key_name1 ... key_nameN arg1 ... argN:执行一个脚本script
    1. script:脚本程序代码
    2. numkeys:指定 key 的数目
    3. key_name1 ... key_nameN:脚本中引用到的key
    4. arg1 ... argN:脚本中引用到的参数
    5. 注意点:脚本中引用key_name和arg参数,可以使用全局变量KEYS和ARGV数组进行引用(KEYS和ARGV都必须大写)
    6. 实例: eval "return {KEYS[1],ARGV[1],KEYS[2],ARGV[2]}" 2 name age Weiking 27
  2. script load script:将脚本加载到脚本缓存中(不会立即执行该脚本;返回脚本的sha1校验和)
    1. script load "return {KEYS[1],ARGV[1],KEYS[2],ARGV[2]}"
    2. script load "return {KEYS[0]},ARGV[0],KEYS[1],ARGV[1]}"
  3. script exists sha11 ... sha1N:判断 sha1 对应的脚本是否已经加载到脚本缓存中
    1. script exists da95252e2c27e41cd53b9114f28b4ba84e7d64d4
  4. script flush:用于清空所有的脚本缓存
  5. script kill:杀死当前正在运行所有的脚本(当且仅当这个脚本没有执行过任何写操作时候该命令才会生效)
    1. 该命令的作用主要作用是用于终止运行时间过长的脚本(比如一个因为 BUG 而发生无限循环的脚本)
    2. script kill
  6. evalsha sha1 numkeys key_name1 ... key_nameN arg1 ... argN:根据给定的 sha 校验码,执行脚本缓存中的脚本
    1. sha1:脚本缓存中脚本对应的 sha 码
    2. numkeys:指定 key 的数目
    3. key_name1 ... key_nameN:脚本中引用到的key
    4. arg1 ... argN:脚本中引用到的参数
    5. 实例:evalsha da95252e2c27e41cd53b9114f28b4ba84e7d64d4 2 name age Weiking 27
posted @ 2020-09-22 14:44  WeiKing  阅读(136)  评论(0编辑  收藏  举报