常见的基于Redis缓存数据问题及解决方案
来源:亿速云
时间:2023-05-08 17:49:01 204浏览 收藏
小伙伴们对数据库编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《常见的基于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缓存数据问题及解决方案》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多数据库知识!
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
342 收藏
-
361 收藏
-
159 收藏
-
164 收藏
-
221 收藏
-
156 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 507次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习