发布与订阅
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的链表,记录了监视器。