Redis缓存篇

1.1 缓存击穿

缓存击穿跟缓存雪崩有点类似,缓存雪崩是大规模的key失效,而缓存击穿是某个热点的key失效,大并发集中对其进行请求,就会造成大量请求读缓存没读到数据,从而导致高并发访问数据库,引起数据库压力剧增。这种现象就叫做缓存击穿。

解决方案:热点key不设置过期时间

1.2 缓存穿透

缓存穿透是指用户请求的数据在缓存中不存在即没有命中,同时在数据库中也不存在,导致用户每次请求该数据都要去数据库中查询一遍。如果有恶意攻击者不断请求系统中不存在的数据,会导致短时间大量请求落在数据库上,造成数据库压力过大,甚至导致数据库承受不住而宕机崩溃。

缓存穿透的关键在于在Redis中查不到key值,它和缓存击穿的根本区别在于传进来的key在Redis 中是不存在的。假如有黑客传进大量的不存在的key,那么大量的请求打在数据库上是很致命的问题,所以在日常开发中要对参数做好校验,一些非法的参数,不可能存在的key就直接返回错误提示。

解决方法:

将无效的key存放进Redis中

当出现Redis查不到数据,数据库也查不到数据的情况,我们就把这个key保存到Redis中,设置value="null",并设置其过期时间极短,后面再出现查询这个key的请求的时候,直接返回null,就不需要再查询数据库了。但这种处理方式是有问题的,假如传进来的这个不存在的Kev值每次都是随机的,那存进Redis也没有意义。

使用布隆过滤器

如果布隆过滤器判定某个key不存在布隆过滤器中,那么就一定不存在,如果判定某个key存在,那么很大可能是存在(存在一定的误判率)。于是我们可以在缓存之前再加一个布隆过滤器,将数据库中的所有key都存储在布隆过滤器中,在查询Redis前先去布隆过滤器查询key是否存在,如果不存在就直接返回,不让其访问数据库,从而避免了对底层存储系统的查询压力。

如何选择?

针对一些恶意攻击,攻击带过来的大量key是随机,那么我们采用第一种方案就会缓存大量不存在key的数据。那么这种方案就不合适了,我们可以先对使用布隆过滤器方案进行过滤掉这些key。

所以,针对这种key异常多、请求重复率比较低的数据,优先使用第二种方案直接过滤掉。而对于空数据的key有限的,重复率比较高的,则可优先采用第一种方式进行缓存。

1.3 缓存雪崩

如果缓存在某一个时刻出现大规模的key失效,那么就会导致大量的请求打在了数据库上面,导致数据库压力巨大,如果在高并发的情况下,可能瞬间就会导致数据库宕机。这时候如果运维马上又重启数据库,马上又会有新的流量把数据库打死。这就是缓存雪崩。

造成缓存雪崩的关键在于同一时间的大规模的key失效,主要有两种可能:第一种是Redis宕机,第二种可能就是采用 了相同的过期时间。

解决方案:

  • 均匀过期,设置不同的过期时间,让缓存失效的时间尽量均匀,避免相同的过期时间导致缓存雪崩,造成大量数据库的访问。如把每个Key的失效时间都加个随机值,保证数据不会在同一时间大面积失效。

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

  • 限流降级。当流量达到一定的阈值,直接返回"系统拥挤"之类的提示,防止过多的请求打在数据库上将数据库击垮,至少能保证一部分用户是可以正常使用,其他用户多刷新几次也能得到结果。

1.4 缓存预热

缓存预热是指系统上线后,提前将相关的缓存数据加载到缓存系统。避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题,用户直接查询事先被预热的缓存数据。

如果不进行预热,那么Redis初始状态数据为空,系统上线初期,对于高并发的流量,都会访问到数据库中,对数据库造成流量的压力。

缓存预热解决方案:

  • 数据量不大的时候,工程启动的时候进行加载缓存动作;

  • 数据量大的时候,设置一个定时任务脚本,进行缓存的刷新;

  • 数据量太大的时候,优先保证热点数据进行提前加载到缓存。

相关推荐

  1. Redis缓存

    2024-05-11 01:54:11       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-11 01:54:11       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-11 01:54:11       100 阅读
  3. 在Django里面运行非项目文件

    2024-05-11 01:54:11       82 阅读
  4. Python语言-面向对象

    2024-05-11 01:54:11       91 阅读

热门阅读

  1. Day35 无重叠区间 + 划分字母区间 + 合并区间

    2024-05-11 01:54:11       31 阅读
  2. Nginx-那些事

    2024-05-11 01:54:11       39 阅读
  3. 【GoLang基础】垃圾回收是如何工作的?

    2024-05-11 01:54:11       27 阅读
  4. 关于emulate

    2024-05-11 01:54:11       33 阅读
  5. 7-Zip命令行调用命令收集(20个)

    2024-05-11 01:54:11       39 阅读
  6. 如何找到高质量的微信群?分享8种适用的方法!

    2024-05-11 01:54:11       37 阅读
  7. 如何利用AI提高内容生产效率?

    2024-05-11 01:54:11       27 阅读
  8. 人民币数字和中文汉字转换

    2024-05-11 01:54:11       192 阅读
  9. Union内存分布

    2024-05-11 01:54:11       35 阅读
  10. ZygoteInit

    2024-05-11 01:54:11       26 阅读