缓存 缓存雪崩
缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库。
解决方案
- 给不同的key的TTL添加随机值
- 利于Redis集群提高服务的可用性 哨兵模式、集群模式
- 给缓存业务添加降级限流策略 ngxin或spring cloud gateway
- 给业务添加多级缓存 Guava
双写一致性
- 一致性要求高
- 允许延迟
数据不一致情况
方案 延迟双删
放入缓存的数据:读多写少。
写操作:延迟双删
仍然有出现脏数据的可能
延时双删:主从集群,读写分离,需要延时让主节点把数据同步到从节点。
方案 互斥锁
写或读时都加锁。
优化:
因为存入缓存的数据,读多写少 -> 共享锁和排它锁
方案 异步通知(MQ、Cannal),保证数据的最终一致性
Redis持久化
RDB 定时对整个内存做快照
- save
- bgsace
RDB的执行原理
- bgsave fork主进程得到子进程, 子进程复制了父进程的页表,子进程共享主进程的内存数据。
- 子进程读取内存数据并写入RDB文件。
子进程进行读操作时,主进程可能在执行写操作 ------ copy-on-write
- 主进程执行读操作时,访问共享内存。
- 主进程执行写操作时,拷贝一份数据,执行写操作。
AOF 记录每一次执行的命令
默认关闭
redis.conf 中配置 appendonly yes
appendfilename 可以指定文件名
appendfsync
配置刷盘时机
alwags:同步刷盘
everysec:每秒刷盘
no:操作系统控制:性能最好,可靠性较差
AOF比RDB文件大得多,bgrewriteaof:AOF文件执行重写功能,用最少的命令达到相同的效果。
redis数据过期策略
- 惰性删除: 设置key的过期时间之后,仅在需要该key时,检查它是否过期,入股过期就删除。优点CPU友好。缺点:内存不友好。
- 定期删除:每隔一段时间,对key进行检查,删除过期key。
SLOW模式、FAST模式
。优点:通过限制删除操作执行的时长和频率来减少删除操作对CPU的影响。定期删除能有效地释放过期键占用的内存。缺点:删除操作的执行时间和频率难以确定。 惰性删除和定期删除配合使用。
redis淘汰策略
- noeviction:不淘汰任何key,
默认
- volatile-ttl : 有限淘汰剩余时间短的
- volatile-random:对设置了过期时间的,进行随机淘汰
- volatile-lru:对设置了过期时间的,进行LRU算法淘汰
- volatile-lfu:对设置了过期时间的,进行LFU算法淘汰
- allkeys-random
- allkeys-lru
- allkeys-lfu
LFU:最少频率使用
LRU:最近最少使用
数据淘汰策略使用建议
- 优先使用allkeys-lru.尤其是有明显冷热数据区分的,把最经常访问的数据留在内存
- 业务中数据访问频率差别不大,没有明显冷热数据区分:使用allkeys-random,随机淘汰。
- 有置顶需求:volatile-lru,且置顶数据不设置过期时间。
- 有短时高频访问数据:allkeys-lfu 或 volatile-lfu