Redis 发布订阅和事务

127 阅读2分钟

发布与订阅

publisher, subscriber和 channel, 发布者和订阅者是客户端,channel是服务端

subscribe ch1 ch2
publish ch1 hello
unsubscribe ch1
psubscribe ch*
punsubscribe ch*

Redis事务

Redis事务通过multi,exec, discard和watch,unwatch来完成, 单个命令是原子的, 不支持回滚操作。

弱事务性

Redis语法错误

整个事务的命令在队列里都清除

Redis运行错误

队列里正确的命令可以执行

Redis不支持回滚

  • 大部分事务失败是因为语法错误或类型错误,这两种错误开发阶段可以预见
  • 为了性能忽略了事务回滚

lua

EVAL script numkeys key[key ...]arg[arg ...]
eval "return {KEYS[1], KEYS[2], ARG[1], ARG[2]}" 2 key1 key2 first second

lua调用redis是通过 redis.call 和redis.pcall()调用

eval "return redis.call('set', KEYS[1], ARGV[1])" 1 n1 zhao

SCRIPT FLUSH, SCRIPT EXISTS, SCRIPT LOAD 和 EVALSHA配合使用

script load "return redis.call('set', KEYS[1], ARGV	[1])"
evalsha c6.... 1 n fei

脚本复制

Redis传播Lua脚本, 在使用主从和开启AOF的前提下, 执行lua脚本有两种模式:

  • 脚本传播模式

    默认使用, Redis将被执行的脚本及参数复制到AOF文件以及从服务器里面。

    在这个模式下脚本中不能有时间, 内部状态, 随机函数(spop)等。

  • 命令传播模式

    主服务器会将执行脚本产生的所有写命令用事务包裹起来,将事务复制到AOF文件和从服务器中

    开启命令传播模式,在脚本里调用

    redis.replicate_commands()
    

慢查询

#执行时间超过多少微秒的命令记录到日志 0: 全记录  <0 不记录
slowlog-log-slower-than 10000
# 队列条数
slow-max-len

Redis使用列表存储慢查询日志,采用队列FIFO

慢查询的优化

  • 尽量使用短key,value尽可能精简
  • 避免使用keys *, hgetall
  • 减少大key的存取,打散成小key
  • 将rdb改为aof
  • 使用管道
  • 使用哈希
  • 限制redis的内存大小,避免redis使用swap分区或出现OOM错误

监视器

MONITOR命令可以将自己变成监视器, redisServer维护了一个monitors的链表,记录了监视器。