发布订阅模式
方法1
订阅频道:可以一次订阅多个频道
subscribe channel-1 channel-2 channel-3
向指定频道发布消息:
publish channel-1 1234
取消订阅(不能在订阅状态下使用):
unsubscribe channel-1
方法2
消费端1,关注运动信息
psubscribe *sport
向指定频道发布消息:
publish swim-sport sunyang
Redis事务
multi 开启事务
exec 执行事务
discard 取消事务
watch 乐观锁
简单事务演示
a和b各有1000元,a向b转100元
127.0.0.1:6379> set a 1000 --- a 设值1000
OK
127.0.0.1:6379> set b 1000 --- b 设值1000
OK
127.0.0.1:6379> multi --- 开启事务
OK
127.0.0.1:6379> decrby a 100 --- a 减去100元
QUEUED
127.0.0.1:6379> incrby b 100 --- b 加上100元
QUEUED
127.0.0.1:6379> exec --- 执行事务
1) (integer) 900
2) (integer) 1100
127.0.0.1:6379> mget a b -- 获得a、b的值
1) "900"
2) "1100"
watch使用
127.0.0.1:6379> set a 1000 -- 设值1000
OK
127.0.0.1:6379> watch a -- 乐观锁
OK
127.0.0.1:6379> multi -- 开启事务
OK
127.0.0.1:6379> incrby a 100 -- 加上100
QUEUED
另外一个线程对a减去200
127.0.0.1:6379> decrby a 200
(integer) 800
切换到第一个线程
127.0.0.1:6379> exec -- 提交事务失败
(nil)
127.0.0.1:6379> get a
"800"
事务执行时遇到异常怎么处理
- 执行exec之前出现异常,整个事务会取消

- 执行exec之后出现异常,会出现原子性问题,需要修改事务内的代码
Lua脚本
为什么使用Lua脚本?
- 批量执行命令
- 原子性
- 操作集合的复用
执行Lua脚本命令
eval lua-script key-num [key…] [value…]
eval:代表执行Lua脚本的命令
lua-script:Lua语言的脚本内容
key-num:有几个参数
key、value:参数,可填可不填
例如:
127.0.0.1:6379> eval 'return "hello!!!"' 0
"hello!!!"
Lua脚本中执行Redis命令
redis.call(command, key [param1,param2…])
command是命令,比如set、get、del等
key 是被操作的键
param1、param2代表给key的参数

Lua脚本文件
reids-cli --eval qs.lua 0
过期策略
惰性过期:key被访问的时候才能判断是否过期,过期则删除
定期过期:每隔一段时间,清楚一定数量的过期key
淘汰策略
当Redis内存达到极限的时候,需要使用淘汰策略清理一些数据。
LRU(Least Recently Used最近最少使用)/LFU(Least Frequently Used最不经常使用)
volatile / allkeys
volatile-lru
allkeys-lru
volatile-lfu
allkeys-lfu
volatile-random
allkeys-random
volatile-ttl
noeviction
LRU算法怎么实现
Redis中的LRU通过随机采样,找出热度最低的数据淘汰。
每个key值有个LRU属性,保存时间戳,这个时间戳从全局变量中获取,全局变量每隔100ms更新。
key值得LRU属性与全局变量相差越大,则表示越久没被访问。
LFU算法怎么实现
key值还有一个LFU访问频率得属性,每访问多少次(lfu-log-factor)加1,该属性还会递减(lfu-decay-time)。
持久化机制
RDB:Redis DataBase
AOF:Append Only File
RDB
触发
- 自动触发:配置规则触发 / shutdown触发 / flushall触发
- 手动触发:save / bgsave
特点
- 内容紧凑
- 不影响主进程
- 恢复大数据集时速度快
- 同步频率
AOF
AOF是将执行的命令保存在日志中,恢复时直接执行日志中的命令。
AOF开启
AOF默认不开启,需要在配置文件中手动开启。
AOF写入时机
AOF并不是实时的将内存中的数据写入文件中,而是通过配置文件来选择不同的策略。
appendfsync no:不会在某些情况下将缓存区的内容写入日志,不会影响性能,不太保险。
appendfsync always:每次写入/修改一个key的时候都会写入日志,影响性能,但是最保险。
appendfsync everysec:每一秒写入日志,比较中和,默认的方式。
AOF日志文件越来越大怎么办?
手动:通过bgrewriteaof命令对aof日志文件进行重写
自动:通过配置文件中的配置进行重写
auto-aof-rewrite-percentage 100 -- 百分比,上一次重写前文件大小的比例
auto-aof-rewrite-min-size 64mb -- 文件的大小
Pipeline
pipeline(管道)就是在客户端把一批命令缓存起来,然后一次性发送到Redis,同时将执行的结果批量的返回回来,减少网络通信的开销。
该代码每次都将命令发送给Redis,10000条最终执行时间是13秒
使用pipeline后,100W条命令同样是13秒,是上面的100倍。