缓存穿透、缓存并发、缓存雪崩、缓存抖动、热点缓存、缓存双写一致性等问题…

缓存穿透、缓存并发、缓存雪崩、缓存抖动、热点缓存、缓存双写一致性等问题…

大家好,又见面了,我是全栈君。

对于高并发的业务场景,常用的技术手段包括黑白名单、限流防刷、熔断降级、兜底、线程隔离、多级缓存(客户端、CDN、NGINX、内存缓存、分布式缓存)等等。这些手段相互结合,才能应对高并发场景下的各种细分场景。本文总结了缓存方案需要考虑的几个问题。

第一,关于缓存穿透,是指大量访问缓存和数据库中都不存在的数据。对此,可以考虑使用两种方案:缓存空对象(对应key数量有限、key重复请求概率较高的场景)和布隆过滤器(对应key各不相同、key重复请求概率低的场景),或者两者同时使用。

第二,关于缓存并发,是指一个缓存如果失效,可能出现多个进程同时查询DB,同时设置缓存的情况。对此,可以使用三种方案:分布式锁消息队列和永不过期。其中消息队列需要考虑数据一致性和实效性问题,而永不过期则需要考虑数据的预热以及数据的更新。

第三,关于缓存雪崩,是指某一时刻大量缓存同时失效,导致请求全部打到DB。可以采用三种方案:缓存过期时间随机化、多级缓存(不同级别缓存对应不同的失效时间)、缓存永不过期

第四,关于缓存抖动,一般是指由于某个缓存节点故障导致该节点上的缓存数据不可用。对此,绝大部分的技术博客都会说使用一致性哈希来解决,个人认为这个说法并不准确。

本人分析了一致性哈希和哈希槽的使用场景对比:以Redis为例,Redis集群采用哈希槽的机制,当集群内某个主节点宕机之后,其它主节点会从宕机主节点的复制节点中选取一个节点作为该槽段的新主节点。也就是说,Redis集群的抖动不是通过一致性哈希来解决的。再以Memocache为例,原生的Memocache不支持集群方式,它的集群机制是由访问它的客户端来实现的。客户端使用一致性哈希算法,将多台Memocache机器维护成一个缓存集群,当单台服务器宕机之后,该节点的缓存数据将由其它节点来承担(需要引入虚拟节点)。

第五,关于热点缓存,是指在某个特定的时间点,某些key会成为访问的热点。如短时间内,如果大量用户同时访问一个热点缓存,即使使用Redis作为缓存也可能因为无法响应这么大的流量而导致请求打到数据库,从而导致数据库崩溃。对此,参给出三种解决方案,第一,依赖Redis 4.0及以上版本的功能,通过LFU机制发现热点数据,并定期更新到内存缓存;第二,基于流式计算统计热点数据,并基于ZooKeeper等系统更新到内存缓存;第三,利用Redis的集合功能,基于LRU-K算法发现并缓存热点数据,也可以定期将热点数据更新到内存缓存。相比之下,方案一和方案三无需依赖外部流式计算系统,成本较低。

第六、关于缓存双写一致性问题,是指数据写入请求需要写数据库并更新缓存,需要处理双写的一致性问题。给出以下三种策略:

先更新数据库,再更新缓存

先删除缓存,再更新数据库

先更新数据库,再删除缓存

以最大限度避免数据不一致或者降低数据不一致的时长为目标,对比结果为:推荐使用策略3,即先更新数据库,再删除缓存。而对于数据库更新成功,而缓存删除失败,则有两种解决方案:一是key过期机制;二是基于mq重试。

往期精选

缓存穿透、缓存并发、缓存雪崩、缓存抖动、热点缓存、缓存双写一致性等问题...

Redis应用-异步消息队列与延时队列

Redis 的 8 大数据类型,写得非常好!

Redis中缓存雪崩、缓存穿透等问题的解决方案

最新版 68 道Redis面试题,20000 字干货

50道Redis面试题史上最全,再也不怕问Redis了

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/111519.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • c++ 优先级队列_低优先级队列要等几局

    c++ 优先级队列_低优先级队列要等几局作者有话说:本来兴致勃勃的准备写一篇优先级队列的总结,但查资料时发现一篇写的不错的博文,偷个懒!!!!!!!!!!!转载大神的就ok了。https://www.cnblogs.com/xzxl/p/7266404.html一、相关定义优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素。但是它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而…

  • sesvc.exe_alg是什么进程

    sesvc.exe_alg是什么进程今天公司的一台电脑一点右键就没有反应,通过任务管理发现每次启动都会有一个“Excel”进程,第一感觉就是中毒了,在网上找到了无暇解决方案杀毒方法:(切记:在操作过程中使用“右键->打开”,不可双击。)1.结束注册表中的fun.xls.exe的进程(建议选中fun.xls.exe->右键->转到进程,查找到“algsrvs.exe”单击它,再选择“…

  • 视频直播技术详解之一:开篇

    视频直播技术详解之一:开篇随着互联网用户消费内容和交互方式的升级,支撑这些内容和交互方式的基础设施也正在悄悄发生变革。手机设备拍摄视频能力和网络的升级催生了大家对视频直播领域的关注,吸引了很多互联网创业者或者成熟企业进入该领域。七牛云作为一家以基础服务能力见长的云计算公司,于6月底发布了一个针对视频直播的实时流网络LiveNet和完整的直播云解决方案,很多开发者对这个网络和解决方案的细节和使用场景非常感兴趣

  • C++临界锁CCriticalSection在线程中的使用

    C++临界锁CCriticalSection在线程中的使用#define_AFXDLL#include<afxmt.h>#include<iostream>usingnamespacestd;CCriticalSectioncritical;inttick=0;DWORDWINAPIFunc1(LPVOIDlpParam);DWORD__stdcallFunc1(LPVOIDlpParam){critical.Lock();tick+=10;cout&lt.

  • leetcode刷题:两数之和

    leetcode刷题:两数之和

  • JAVA求数组的平均数,众数,中位数[通俗易懂]

    JAVA求数组的平均数,众数,中位数[通俗易懂]目录1、名称解释2、实例代码(1)求平均数(2)求中位数(3)求众数1、名称解释平均数:是指一组数据之和,除以这组数的个数,所得的结果就是平均数。中位数:中位数是指把一组数据从小到大排列,如果这组数据的个数是奇数,那最中间那个就是中位数,如果这组数据的个数为偶数,那就把中间的两个数之和除以2,所得的结果就是中位数。众数:众数是指一组数据中出现次数最多的那个数,众数可以是0个或多个。2、实例代码(1)求平均数publicstaticdoublem..

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号