这里写目录标题
一、redis双写一致性
缓存要和数据库保持一致
1.强一致性场景
一般解决方案
- 读操作:缓存命中直接返回;缓存未命中查询数据库,写入缓存,设定超时时间。
- 写操作:延时双删,但还是存在一定风险。
- 先删除缓存还是先修改数据库???
------两种操作都会出现不一致问题。 - 为什么删除两次???
------降低数据不一致的概率。 - 为什么延时???
------给数据库主从同步的时间。
- 先删除缓存还是先修改数据库???
绝对强一致解决方案
-
利用读写锁来保证强一致,但性能很差,reedisson已经提供了实现方法,可直接使用。
读时不让写,写时排他。
- 共享锁:读锁readLock,加锁之后其他线程可以共享读操作。
- 排他锁: 独占锁wruteLock,加锁之后阻塞其他线程读写操作。
2.允许延时场景
解决方案
- 异步通知,延时时间靠mq规则维护。
二、Redis持久化
RDB和AOF
1、RDB(Redis Database Backup File)Redis数据备份文件
使用方式
- save:由主进程执行rdb,会阻塞其他命令。
- bgsave:由子进程执行命令,避免主进程受影响,建议使用。
- redis.conf文件,自动触发。
执行原理
bgsave开始时会fork主进程得到一个子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并写入rdb。
2、AOF(Append Only File)追加文件
Redis每次执行的写命令都会记录在aof中,可以看做是日志文件。aof默认是关闭的,需要手动开启。
3、AOF和RDB对比
三、Redis数据过期策略
redis设置数据过期时间后,就需要把key从内存中清理掉,可以按照不同的规则进行删除,这种规则叫做数据过期策略。
1.惰性删除
设置该key过期时间后暂时不管,当需要该key时,检查是否过期,如果过期则删除
- 优点:对cpu友好,需要时候才做检查,对于很多没有用到的key不需要耗费资源去检查过期时间。
- 缺点:对内存消耗略大,过期但未使用的key会一直残留在内存中不会被清理。
2.定期删除
每隔一段时间就对一些key进行检查,删除里面过期的key(每次筛选一定量的key),可以具体分为两种模式
- slow模式:定时任务,执行评率默认为10hz,每次不超过25ms,通过修改配置文件的hz选项调整次数。
- fast模式:执行频率不固定,但是两次间隔不低于2ms,每次好事不超过1ms。
3.redis使用的过期策略
redis使用的过期策略是两种配合使用。
四、Redis的数据淘汰策略
当redis内存不够的时候继续往redis中添加数据,redis会按照一定规则对数据进行删除,此为redis的淘汰策略。默认为不淘汰数据,内存不足无法新增数据。