服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Redis - 基于Redis缓存数据常见的三种问题及解决

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

2022-10-24 15:40道上叫我卢铁柱 Redis

这篇文章主要介绍了基于Redis缓存数据常见的三种问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

1.缓存穿透

1.1 问题描述

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

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

基于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缓存的方法。

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

3.缓存雪崩

3.1 问题描述

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

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

3.2 解决方法

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

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

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

(2) 使用锁或队列:

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

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

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

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

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

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

原文链接:https://blog.csdn.net/lumingzhu111/article/details/120166344

延伸 · 阅读

精彩推荐
  • RedisRedis与本地缓存的结合实现

    Redis与本地缓存的结合实现

    我们开发中经常用到Redis作为缓存,本文主要介绍了Redis与本地缓存的结合实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考...

    热黄油啤酒7172022-07-14
  • Rediswindows下使用redis requirepass认证不起作用的解决方法

    windows下使用redis requirepass认证不起作用的解决方法

    今天小编就为大家分享一篇windows下使用redis requirepass认证不起作用的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 ...

    Winyu_4322019-11-13
  • RedisRedis 哨兵高模式搭建及Java代码配置

    Redis 哨兵高模式搭建及Java代码配置

    这篇文章主要介绍了Redis 哨兵高模式搭建及Java代码配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友...

    涟漪海洋10732021-02-22
  • Redis详解Redis使用认证密码登录

    详解Redis使用认证密码登录

    本篇文章主要介绍了详解Redis使用认证密码登录 。启用Redis的认证密码可以增加Redis服务器的安全性。有兴趣的可以了解下 ...

    502studio12902019-11-06
  • Redisredis的五大数据类型应用场景分析

    redis的五大数据类型应用场景分析

    这篇文章主要介绍了redis的五大数据类型实现原理,本文给大家分享五大数据类型的应用场景分析,需要的朋友可以参考下...

    Nelson-Wang4352021-09-18
  • Redisredis远程连接不上的解决办法

    redis远程连接不上的解决办法

    本文主要介绍了redis远程连接不上的解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随...

    成伟平cwp11032022-10-17
  • RedisRedis分布式锁python-redis-lock使用方法

    Redis分布式锁python-redis-lock使用方法

    这篇文章主要介绍了Redis分布式锁python-redis-lock使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可...

    -零7912021-01-03
  • Redis一文弄懂Redis为什么这么快?

    一文弄懂Redis为什么这么快?

    大家在工作里面也肯定和 Redis 打过交道,但是对于Redis 为什么快,除了对八股文的背诵,好像都还没特别深入的了解。...

    三太子敖丙7522022-01-04