栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Redis 高级应用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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倍。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/919129.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号