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

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

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

对于高并发的业务场景,常用的技术手段包括黑白名单、限流防刷、熔断降级、兜底、线程隔离、多级缓存(客户端、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了

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • “电梯汇报”方法

    “电梯汇报”方法将问题通过:时间维度、空间维度、立体维度三个方面立体的表达。      时间维度:比如“昨天、今天、明天”“过去、现在、将来”等      空间维度:比如“国内、国外”“北京、上海、深圳”等      立体维度:比如“XXX方面”“XXX进展””“XXX风险”

    2022年5月5日
    37
  • 在线客服系统源码demo/PHP客服系统下载附php源码「建议收藏」

    在线客服系统源码demo/PHP客服系统下载附php源码「建议收藏」在线客服系统软件为每个客户提供个性化的一对一支持。在线客服系统源码安装实时聊天小部件在尽可能多的网站和博客上并可定制聊天小部件完全适合您的网站。从一系列颜色和选项混合搭配。在线客服系统附源码演示及下载地址:ym.ws58.net在线客服系统源码H5通过为常见答案和回复创建快捷方式来节省时间。基于thinkphp在网页线客服完整源码下载地址:ym.ws58.net在聊天室里点击一个按钮就可以看到这些,只需单击一次即可将聊天内容传送到其他代理。团队合作以取悦顾客。实时聊天小部件跟踪访问者浏览您.

    2022年7月19日
    19
  • c#时间转时间戳_数据库时间戳转换日期格式

    c#时间转时间戳_数据库时间戳转换日期格式原文地址:http://www.cnblogs.com/codemo/archive/2012/05/18/2507251.html//////时间戳转为C#格式时间/////////privateDateTimeGetTime(stringtimeStamp){

    2022年10月2日
    0
  • RabbitMQ学习笔记(五)——RabbitMQ集群搭建&入门

    RabbitMQ学习笔记(五)——RabbitMQ集群搭建&入门目录RabbitMQ项目使用集群的好处1.扩展规模2.数据冗余3.高可用RabbitMQ集群搭建RabbitMQ集群原理RabbitMQ集群搭建步骤单节点安装Rabbitmq复制Erlangcookie集群镜像队列原理集群镜像队列设置方法Definition:策略定义设置镜像队列策略案例:将镜像配置到集群中的所有节点HAproxy+Keepalived高可用集群搭建实现高可用的方式HAProxy简介HAProxy配置方法Keepalived简介keepalived配置(两个节点都需要)总结Rabb

    2022年9月6日
    3
  • KTT条件的理解「建议收藏」

    KTT条件的理解「建议收藏」求解优化问题:对于等式约束条件,使用拉格朗日乘子法求;对于不等式约束条件,使用KTT条件求解;这两种方法求得结果只是必要条件,只有当目标函数是凸函数时,才是充分必要条件。着重讲一下KTT条件求解如下优化问题:minxf(x)s.t.gi(x)≤0(j=1,…,n)minxf(x)s.t.gi(x)≤0(j=1,…,n)min_{x}f(x)\nonumber\\…

    2025年7月31日
    0
  • hashtable与hashmap的区别_*p++和(*p)++的区别

    hashtable与hashmap的区别_*p++和(*p)++的区别一、HashMap简介   HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。    HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap。    HashMap 实现了Serializable接

    2022年9月18日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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