缓存问题学习笔记
缓存穿透
问题来源:缓存穿透指缓存中和数据库中都没有的数据,而用户不断发起请求。
解决方案
- 接口层增加校验,将无效请求拦截
- 从缓存中取不到的数据,在数据库中也没有取到,将缓存设置为null,缓存过期时间设置短点。可以有效防止攻击者反复用同一个id暴力攻击
- 布隆过滤器
缓存击穿
缓存击穿是指缓存中没有但是数据库中有的数据,这时由于并发用户特别多,同时缓存没读到数据,又同时去数据库取数据,引起数据库压力瞬间增大
解决方案
- 设置热点数据永不过期
- 接口限流与熔断,降级。重要的接口一定要做好限流策略,防止用户恶意刷接口
- 加互斥锁
缓存雪崩
问题来源:缓存中数据大批量数据到过期时间,而查询数据量巨大,引起数据库压力过大甚至宕机。和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同的数据都过期了
解决方案
- 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生
- 如果缓存数据库是分布式部署,将热点数据均匀分布在不同的缓存数据库中
- 设置热点数据永不过期
缓存污染(或者满了)
缓存污染问题说的是缓存中一些只会被访问一次或者几次的数据,被访问完后,再也不会被访问到,但这部分数据仍然留存在缓存中,消耗缓存空间。如果缓存空间满了,再次写数据时,需要根据淘汰策略,删除数据
数据库和缓存一致性
- 失效: 应用程序先从cache中获取数据,没有得到,则从数据库中获取数据,放到缓存中
- 命中:应用层序先从cache中获取数据,取到后返回
- 更新:先把数据存到数据库中,成功后,再让缓存生效
浙公网安备 33010602011771号