缓存世界中的三大问题及解决方案
Redis 经常用于系统中的缓存,可以极大地提高了系统性能和效率,但同时也带来一些问题。一个是数据一致性问题。从严格意义上讲,只要使用缓存,就会出现一致性问题,这是无法解决的。另一个问题是本文将讨论的缓存穿透,缓存击穿和缓存雪崩,这三个问题不仅限于 Redis,其他缓存工具同样需要面对这三个问题。接下来我详细讲解这三个问题以及对应的解决方案。
一、缓存穿透
缓存穿透意味着当用户查询数据库不存在数据时,返回的结果为空,并且结果不会在缓存中存储。假设用户不断发起这样的请求,它将永远不会访问缓存,导致所有查询都落在数据库上,从而导致数据库被打死。
public Object getGoods(Long goodsId) {//从 Redis 获取 goods 信息Object goodsInfo = redisTemplate.opsForValue().get(String.valueOf(goodsId));if (goodsInfo != null) { return goodsInfo;}//从数据库查询 goods 信息,并存入 RedisgoodsInfo = goodsDao.selectByGoodsId(goodsId);if (goodsInfo != null) { redisTemplate.opsForValue().set(String.valueOf(goodsId), goodsInfo);}return goodsInfo;
}
假设 goodsId 没有负数情况,如果发起一个参数 goodsId = -1 的请求,这个数据在缓存中肯定不会存在,每次它都会进入查询数据库,并且数据查询结果也是 null,并且不会缓存结果到 Redis。
解:
1) 通过用户认证、参数验证等,在上层拦截这些不合理的请求;
2) 当数据库查询结果为空时,数据也被缓存,但缓存有效期设置较短,以免影响正常数据的缓存。
解:
实际上,在大多数实际业务场景中,缓存击穿是实时发生的,但不会对数据库造成太大压力,因为一般的公司业务,并发量不会那么高。当然如果你不幸有这种情况,你可以通过设置这些热点键,使其永远不会过期。另一种方法是通过互斥锁来控制查询数据库的线程访问,但这种会导致系统的吞吐率下降,需要实际情况使用。
数据未加载到缓存中,或者缓存同时在大范围中失效,导致所有请求查找数据库,导致数据库、CPU 和内存过载,甚至停机。
一个简单的雪崩过程:
1) Redis 集群的大面积故障;
2) 缓存失败,但仍有大量请求访问缓存服务 Redis;
3) 在大量 Redis 请求失败后,请求转向数据库;
4) 数据库请求急剧增加,导致数据库被打死;
5) 由于你应用程序服务大部分都依赖于数据库和 Redis 服务,它很快就会导致服务器集群的雪崩,最后整个系统将彻底崩溃。
解:
事前:高可用的缓存
高可用的缓存是防止出现整个缓存故障。即使个别节点,机器甚甚至机房都关闭,系统仍然可以提供服务,Redis 哨兵(Sentinel) 和 Redis 集群(Cluster) 都可以做到高可用。
事中:缓存降级(临时支持)
当访问次数急剧增加导致服务出现问题时,我们如何确保服务仍然可用。在国内使用比较多的是 Hystrix,它通过熔断、降级、限流三个手段来降低雪崩发生后的损失。只要确保数据库不死,系统总可以响应请求,每年的春节 12306 我们不都是这么过来的吗?只要还可以响应起码还有抢到票的机会。
事后:Redis 备份和快速预热
1) Redis 数据备份和恢复
2) 快速缓存预热
目前的大部分的系统都增加了缓存机制,避免对数据库造成过大压力导致系统出问题,极大的提升系统稳定性。虽然使用缓存能够给系统带来了一定的质的提升,但同时也带来缓存穿透、缓存击穿、缓存雪崩问题等问题。特别是当并发量增大、恶意攻击的时候,是很难避免。这些问题应该在设计系统时候就应该考虑,这样设计出来的系统才经得起考验。
扩展阅读
甲骨文因超过90亿美元的NetSuite交易起诉Larry Ellison和CEO Safra Catz
MySQL入门全套
Oracle 12c因bug导致ORA-04031问题处理过程 | 云和恩墨技术通讯精选
一名33岁运维工程师的自述,如何度过中年危机
不会SQL注入,连漫画都看不懂了
史上最全近百条Oracle DBA日常维护SQL脚本指令
数据和云
ID:OraNews
如有收获,请划至底部,点击“在看”,谢谢!
资源下载
关注公众号:数据和云(OraNews)回复关键字获取
help,30万+下载的完整菜单栏
2019DTCC,数据库大会PPT
2018DTCC , 数据库大会PPT
2018DTC,2018 DTC 大会 PPT
ENMOBK,《Oracle性能优化与诊断案例》
DBALIFE,“DBA 的一天”海报
DBA04,DBA 手记4 电子书
122ARCH,Oracle 12.2体系结构图
2018OOW,Oracle OpenWorld 资料
产品推荐
云和恩墨Bethune Pro2 企业版,集监控、巡检、安全于一身,你的专属数据库实时监控和智能巡检平台,漂亮的不像实力派,你值得拥有!
云和恩墨zData一体机现已发布超融合版本和精简版,支持各种简化场景部署,零数据丢失备份一体机ZDBM也已发布,欢迎关注。
云和恩墨大讲堂 | 一个分享交流的地方
长按,识别二维码,加入万人交流社群
请备注:云和恩墨大讲堂
缓存世界中的三大问题及解决方案相关推荐
- Java面试题:缓存三大问题及解决方案!
Java面试少不了一些技术类型的笔试题,面试过程中很多小伙伴可能表达很好,结果Java基础不是很牢固,所以今天针对Java笔试题,小编汇总来一下Java的面试题缓存三大问题及解决方案. 1. Java ...
- redis(五)-缓存三大问题及解决方案
缓存的设计包含很多技巧,设计不当将会导致严重的后果.本文将介绍缓存使用中常见的三大问题,并给出相应的解决方案. 缓存穿透 缓存雪崩 缓存击穿 1. 缓存穿透 在大多数互联网应用中,缓存的使用方式如下图 ...
- 面试常考!缓存三大问题及解决方案
1. 缓存来由 随着互联网系统发展的逐步完善,提高系统的qps,目前的绝大部分系统都增加了缓存机制从而避免请求过多的直接与数据库操作从而造成系统瓶颈,极大的提升了用户体验和系统稳定性. 2. 缓存问题 ...
- 缓存中常见的概念及解决方案
缓存中常见的概念及解决方案 缓存穿透 1.概念 用户查询数据,在数据库中以及缓存中(redis)都查询不到,导致每次请求来时,缓存(redis)中查询一次,数据库查询一次,最后返回空,每次请求都会有俩 ...
- 缓存三大问题及解决方案
1. 缓存来由 随着互联网系统发展的逐步完善,提高系统的qps,目前的绝大部分系统都增加了缓存机制从而避免请求过多的直接与数据库操作从而造成系统瓶颈,极大的提升了用户体验和系统稳定性. 2. 缓存问题 ...
- 12个现实世界中的机器学习真相
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者:Delip 编译:ronghuaiyang 导读 当你在现实 ...
- 缓存系统中的三座大山
缓存系统中的三座大山 文章目录 缓存系统中的三座大山 一.什么是缓存 1.无处不在的缓存 2.高并发系统中的缓存 2.1 缓存系统的作用 2.2 缓存系统访问流程 二.缓存系统的三大问题 1.1缓存雪 ...
- Atitit it行业图像处理行业软件行业感到到迷茫的三大原因和解决方案
Atitit it行业图像处理行业软件行业感到到迷茫的三大原因和解决方案 1. 迷茫的原因最大原因是未知1 1.1. 我在哪里??自己的定位,1 1.2. 正确方向是什么??1 1.3. 虽然找到方向 ...
- 不确定性量化 (UQ) 可以显著提高预测准确性,在不确定的世界中获得最佳结果昆士兰大学Mike McKerns-中国学者网
在不确定的世界中获得最佳结果, 不确定性量化可以解开成功与失败之间的区别. 不确定性量化 (UQ) 可以显著提高预测准确性,提供设计优化,并在充满未知的世界中促进快速解决方案改进. 昆士兰大学的一个机 ...
最新文章
- Linux GCC lib库相互引用,互相依赖(交叉引用)链接解决办法
- const 和readonly
- 对编程人员我想说:多做 多实践 多写代码
- c4d如何把文字贴在物体表面_一篇文章带你了解C4D布光技巧
- 【专利】实用新型专利设计模板
- 分享qq空间出现失败
- 统信UOS系统安装mysql_统信UOS系统手动安装分区方案
- 透彻理解高斯过程Gaussian Process (GP)
- javax.persistence.EntityNotFoundException: Unable to find 类 with id ?
- 几种修复照片画质的方法
- 数据分析师培训告诉你 三个最常见的数据分析面试方向
- 计算机卡怎么解决,电脑卡怎么办,详细教您电脑卡怎么解决
- Thread.setDaemon详解
- 华三HCL和华为ensp不能同时安装且ensp设备启动失败错误代码40怎么办?
- 最新最全的非常有趣的逻辑推理题目大全
- 计算机鼠标不出现在电脑屏幕上,电脑开机屏幕上看不到鼠标箭头?
- 史上最全的android studio 插件大全整理
- 20190517考试ocp052碰到的题目
- 关于Windows10显示无法快速启动,查询日志显示:错误状态为 0xC00000D4的解决方案探索
- Windows ❀ Windows系统下端口连通性常见的验证方法
热门文章
- opensource项目_最佳Opensource.com:艺术与设计
- 2017 开源软件排行_2017年开源大会精选
- devops最佳实践_DevOps最佳实践如何改善团队动力
- get set方法简化_简化开放科学的4种方法
- (43)前端工程化总结
- (10)Node.js核心模块—fs文件系统之目录操作
- 用高效好玩的方式,掌握职场必备技能Python
- CSS属性值之百分数
- 一.路径规划---二维路径规划仿真实现-gmapping+amcl+map_server+move_base
- java 判断正负数_Java判断一个字符串为数字(正负、小数)