基于Redis缓存数据常见的三种问题及解决

 更新时间:2022年06月16日 14:19:51   作者:道上叫我卢铁柱  
这篇文章主要介绍了基于Redis缓存数据常见的三种问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

1.缓存穿透

1.1 问题描述

缓存穿透是在客户端/浏览器端请求一个不存在的key,这个key在redis中不存在,在数据库中也不存在数据源,每次对此key的请求从缓存获取不到,就会请求数据源。

如使用一个不存在的用户id去访问用户信息,redis和数据库中都没有,多次进行请求可能会压垮数据源

1.2 解决方法

一个一定不存在缓存及查询不到的数据,由于缓存是不命中时被动写入的,缓存不存在,出于容错考虑,查询不到的数据是不会缓存在redis当中,这将导致每次请求不存在的数据都会请求数据库,失去了缓存的意义。

(1)如果一个查询返回的数据为空(不管是数据是否不存在),我们仍然把这个空结果(null)进行缓存,设置空结果的过期时间会很短,最长不超过五分钟

(2)设置可访问的名单(白名单):使用bitmaps类型定义一个可以访问的名单,名单id作为bitmaps的偏移量,每次访问和bitmap里面的id进行比较,如果访问id不在bitmaps里面,进行拦截,不允许访问。

(3)采用布隆过滤器

(4)进行实时的数据监控,发现Redis在命中率急速降低时,排查访问对象和访问数据,设置黑名单。

2.缓存击穿

2.1 问题描述

当用户请求一个存在的key的数据时,此时redis中该key的数据已经过时,此时若有大量并发请求发现缓存过期都会请求数据源加载数据并且缓存到redis当中,这个时候大量的并发可能会把数据库服务压垮。

2.2 解决方法

key可能在某一个时间段被大量的请求,这个key的数据被称为热点数据,这个时候便要考虑“击穿”问题。

(1)预先设置热门数据:在redis高峰访问之前,把一些热门数据提前存入到redis里面,加大这些热门数据key的时长

(2)实时调整:现场监控哪些数据热门,实时调整key的过期时长

(3)使用锁:

  • 就是在缓存失效的时候(判断拿出来的值为空),不是立即去load db。
  • 先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX)去set一个mutex key
  • 当操作返回成功时,再进行load db的操作,并回设缓存,最后删除mutex key;
  • 当操作返回失败,证明有线程在load db,当前线程睡眠一段时间再重试整个get缓存的方法。

3.缓存雪崩

3.1 问题描述

可以对应的数据存在,但是key的数据已经过期(redis缓存过期,会自动删除此key),此时大量的并发请求访问不同的key,即同时大量的访问不同的key,此时key处于过期阶段,便会请求数据库,大量的并发请求会压垮数据库服务器,这种情况被称为缓存雪崩,和缓存击穿的不同是前者是一个key。

3.2 解决方法

缓存失效时的雪崩效应对底层系统的冲击非常可怕!

(1) 构建多级缓存架构:

  • nginx缓存 + redis缓存 +其他缓存(ehcache等)

(2) 使用锁或队列:

  • 用加锁或者队列的方式保证来保证不会有大量的线程对数据库一次性进行读写,从而避免失效时大量的并发请求落到底层存储系统上。不适用高并发情况

(3) 设置过期标志更新缓存:

  • 记录缓存数据是否过期(设置提前量),如果过期会触发通知另外的线程在后台去更新实际key的缓存。

(4) 将缓存失效时间分散开:

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。 

相关文章

  • 分布式Redis Cluster集群搭建与Redis基本用法

    分布式Redis Cluster集群搭建与Redis基本用法

    这篇文章介绍了分布式Redis Cluster集群搭建与Redis基本用法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-02-02
  • 浅谈redis加锁常用几种方式

    浅谈redis加锁常用几种方式

    这篇文章主要介绍了浅谈redis加锁常用几种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Redis缓存常用4种策略原理详解

    Redis缓存常用4种策略原理详解

    这篇文章主要介绍了Redis缓存常用4种策略原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • redis实现动态字符串SDS

    redis实现动态字符串SDS

    简单动态字符串是Redis的基本数据结构之一,用于存储字符串和整型数据,本文主要介绍了redis实现动态字符串SDS,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • Redis删除策略的三种方法及逐出算法

    Redis删除策略的三种方法及逐出算法

    这篇文章主要介绍了Redis删除策略的三种方法及逐出算法,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • redis集合类型_动力节点Java学院整理

    redis集合类型_动力节点Java学院整理

    这篇文章给大家介绍了redis集合类型的常用方法,感兴趣的朋友参考下吧
    2017-08-08
  • Redis缓存更新策略详解

    Redis缓存更新策略详解

    这篇文章主要为大家详细介绍了Redis缓存更新策略,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • Redis分布式锁存在的问题(推荐)

    Redis分布式锁存在的问题(推荐)

    有很多基于Redis实现的分布式锁方案或者库,但是有些库并没有解决分布式环境下的一些问题陷阱,这篇文章主要介绍了Redis分布式锁存在的问题,需要的朋友可以参考下
    2022-12-12
  • 基于Redis实现抽奖功能及问题小结

    基于Redis实现抽奖功能及问题小结

    这篇文章主要介绍了基于Redis实现抽奖功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • 详解redis中的锁以及使用场景

    详解redis中的锁以及使用场景

    这篇文章主要介绍了详解redis中的锁以及使用场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12

最新评论