Redis缓存问题(缓存穿透、缓存击穿、缓存雪崩、hash一致性问题及数据倾斜问题)

一.Redis如何应用的

当数据库(如MySQL)达到瓶颈,使用连接池效果也不会很理想,这时可以在数据库连接前加入缓存层,如Redis。将热点数据放入Redis中,减小数据库的压力。


二.使用Redis时是否遇到相关缓存问题


1)缓存击穿

  • 概念:对于Redis中的数据会设置有效期,因为并不是所有的数据都会一直处于高访问量的热点状态。这时,当有效期过了以后,数据就不在Redis中了,访问的连接将直接指向数据库中。如果在某个时候,某个处于极高访问量的key失效,大量的并发将涌入数据库。

  • 处理:可以用二级缓存解决,再加一个Redis。但是一般来说无须处理;在真实情况下一般不用解决,因为不会有一条数据能够在极短时间内访问量能够直接压垮数据库,如果存在这样的产品或商品等,则设置永不过期即可


2)缓存穿透

  • 概念:查找一个数据库中一定不存在的数据(比如id=-1之类的非法请求),那么Redis中也肯定不会存在;这时没有在Redis中查找需要的数据,还是需要向数据库进行数据查找。

  • 处理:

    1. 方案一:可以将id=-1、value=null的这个值缓存在Redis中,再次发起非法请求就不会访问数据库了。

    2. 方案二:写一个过滤器,保存数据库中所有的id,在访问穿过Redis前,就先进行过滤。为了节省内存的占用,一般使用布隆过滤器。

      布隆过滤器有一定的几率发生哈希碰撞,也就是说会有一定的错误率,但是可以控制;降低错误率的手段有:增大数组、增加hash函数的个数

    3. 方案三:使用互斥分布式锁,这时在同一时间,只能有一个连接访问数据库,不会同时进入数据库中。


3)缓存雪崩

  • 概念:Redis中大量的数据同时失效,大量访问直接连接到数据库,导致数据库崩掉。(缓存击穿指的是特定的数据,而缓存雪崩指的是很多不同的数据)。
  • 处理:
    1. 方案一:给热门数据根据业务场景设置随机有效期,以免同时失效。
    2. 方案二:搭建Redis集群,避免问题集中爆发。

4)Redis集群中hash一致性问题

  • 概念:hash一致性算法主要解决当集群有机器更改,不至于发生大量的数据移动问题。

  • hash环

    hash环分布:环内共有2^32个点,每一个点都可以分布服务器。

    服务器分布:hash(ip+编号) % 2^32,算出来的值就会对应环上的一个点。

    数据分布:hash(key) % 2^32 = value ;数据将顺时针排列在遇到的第一台服务器节点

在这里插入图片描述

  • hash环中新增/移除服务器

    在hash环中新增服务器,也是通过hash算法确认分布,只需要移动一小部分数据即可;移除也是同理。

在这里插入图片描述

  • hash一致性算法数据倾斜问题

    对于hash环来说,节点越多,数据分布越平稳。所以采用虚拟节点的方式,将一个节点虚拟成多个节点,保证环上有1000~2000个节点最佳。


  • 一般10个Redis服务器的集群,每个节点可以虚拟100-200个节点,保证环上有1000-2000个节点;


  • 一般5个Redis集群,则每个节点虚拟200-400个节点,保证节点数是1000-2000之间,这样才能保证数据分布均衡。

猜你喜欢

转载自blog.csdn.net/qq_40579464/article/details/105619233