目录
- Redis事务
- 事务的操作
- 事务的工作流程
- Watch锁
- 分布式锁
- Redis中数据的删除策略
- 一、过期数据
- 定时过期
- 惰性过期
- 定期过期
- 二、内存淘汰策略
一、Redis事务
跳转到目录
- redis事务就是一个命令执行的队列,将一系列预定义命令包装成一个整体(一个队列)。当执行时,一次性按照添加顺序依次执行,中间不会被打断或者干扰
Redis 事务本质
:一组命令的集合, 一个事务中的所有命令
都会被序列化
,在事务执行过程的中,会按照顺序
执行!Redis事务没有没有隔离级别的概念!
- 所有的命令在事务中,并没有直接被执行!只有发起
执行命令exec
的时候才会执行;
Redis单条命令式保存原子性的,但是事务不保证原子性!
redis的事务:
- 开启事务(
multi
) - 命令入队(…)
- 执行事务(
exec
)
1、 事务的操作
跳转到目录
- 没有添加事务的时候
- 同一个服务器开了
两个客户端
, 同时操作name
, 此时就无法保证name
的一致性; 添加事务
- 使用
MULTI
和EXEC
命令就可以保证事务的一致性;
2、事务的工作流程
跳转到目录
3、Watch锁
跳转到目录
- 线程1用来监听一个key, 当事务还没执行完, 别的线程2去操作这个key, 此时watch就会通知线程1; 本次事务就失败了
watch锁操作
当一个事务执行完
后,watch监视锁
就会释放
掉; 为了演示当修改money的时候事务会执行失败
, 此时还用两个窗口来模拟多线程;
当这个事务还没结束的时候, 修改money;
此时事务就执行失败, 因为 watch一直在监听着money
, 如果有别的线程修改该属性
,watch
就会通知事务
, Money被修改, 本次事务就执行失败
了!
4、分布式锁
setnx
跳转到目录
类似一种同步锁
操作, setnx
当key不存在
的时候才可以操作;
二、Redis中数据的删除策略
跳转到目录
1、过期数据
跳转到目录
如果不删除, 将消耗内存, 删除策略如下:
- 定时删除
- 惰性删除
- 定期删除
Redis中的数据,在expire中以哈希的方式保存在其中。其value是数据在内存中的地址,filed是对应的生命周期
1、定时删除
跳转到目录
拿处理器的性能换取空间 :
时间换空间
2、惰性删除
跳转到目录
存储空间换取处理器性能 : 时间换空间
3、定期删除
跳转到目录
周期性抽查存储空间 (随机抽查, 重点抽查)
三种删除策略的对比
2、内存淘汰策略
跳转到目录
Redis详解(十一)------ 过期删除策略和内存淘汰策略
- 在Redis中, 当每执行一个
写命令
的时候, 都会调用freeMemoryIfNeeded()
的函数, 检测内存是否充足; 如果内存不足, 会临时删除一些数据, 清除数据的策略就是逐出算法- 对数据尝试清除后, 内存仍然不够存入当前的写命令, 此时就会报
OOM
错误 (内存溢出)
- LRU:最长时间没被使用的数据
- LFU:一段时间内使用次数最少的数据