标签:缓存 击穿 Redis 更新 TTL 引入 淘汰 todo
1. 引入缓存后给业务带来的问题
业务系统引入缓存之后,架构由原来的两层架构变成了三层架构:
由此,带来了三个问题需要解决,分别是缓存读取、缓存更新和缓存淘汰。
1.1 缓存读取
缓存读取比较简单,查询数据时首先查询缓存,如果缓存命中,则从缓存中读取数据。如果缓存不命中,则查询数据库,并且更新缓存。
1.2 缓存更新
缓存更新时,在更新存储和更新缓存的先后关系上,如果选择更新缓存再更新存储,则有可能导致更新缓存成功但是更新存储失败,
(1)先删除缓存,再更新数据库
// todo
(2)先更新数据库,再删除缓存
// todo
1.3 缓存淘汰
主要有两种策略,分别是主动淘汰和被动淘汰:
- 主动淘汰:给键值对设置TTL时间,到期自动淘汰(推荐),这种方式可以达到缓存热数据的目的
- 被动淘汰:内存达到最大限制时,通过LRU、LFU算法淘汰(不推荐),这种方式影响缓存性能,缓存质量不可控
2. 缓存的三座大山
2.1 一致性
一致性主要解决一下几个问题:
(1)并行更新如何解决隔离性问题
// todo
(2)原子性更新时如何解决部分更新的问题
// todo
(3)如何解决读一致的问题
// todo
2.2 缓存击穿
缓存击穿指的是访问数据时直接绕过缓存,访问数据库。肯能会有两种原因造成这种现象:
一种是大量的空查询,比如黑客攻击;另外一种是缓存污染,比如大量的网络爬虫造成的。
(1)为了解决空查询带来的缓存击穿,主要有两种方案:
- 第一种是在缓存层前面再加一层布隆过滤器
- 第二种是把所有的key和热数据value加入缓存,在缓存层拦截空数据查询
(2)为了解决爬虫带来的缓存击穿问题,可以设置缓存策略:
- 针对更新的操作,需要立即缓存
- 针对读的操作,可以在设置是否立即缓冲还是延迟缓存,以及在规定的时间窗内命中的次数是否达到一定的次数才进行缓存
2.3 缓存雪崩
缓存雪崩指的是热数据集中淘汰,大量请求瞬间透传到存储层,导致存储层过载。
造成缓存雪崩的原因主要是TTL机制过于简单造成的,解决方案主要有以下:
(1)设置TTL时给过期时间加上一个随机的时间值
(2)每一次的访问都会重新更新TTL,此外业务可以更精准的指定热数据缓存时间
标签:缓存,击穿,Redis,更新,TTL,引入,淘汰,todo 来源: https://blog.csdn.net/MOU_IT/article/details/116427814
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。