关于redis缓存数据库的一些思考
今晚无聊,躺在床上,在刷技术文章时,看见了一篇关于redis缓存的文章 写的蛮好,这也就引起了我对于redis思考!
不如往深了说 引起了我对于追求探索技术本质的一些思考 平时在网上刷到很多关于redis的文章,我也在项目中经常用到redis这个缓存数据库 记得自己初学redis时 总是纠结技术如果去学 但是随着阅历以及学习能力和经验的提高 自己也对技术也有一些悟出来的道理 或者说是如何学好技术 往后有时间或者哪天心血来潮了写一篇关于自己对于技术的认知
还是进入主题,在网上经常刷到关于redis的文章,自己也经常在项目中用到redis,但是自己从来没有太过深究redis,心里老觉得不得劲 于是今晚就心血来潮了写一篇关于自己对redis的一些思考
这里我就不说redis是干什么的了,如果不知道看下我之前写的redis文章,这些文章中也有官网的内容 因为我也是从官网学的)
1.聊聊redis缓存穿透问题
如何理解缓存穿透呢?就是当请求访问过来时 先去查询redis缓存,如果缓存中没有, 再去查询mysql数据库, 然后mysql数据库返回数据到redis缓存中, redis接收数据并把数据存储起来, 这样当下次请求过来时,服务端就直接查询redis缓存了并返回给客户端,不必再去查询mysql,缓解了数据库压力,并提高了效率
这是我们的正常情况对不对!

但但但但但但但是......有没有想过一个问题,如果是黑客恶意攻击,客户端发起的请求中的数据,我们缓存中不仅没有,就连我们的mysql中也没有! 这下完犊子了 这下客户端只要重复的发送这个请求,所有的请求会经过redis后然后再来请求我们的mysql,因为我们数据库中没有呀,所以查询不到,也没有数据往redis中存),这就是缓存穿透
那么如果是一个黑客恶意发起请求,mysql就有可能在长时间内持续承受大量的请求,mysql这时候心里很苦,很快就会撂挑子不干了,直接宕机,(接下来,整个系统宕机,然后你就抓紧删库跑路吧,(逃,
如果是大型项目的话,这个损失是很大的
那我们就要像羔羊一样任人宰割吗?NONONO,redis还有一个好兄弟,这个好兄弟叫作布隆过滤器
这个好兄弟可以存放大数据量,(偷偷告诉你,存放大数据量是他的优点,但是他也有缺点,就是查询到的结果不一定准确,0代表一定没有,1代表不一定有,布隆过滤器这位redis的好兄弟我这里就不介绍了,只介绍这位好兄弟如何仗义行侠帮助我们的redis
在中间加了这位好兄弟,那么当请求进来后,会首先经过我们的布隆过滤器,这个好兄弟先判断这个数据存不存在,若判断不存在直接丢弃请求,若这个数据存在再去进行redis查询,然后执行下一步,最后响应,有了这位好兄弟,我们就可以讲数据库中所有的查询条件,放入布隆过滤器中,所有的请求先交给这位好兄弟来处理(这位好兄弟是有那么一点不靠谱,但是大体上并不影响

其实还有一种解决方案是把查询到的空值的key缓存起来并设置过期时间,但是会有一种弊端,就是如何发起大量的请求,那岂不是要接收多少空值的key,都要存在redis中,redis是内存数据库,内存不要钱吗?而且遭到恶意攻击,能有多大内存和黑客刚呢?
具体场景具体用法:
- 如果空值的key少可以考虑缓存起来
- 如果空值的key多并且不重复,还是让布隆过滤器这位好兄弟来拔刀相助比较好
2.聊聊redis缓存雪崩问题
缓存雪崩可以这样理解,雪崩雪崩嘛!这些缓存就像雪一样发生了崩塌,缓存是存在于我们的redis这位好兄弟这里的,这位好兄弟平常管理着这些缓存,加入哪一天这兄弟不高兴了,撒手不干了,宕机),那岂不是这些缓存数据又没了,当请求来临时又要mysql兄弟处理了,mysql兄弟看到这么些请求过来淦它,心里直发怵啊!简直是瑟瑟发抖,造成了结果就是数据库崩溃,系统崩溃 这就是我们缓存雪崩,简单来说redis宕机了

解决方案也很简单,简单粗暴,一个不行来俩甚至更多,一节更比六节强,搭建redis集群然后交给hystrix来监控

3.聊聊缓存击穿问题
缓存击穿这个和缓存穿透字面上有点像,但是区别在于缓存穿透是数据中没有这个key,但是缓存击穿是数据中有这个key,并且我们要把这个key缓存到redis中,
比如淘宝双11,并不是所有的商品都要搞活动,只是一部分搞活动,那么这一部分商品在活动开始时,必然会有大量的用户去抢购,大量的请求),这时候如果我们的数据在mysql中,mysql必然不干了,mysql这位兄弟内存又要骂娘了,那么我们就需要redis来救场,提前把这些热点的key(需要搞活动的商品)缓存到redis中,当活动开始时直接去淦redis,没事redis扛得住,这样就解决了这个问题
但但但但但但是.......如果这个key突然在用户还没抢购完的时候,很妈离谱就过期了!那么完犊子,mysql又要骂娘了
这就是缓存击穿(热点key过期问题)
解决方案:
- 热点key竟然要妈离谱过期,我们在设置热点key时让这个bi永不过期就完事了,简单粗暴
- 互斥锁,当第一个查询数据库的请求发起时,给缓存中这个数据上锁,其他请求这个key等待,当第一个查询数据库打请求完成后解锁,其他请求直接从缓存中查
关于redis缓存数据库的一些思考的更多相关文章
- 快速搭建Redis缓存数据库
之前一篇随笔——Redis安装及主从配置已经详细的介绍过Redis的安装于配置.本文要讲的是如何在已经安装过Redis的机器上快速的创建出一个新的Redis缓存数据库. 一.环境介绍 1) Linux ...
- [技术博客] 用户验证码验证机制---redis缓存数据库的使用
目录 问题引入 初识redis 实际应用 作者:马振亚 问题引入 在这次的开发过程中,我们的需求中有一个是普通用户可以通过特定的机制申请成为社长.因为只有部分人才能验证成功,所以这个最开始想了两种思路 ...
- Django缓存机制以及使用redis缓存数据库
目录 Django 配置缓存机制 缓存系统工作原理 Django settings 中 默认cache 缓存配置 利用文件系统来缓存 使用Memcache来缓存: 使用Local-memory来缓存: ...
- NOSQL中的redis缓存数据库
NOSQL概述 什么是NOSQL? NoSql(NoSQL=Not Only SQL),意思为"不仅仅是SQL",是一个全新的数据库理念,泛指非关系型的数据库. 为什么需要NOSQ ...
- redis缓存数据库及Python操作redis
缓存数据库介绍 NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库,随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站, 特 ...
- NoSQL:redis缓存数据库
一 Redis介绍 Redis和Memcached类似,也属于key-value nosql 数据库 Redis官网redis.io, 当前最新稳定版4.0.1 和Memcached类似,它支持存储的 ...
- 性能超前,详解腾讯云新一代Redis缓存数据库
背景 当前内存数据库发展迅速,用户对于存储系统的要求也越来越高,为了满足各类业务场景的需要,腾讯云设计了新一代的内存数据库,不但保留了原来系统的高性能,高可用等特性,同时还兼容了当前流行的Redis原 ...
- redis缓存数据库
redis 介绍 redis是业界主流的key-value nosql 数据库之一.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set( ...
- 关于Redis缓存数据库
将数据存入缓存1.(会先从数据库查数据,数据库没有会从缓存中拿,没有则会从数据库拿.且加入缓存)@Cacheable(name="命名空间",key="#xxx^&quo ...
随机推荐
- 01、mysql安装配置
1.下载mysql软件安装包 MySQL版本:5.7.17 mysql下载地址:http://rj.baidu.com/soft/detail/12585.html?ald 2.配置mysql数据库与 ...
- Gitlab 快速部署及日常维护 (二)
一.概述 上一篇我们将Gitlab的安装部署和初始化设置部分全部讲解完成了,接下来我们介绍Gitlab在日常工作中常遇见的问题进行梳理说明. 二.Gitlab的安装和维护过程中常见问题 1.Gitla ...
- SDN总结
之前做项目用到了SDN,知道其作用,但是对其不是特别熟悉,今天特来总结一下相关知识点: 1. SDN的典型架构分为哪三层 主要分为应用层,控制层,和基础设施层: 2. SDN技术的关键点是 控制平面和 ...
- codeforces 858A
A. k-rounding time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- cnblogs blogs backup & node.js crawler
cnblogs blogs backup & node.js crawler refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访 ...
- Github App version released icons
# Github App version released icons http://shields.io/ Build Travis: https://img.shields.io/travis/U ...
- Web 前端如何优雅的处理海量数据
Web 前端如何优雅的处理海量数据 Q: 如何在 Web 页面上处理上亿条后端返回的数据,并且保证 UI 展示的流畅性 A: 思路: 时间分片, 批处理,Buffer 缓存,虚拟滚动,Web Work ...
- Java REPL & JShell
Java REPL & JShell Java 11 JShell Java Shell https://www.infoq.com/articles/jshell-java-repl/ Th ...
- Node.js & ES modules & .mjs
Node.js & ES modules & .mjs Node.js v13.9.0 https://nodejs.org/api/esm.html https://nodejs.o ...
- 020_CSS3
目录 如何学习CSS 什么是CSS 发展史 快速入门 css的优势 三种CSS导入方式 拓展:外部样式两种写法 选择器 基本选择器 层次选择器 结构伪类选择器 属性选择器 美化网页元素 为什么要美化网 ...