redis缓存

  1. 一.缓存雪崩
    1. 解决方法
  2. 二.缓存穿透

一.缓存雪崩

缓存集中在一段时间内失效,发生大量的缓存穿透,所有的查询都落在数据库上,造成了缓存雪崩。并且如果大量的key过期时间设置的过于集中,到过期的时间点,redis可能会出现短暂的卡顿现象

解决方法

1、使用互斥锁(这里使用redis的setnx实现分布式锁):

只有获取锁,才能去访问数据库,加载数据,保证同一时刻只有一个请求访问数据库,避免数据库崩溃。可能造成请求延时比较久的问题。

2、让缓存过期时间不那么集中:

比如我们可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件

3、做二级缓存

A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2。A1缓存失效时间设置为短期,A2设置为长期。这个在业务追求数据一致性要求不高的情况下,可以使用。

4、缓存永远不过期

(1) 从缓存上看,确实没有设置过期时间,这就保证不会出现热点key过期问题,也就是“物理”不过期。

(2) 从功能上看,把过期时间存在key对应的value里,如果发现要过期了,通过一个后台的异步线程进行缓存的构建,也就是“逻辑”不过期.

上述不足之处就是构建缓存时候,其余线程(非构建缓存的线程)可能访问的是老数据,但是对于一般的互联网功能来说这个还是可以忍受。

二.缓存穿透

缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透

####解决方法

使用Bloom filter(布隆过滤器)。当用户查询某个row时,可以先通过内存中的布隆过滤器过滤掉大量不存在的row请求,然后再到数据库进行查询。

文章标题:redis缓存

发布时间:2019-11-11, 17:01:24

最后更新:2019-11-11, 17:54:18