Redis 高级应用

发布订阅模式

方法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"

事务执行时遇到异常怎么处理

  1. 执行exec之前出现异常,整个事务会取消
    在这里插入图片描述
  2. 执行exec之后出现异常,会出现原子性问题,需要修改事务内的代码

Lua脚本

为什么使用Lua脚本?

  1. 批量执行命令
  2. 原子性
  3. 操作集合的复用

执行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

触发

  1. 自动触发:配置规则触发 / shutdown触发 / flushall触发
  2. 手动触发:save / bgsave

特点

  1. 内容紧凑
  2. 不影响主进程
  3. 恢复大数据集时速度快
  4. 同步频率

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倍。
在这里插入图片描述


版权声明:本文为it_wxw原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。