• 缓存穿透、缓存击穿、缓存雪崩及其解决方案


    缓存(cache),大家都非常熟悉,几乎每个系统乃至整个计算机体系中都会用到。在分布式系统架构中,主要用于减轻数据库的压力,提高系统的响应速度和并发吞吐,即空间(内存)换时间。当大量的读、写请求涌向数据库时,磁盘的处理速度与内存显然不在一个量级,因此,在数据库之前加一层缓存,能够显著提高系统的响应速度,并降低数据库的压力。

    缓存穿透

    缓存穿透是指用户请求的数据在缓存中不存在即没有命中,同时在数据库中也不存在,导致用户每次请求该数据都要去数据库中查询一遍,然后返回空。

    如果有恶意攻击者不断请求系统中不存在的数据,会导致短时间大量请求落在数据库上,造成数据库压力过大,甚至击垮数据库系统。

    缓存穿透解决方案:

    布隆过滤器(主键Hash):

    优点:节省空间:不需要存储数据本身,只需要存储数据对应hash比特位时间复杂度低:插入和查找的时间复杂度都为O(k),k为哈希函数的个数

    缺点:存在假阳性:布隆过滤器判断存在,可能出现元素不在集合中;判断准确率取决于哈希函数的个数不能删除元素:如果一个元素被删除,但是却不能从布隆过滤器中删除,这也是造成假阳性的原因

    返回空对象:

    当缓存未命中,查询持久层也为空,可以将返回的空对象写到缓存中,这样下次请求该key时直接从缓存中查询返回空对象,请求不会落到持久层数据库。为了避免存储过多空对象,通常会给空对象设置一个过期时间。

    这种方法会存在两个问题:

    如果有大量的key穿透,缓存空对象会占用宝贵的内存空间。空对象的key设置了过期时间,在这段时间可能会存在缓存和持久层数据不一致的场景。

    缓存击穿

    缓存击穿是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。

    危害:

    数据库瞬时压力骤增,造成大量请求阻塞。

    缓存击穿解决方案:

    使用互斥锁:

    这种思路比较简单,就是让一个线程回写缓存,其他线程等待回写缓存线程执行完,重新读缓存即可。同一时间只有一个线程读数据库然后回写缓存,其他线程都处于阻塞状态。如果是分布式应用就需要使用分布式锁。

    缺点:如果是高并发场景,大量线程阻塞势必会降低吞吐量。

    热点数据永不过期:

    物理不过期,针对热点key不设置过期时间。逻辑过期,把过期时间存在key对应的value里,如果发现要过期了,通过一个后台的异步线程进行缓存的构建。

    这种方法对于性能非常友好,不足的就是构建缓存时候,其余线程(非构建缓存的线程)可能访问的是老数据,对于不追求严格强一致性的系统是可以接受的。

    缓存雪崩

    缓存雪崩是指缓存中数据大批量到过期时间,或者服务器/应用重启,而此时查询数据量巨大,请求直接落到数据库上,引起数据库压力过大甚至宕机。和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

    缓存雪崩解决方案:

    1. 均匀过期

    设置不同的过期时间,让缓存失效的时间点尽量均匀。通常可以为有效期增加随机值或者统一规划有效期。

    2. 加互斥锁

    跟缓存击穿解决思路一致,同一时间只让一个线程构建缓存,其他线程阻塞排队。

    3. 缓存永不过期

    跟缓存击穿解决思路一致,缓存在物理上永远不过期,用一个异步的线程更新缓存。

    4. 保持缓存层的高可用性:

    使用Redis 集群部署方式,即便个别Redis 节点下线,整个缓存层依然可以使用。除此之外,还可以在多个机房部署 Redis,这样即便是机房死机,依然可以实现缓存层的高可用。

     

  • 相关阅读:
    开学季 | Y 省教育厅这张卷,融云答出了100分!
    k8s 入门到实战--部署应用到 k8s
    【Qt开发流程之】窗口部件
    云原生之K8S------k8s资源限制及探针检查
    代码随想录算法训练营 动态规划part17
    Redis如何实现多可用区?
    MySQL——数据类型以及对表结构的修改
    Microsoft SQL Server中的错误配置
    达人评测酷睿i5 12450h和锐龙R5 6600u选哪个 i512450h和锐龙R56600u对比
    【学习笔记】深度学习入门:基于Python的理论与实现-与学习相关的技巧
  • 原文地址:https://blog.csdn.net/aHardDreamer/article/details/128066827