redis使用中常见的问题分析

124 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情

redis使用中常见的问题分析
redis缓存穿透
  • 缓存穿透是指请求一个Redis中不存在,数据库存储层也不用存在的请求,因此请求会直接穿透缓存到达数据存储层,这样会导致数据库压力过大而宕机;

  • 可能出现的原因:黑客的恶意攻击,由于代码上逻辑漏洞或者缓存设计的不合理并发请求时可能会导致这种情况发生;

  • 解决方案:

    • 1、缓存空值,当请求为空时缓存一个空值到redis,这时需要给个缓存的过期时间,因为系统中这个空值并不一定永远都是空值,因此需要给个过期时间,但是这种方案可能会导致缓存大量空置,浪费存储空间;

    • 2、布隆过滤器:

      什么是布隆过滤器?

      其实就是一组很长length的数组,由01组成,0代表(#`O′)命中,1代表命中,然后通过几组hash函数,均匀的把key分散到数组上。一次表示是否存在当前key,存在一定的误判率;

      原理:

      当查询某个key是否存在的时候,通过几组hash算法得到某个索引值,跟布隆过滤器上的位置比较看是否你是1,如果这几组的hash只能算下来都可以在布隆过滤器命中,那么就代表这个key存在;由于hash算法会产生hash冲突,因此可以多使用集中规则的hash函数,以及一个超长的位图数组;

  • 缓存雪崩:

    • 当缓存中大量的key在哪同一时间失效或者集中在某个时间失效,大量请求正解打到数据存储层,数据库崩溃,系统挂掉;

    • 解决方案:

      设置二级缓存

      把集中设置的key的过期时间随机分散开来;

      限流处理

  • 缓存击穿

    • 一般指某些热点数据突然失效,访问量突然激增,跟缓存雪崩差不对,只是缓存击穿是指一个key;

    • 刚好在访问量激增前的一瞬间这个key失效,导致访问直接到数据库岑储层;

    • 并发量过大把数据库击垮;

    解决方案:

    对于可预见到的热点访问数据,可以不设置数据的失效时间,作为热点数据永久存储;

    加锁:

    可以利用分布式锁对数据加锁处理,当大量请求到达访问时,如果此时缓存已经失效,那么可以对这个失效了的资源加锁处理,保证不会有大量并发同一时间到数据存层;

  • 缓存不一致问题

    • 数据库跟Redis数据不一致

    • 解决方案:

      先更新数据库再更新缓存或者先更新缓存再更新数据库

      1、给缓存key加过期时间,即使高并发场景下,出现了偶现的不一致,也会随着下次读而数据一致;

      2、或者系统要求必须强一致性,可以加读写锁的方式保证操作的原子性;

      3、引入canal监听数据库binlog日志,同步缓存数据;