博客
关于我
Redis-----缓存穿透和缓存击穿和缓存雪崩
阅读量:332 次
发布时间:2019-03-04

本文共 1557 字,大约阅读时间需要 5 分钟。

一、缓存雪崩

缓存雪崩是指系统中大量的缓存同时失效,导致后续的请求全部转向数据库,引发数据库过载甚至崩溃的现象。这种情况通常发生在大量的缓存 Key 同时到期时,系统无法及时从数据库获取数据来补充缓存,导致数据库承受无法忍受的压力。

1.1 简介缓存雪崩

缓存雪崩的本质是缓存 Key 的失效时间集中发生,导致 Redis 等缓存层无法及时提供数据支持。当大量 Key 同时失效时,系统会面临以下问题:

  • 数据库承受高并发请求,导致响应时间严重下降
  • 系统可能完全瘫痪,无法正常提供服务
  • 数据库可能因为压力过大而报错或完全崩溃

举个简单的例子:假设 Redis 中的所有 Key 都设置了相同的失效时间。如果系统同时受到大量请求,缓存层无法提供服务,请求会直接打到数据库。这种情况下,数据库可能在短时间内承受超过其负载能力的压力,导致服务中断。

1.2 缓存雪崩的解决方法

缓存雪崩的解决方法主要集中在以下几个方面:

  • 失效时间加个随机值

    在批量写入 Redis 时,为每个 Key 的失效时间添加一个随机值。这样可以避免大量 Key 同时失效的风险。例如,可以将失效时间从固定的时间戳改为基于哈希函数生成的随机时间戳。

  • 设置热点缓存数据永远不过期

    对于一些特别重要的热点数据,可以设置其缓存时间为永不过期。这样可以确保这些数据在高并发时仍能正常提供服务。

  • 分散请求时间

    为每个客户端设置一个随机的短暂延迟时间。这样可以避免所有客户端在同一时间发送请求,从而减少缓存雪崩的可能性。

  • 二、缓存穿透

    缓存穿透是指用户请求的数据在 Redis 缓存和数据库中都不存在,而用户仍然试图从缓存层获取数据。这种情况通常发生在攻击者试图通过发送不存在的 Key 或参数来耗尽系统资源。

    2.1 简介缓存穿透

    缓存穿透的本质是攻击者试图通过发送不存在的 Key 或参数,耗尽系统的资源。例如,用户可能会发送一个非常大的 ID 或负数 ID 来测试系统的健壮性。

    如果系统没有对请求参数进行校验,缓存层会返回不存在的数据,请求会直接打到数据库。这种现象可能导致数据库承受极高的压力,甚至崩溃。

    2.2 缓存穿透的解决方法

    缓存穿透的解决方法主要包括以下几点:

  • 接口层增加校验

    在接口层对请求参数进行基础校验。例如,对于 ID 参数,可以设置一个合法范围(如 ID > 0),并对不合法的请求直接拦截。

  • 布隆过滤器

    使用布隆过滤器来快速判断请求的 Key 是否存在于数据库中。布隆过滤器通过 probabilistic hashing 来判断 Key 是否存在,可以有效减少不必要的数据库查询。

  • 设置不存在的 Key 为 null

    对于在数据库中不存在的 Key,可以将其缓存值设置为 null 或其他表示不存在的值。这样可以避免不必要的数据库查询,同时在 UI 或业务逻辑中进行处理。

  • 三、缓存击穿

    缓存击穿是指某个热点 Key 的缓存在失效后,仍然面临大量的并发请求。这种现象通常发生在 Key 的失效时间与高并发请求的时间点重合。

    3.1 简介缓存击穿

    缓存击穿的本质是热点 Key 在失效后,仍然面临大量的并发请求。这种现象会导致 Redis 缓存被击穿,请求直接打到数据库,可能导致数据库过载。

    3.2 缓存击穿的解决方法

    缓存击穿的解决方法主要包括以下几点:

  • 设置热点数据永远不过期

    对于一些特别重要的热点数据,可以设置其缓存时间为永不过期。这样可以确保这些数据在高并发时仍能正常提供服务。

  • 互斥锁

    采用互斥锁(锁机制)来保证同一时刻只有一个客户端可以查询底层数据库。这样可以避免多个客户端同时尝试查找同一个 Key,减少击穿的可能性。

  • 通过以上方法,可以有效减少缓存雪崩、穿透和击穿对系统的影响,从而提高系统的稳定性和可用性。

    转载地址:http://nmfh.baihongyu.com/

    你可能感兴趣的文章
    Python制作进度条,原来有这么多方法
    查看>>
    Python制作简单的学生成绩管理系统
    查看>>
    python制作甘特图的基本知识(附Demo)
    查看>>
    python制作一个简单的服务器,【Python】 做一个简单的 http 服务器
    查看>>
    Python到底能做什么?它的优点在哪?
    查看>>
    python利用pytorch库导出图像分割算子
    查看>>
    python利用pyshark监听网卡来抓包其中pyshark中摸索的一些可用参数
    查看>>
    python利用excel分析过杀漏失
    查看>>
    python判断汉字数目
    查看>>
    python判断文件是空的,如果是空的,就删除
    查看>>
    python判断密码是否正确_python密码判断是否符合要求的方法
    查看>>
    python判断字符串包含中文_Python 判断字符串是否包含中文
    查看>>
    python删除第一行_Python 乱码指北:一行删掉根目录
    查看>>
    Python删除列表元素的三种方法
    查看>>
    python初步学习-python数据类型-集合(set)
    查看>>
    python列表生成字典_Python中将字典转换为列表的方法
    查看>>
    python列表对应元素合并为列表及判断一个列表是几维
    查看>>
    python列表去重复后按照顺序_从包含不可共元素的Python列表中删除重复元素,同时保留顺序?...
    查看>>
    python列表前几个_python之列表
    查看>>
    python列表元组
    查看>>