Redis常见问题

摘要:redis穿透,击穿,雪崩等问题

缓存穿透

redis缓存穿:正常情况下是不能存在缓存穿透的问题,但是请求的redis值可以为空值,如果查询的数据redis中没有,就会查询对应的MySQL数据库,如果用户写一个多线程任务,每次都从redis中查询对应的,键为空的值,这样就会存在,高并发情况下,直接导致对应的mysql宕机。

redis缓存穿透的解决方案:

    在对应的数据返回给用户的时候,在redis中以搜索条件为key,对应的值赋值为空,这样可以解决对应的值为空,的缓存穿透问题,但是对应的key的null值会越来越多,会占用对应的redis空间,我们可以给对应的值赋对应的过期时间,这样就可以解决对应的,数据的问题

    可以使用布隆过滤:实现对应的比对的方法,进行数据的校验,如果没有对应的数据,则给出对用的抛出。

    还可以在对应的controller层设置正则校验,完成对应的空值直接给出对应的exception抛出。

缓存击穿

redis的缓存击穿:是指,一个热点数据key,在一时刻过期,有大量的线程进来,redis中没有对应的数据信息,大量的线程去访问对应的mysql,由于大于mysql的并发量,导致对应的MySQL数据库宕机。

redis的缓存击穿问题的解决:

    既然是对应的热点key的过期导致的问题,我们可以设置key的永不过期策略,这样就不会出现数据过期导致的问题。

    可以使用互斥锁:使用setnx设置对应的互斥锁,就是在对应的key过期的时候,别的操作不能触发,只有对应的key加载完成后,其他线程才不处于等待状态。利用setnx可以实现互斥效果。

    实际开发中使用互斥锁,一个线程对数据的操作,其他线程处于等待状态,这个线程,完成后,其他线程读取对应的时间。

缓存雪崩

缓存雪崩:缓存雪崩产生问题的原因,同一时间节点,有大量的key过期,这个时间节点上,有大量的线程进行读取数据,读取对应的刚过期的key,这时会有大量的线程,请求数据库,这时候就对MySQL的压力比较大。导致对应的数据库服务宕机。

解决方案:

    设置对应的随机数:同一时间有大量的key过期,可以给对应的key设置一个随机数,将对应的过期时间错开。

    热点数据将缓存过期时间设置的长一些,冷门的数据,过期时间,设置的短一些。

    将数据分类分批处理:将不同类型的数据设置不同的类别,设置不同的过期周期,将对应的过期时间错开。

    搭建集群,还可以解决高可用问题。


评论