Redis(四):常见问题

94 阅读2分钟

Redis常见问题

缓存穿透

解释

  1. 应用服务器压力变大,大量访问导致redis命中率降低,大量查询数据库,大量非正常的url访问
  2. 指查询一个一定不存在的数据

解决

  1. 对数据库返回的数据为空值做缓存,但它的过期时间会很短,最长不超过五分钟。
  2. 设置可以访问的名单,使用bitmaps类型定义一个可以访问的名单
  3. 布隆过滤器,底层是bitmaps,将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被 这个 bitmap 拦截掉,从而避免了对底层存储系统的查询压力。
  4. 进行实时监控,设置黑名单

布隆过滤器(Bloom Filter)

  • 用于检索一个元素是否在一个集合中,优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难

  • 布隆过滤器实际上是一个 bit 向量或者说 bit 数组,使用多个不同的哈希函数生成多个哈希值,并对每个生成的哈希值对应的 bit 位置 1

  • 核心思想

    • 使用多个哈希函数,增大随机性,减少 hash 碰撞的概率
    • 扩大数组范围,使 hash 值均匀分布,进一步减少 hash 碰撞的概率

注意:缓存穿透不能完全解决,只能将其控制在一个可以容忍的范围内。

缓存击穿

现象

数据库访问压力瞬间增大,redis里面没有出现大量的key过期,redis正常运行

对于一些设置了过期时间的 key,如果这些 key 可能会在某些时间点被超高并发地访问,是一种非常“热点”的数据。这个时候,需要考虑一个问题:缓存被“击穿”的问题,这个和缓存雪崩的区别在于这里针对某一 key 缓存,前者则是很多 key。

解释

redist某个key过期了,大量访问使用这个key

解决

  1. 预先设置热门数据到key里,加大这些热门数据的时长
  2. 实时监控key的过期时间
  3. 使用锁,当查询为空时,让它之后再查询(互斥锁)

缓存雪崩

现象

数据库压力变大,服务器崩溃

解释

极少的时间段里,查询大量的key集中过期情况

解决

  1. 构建多级缓存架构,nginx缓存+redis缓存+其他缓存(ehcahe等)
  2. 使用锁或队列(降低效率)
  3. 设置过期标志更新缓存,触发另外的线程后台去更新key的缓存
  4. 将缓存失效时间分散开