缓存使用场景:
1、即时性、数据一致性要求不高的
2、读多写少的场景
缓存实现方式:
本地缓存:
Map:简单;适合单体应用;应用重启失效;多节点情况下各个节点缓存不一致;增删改缓存麻烦
缓存中间件:
Redis:
一、缓存击穿
key对应的数据存在,但是在redis中过期,此时若有大量并发请求过来,这些请求一般都会从后端DB加载数据并回设到redis,如果被请求的单点key失效导致查询该单点key的请求都到达DB则称为击穿
解决方案:
- 使用互斥锁,请求缓存失效后请求DB时加锁;
二、缓存穿透
redis中没有,DB中也没有
解决方案:
- 布隆过滤器
- 设置Key永不过期(更新操作时删除缓存)
- 缓存空值并设置自动过期时间
击穿:一个key非常热点,在不停的扛着大并发,大并发集中对一个点进行访问,当这个key在失效的瞬间,大并发就穿破缓存来到DB,给DB造成压力;
穿透:恶意攻击一个不存在的key。
三、缓存雪崩
redis中数据同一时间大面积失效,导致DB瞬间访问量激增;
解决方案:
- 修改缓存策略,针对业务细分哪些缓存可能存在雪崩场景对缓存失效时间增加一个随机过期时间保证
四、双写一致性
保证双写一致性的策略:
1、先更新缓存再更新数据库 更新缓存成功,更新数据库失败会造成缓存的脏数据
2、先更新数据库再更新缓存
3、先删除缓存,再更新数据库
4、
五、数据持久化
Redis快的原因:
- 纯内存操作
- 采用高性能的网络通信模型Reactor模型实现非阻塞通信
- 单线程减少了内存切换的损耗