NoSQL:Redis缓存、雪崩、击穿、穿透
Redis介绍
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。
Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。 [1]
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
Redis的官网地址,非常好记,是Redis.io。(域名后缀io属于国家域名,是british Indian Ocean territory,即英属印度洋领地),Vmware在资助着redis项目的开发和维护。
Redis持久化分为RDB和AOF:
RDB:RDB是在指定时间内将数据根据快照保存在磁盘中,在磁盘中会生成一个二进制文件。
RDB触发机制分为Save和bgServe:
Save:他会将Redis进行阻塞只有执行完之后其他操作才可以执行,他会将原先的旧文件替换掉
bgSave:Redis会异步执行快照,在执行快照期间也可以进行其他操作。
AOF:AOF是将每一个写的操作最佳到文件后面,就相当于日志记录一样。
AOF:触发always、everysec、no
always:每次数据发生改变的时候进行保存
everysec:每秒同步
no:从不同步
Redis缓存
分布式缓存解决的问题:数据库服务器和Web服务器之间的瓶颈,如果一个网站流量很大这个瓶颈会非常明显,每次数据库查询耗费的时间讲Velocity来实现页面静态化。对于更新数据已秒级的站点,静态化也不会立项,可通过分布式缓存系统来解决,如Redis数据存储方案
Redis雪崩、穿透、击穿
一、雪崩
1.通俗场景
双十一期间,所有用户一打开淘宝就是进入首页,首页的压力非常大,为了提高并发,将网站数据都缓存到Redis里,所有的Redis Key失效时间都是3小时。双十一当天大量用户剁手狂欢,这时候3小时过去了,Redis里首页的key缓存全部失败,这时候Redis里查询不到数据了,只能去数据中查询,造成数据库无法响应挂掉
总结
雪崩指的十多个key查询并且出现高并发,缓存中失效或查不到,然后都去DB查询,从而导致DB突然飙升,从而导致数据库崩溃
出现原因
(1)key同时失效
(2)Redis本身崩溃了
2.雪崩解决方案
1)加锁排队
加锁排队只是为了减轻数据库的压力,并没有提高系统吞吐量。加色在高并发下,缓存重建期间key是锁着的,这是过来1000个请求999个都阻塞的。同样会导致用户等待超时,这是个治标不治本的方法!
注意:加锁排队的解决方式分布式环境的高并发问题,有可能还要解决分布式锁的问题;线程还会被阻塞,用户体验很差!因此,在真正的高并发场景下很少使用!
2)缓存失效时间分散开(随机值)
setRedis(key,value,time+Math.random()*10000)
为不同的key设置随便不同的时间,避免大量的key同时失效
二、击穿
1.通俗场景
任用脚本疯狂的给老哥发送请求,查询id=-1的数据,Redis并没有这样的数据,这时候就击穿redis,直接打到数据库上。
当缓存与数据库中都不存在该数据上时,由于当数据库查询不到数据就不会写入缓存,这个时候如果用户不断的恶意发送请求,就会导致这个不存在的数据每次请求都会查询DB,请求量打的情况下,就会导致DB压力过大,直接挂掉
总结
Redis中没有这样的数据,无法进行拦截,直接被穿透到数据库,导致数据库压力过大宕机。
2.解决方案
可以先过滤请求不合法数据(如数据库id都是大于o的,结果你一直用小于o的去请求,这就不合法)
1)缓存空数据
当查询返回一个空数据时,直接将这个空数据存到缓存中,过期时间不宜设置过长,建议不超过s分钟
2)采用布隆过滤器
布隆过滤器(Bloom Filter):是由Howard Bloom在1970年提出的一种比较巧妙的概率型数据结构,它可以告诉你某种东西一定不存在或者可能存在
将所有可能存在数据,分别通过多个哈希函数生成多个哈希值,然后将这些哈希值存到一个足够大的bitmap中,此时一个一定不存在的数据就会被这个bitmap拦截,从而减少了数据库的查询压力。
bf.add:添加元素到布隆过滤器中,类似于集合的sadd命令,不过bf.add命令只能—次添加一个元素,如果想—次添加多个元素,可以使用bf.madd命令。
bf.exists:判断某个元素是否在过滤器中,类似于集合的sismember命令,不过bf.exists命令只能一次查询一个元素,如果想—次查询多个元素,可以使用bf.mexists命令。
布隆器原理:
Redis中布隆过滤器的数据结构就是一个很大的位数组和几个不一样的无偏哈希函数(能把元素的哈希值算得比较平均,能让元素被哈希到位数组中的位置比较随机)
三、击穿
1、通俗场景
双十一马爸爸突发奇想,想拍卖自己穿了20年的老布鞋,并且附带本人签名,程序员将该鞋的信息存到了redis中,设置了3小时过期。寻思3小时够他们抢了吧,但他低估了马爸爸的魅力。该商品引起了一千万人关注,这些人不断的竞拍这双鞋,价格越拍越高,马爸爸乐开了花。竞拍了2小时59分,马上要拍到一个亿了,突然这双鞋在redis里的key数据过期了,导致该key的大量请求,都打到了数据库,直接导致数据库挂掉了,服务无法响应。
key对应的数据存在,但在redis中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮
总结
某一个热点key,在不停地扛着高并发,当这个热点key在失效的一瞬间,持续的高并发访问就击破缓存直接访问数据库,导致数据库宕机
*与雪崩的区别:雪崩是一堆key过期请求,击穿中指高并发对一个无效的key请求*
2、解决方案
1)设置热点数据"永不过期"加上
2)加上互斥锁
上面的现象是多个线程同时去查询数据库的这条数据,那么我们可以在第一个查询数据的请求上使用—个互斥锁来锁住它
其他的线程走到这一步拿不到锁就等着,等第一个线程查询到了数据,然后将数据放到redis缓存起来。后面的线程进来发现已经有缓存了,就直接走缓存
雪崩是大面积的key缓存失效;
穿透是redis里不存在这个缓存key;
击穿是redis某一个热点key突然失效,最终的受害者都是数据库
希望这篇文章对大家有所帮助。请使用评论添加你的反馈意见,这有助于我提高自己的下一篇文章。如果有任何疑问,请在评论部分提出你的疑问,后续会持续更新博客,期望大家关注,共同进步,谢谢。
NoSQL:Redis缓存、雪崩、击穿、穿透的更多相关文章
- redis缓存雪崩、穿透、击穿概念及解决办法
缓存雪崩 对于系统 A,假设每天高峰期每秒 5000 个请求,本来缓存在高峰期可以扛住每秒 4000 个请求,但是缓存机器意外发生了全盘宕机.缓存挂了,此时 1 秒 5000 个请求全部落数据库,数据 ...
- Redis 缓存雪崩、穿透、击穿
缓存雪崩 定义: 同一时间所有 key 大面积失效,比如网站首页的数据基本上都是同一批次去缓存的. 解决方法: ① 存的时候设定随机的失效时间. ② 服务做熔断处理(异常或着慢查询 Hystrix 限 ...
- 关于redis的几件小事(七)redis缓存雪崩与穿透
1.缓存雪崩 (1)什么是缓存雪崩 缓存雪崩指的是在同一时刻,缓存大量失效,导致大量的请求直接到了数据库,数据库压力剧增,引起系统崩溃.可能出现的情况有: ①大量的key设置了相同的过期时间,导致在缓 ...
- Redis缓存雪崩和穿透的解决方法
转载自: https://blog.csdn.net/qq_35433716/article/details/86375506 如何解决缓存雪崩?如何解决缓存穿透?如何保证缓存与数据库双写时一致的问题 ...
- Redis缓存雪崩、缓存穿透、缓存击穿、缓存降级、缓存预热、缓存更新
Redis缓存能够有效地加速应用的读写速度,就DB来说,Redis成绩已经很惊人了,且不说memcachedb和Tokyo Cabinet之流,就说原版的memcached,速度似乎也只能达到这个级别 ...
- Redis缓存雪崩、击穿、穿透
参考大佬 前言 Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行360°的刁难.作为一个在互联网公司面一次拿一次offer的面霸(请允 ...
- 8.了解什么是 redis 的雪崩、穿透和击穿?redis 崩溃之后会怎么样?系统该如何应对这种情况?如何处理 redis 的穿透?
作者:中华石杉 面试题 了解什么是 redis 的雪崩.穿透和击穿?redis 崩溃之后会怎么样?系统该如何应对这种情况?如何处理 redis 的穿透? 面试官心理分析 其实这是问到缓存必问的,因为缓 ...
- redis缓存雪崩,缓存穿透,缓存击穿的解决方法
一.缓存雪崩 缓存雪崩表示在某一时间段,缓存集中失效,导致请求全部走数据库,有可能搞垮数据库,使整个服务瘫痪. 使缓存集中失效的原因: 1.redis服务器挂掉了. 2.对缓存数据设置了相同的过期时间 ...
- SpringBoot微服务电商项目开发实战 --- Redis缓存雪崩、缓存穿透、缓存击穿防范
最近已经推出了好几篇SpringBoot+Dubbo+Redis+Kafka实现电商的文章,今天再次回到分布式微服务项目中来,在开始写今天的系列五文章之前,我先回顾下前面的内容. 系列(一):主要说了 ...
随机推荐
- appium填坑
首次使用appium web driver,不说搭建环境的麻烦,初次写完一个操作计算器的程序,但是运行一直报错:selenium.common.exceptions.WebDriverExceptio ...
- k8s集群中部署prometheus server
1.概述 本文档主要介绍如何在k8s集群中部署prometheus server用来作为监控的数据采集服务器,这样做可以很方便的对k8s集群中的指标.pod的.节点的指标进行采集和监控. 2.下载镜像 ...
- Solution -「AGC 013E」「AT 2371」Placing Squares
\(\mathcal{Description}\) Link. 给定一个长度为 \(n\) 的木板,木板上有 \(m\) 个标记点,第 \(i\) 个标记点距离木板左端点的距离为 \(x_i\ ...
- CentOS7搭建yum源仓库(阿里源)
文章目录 注意:环境要求 1.配置服务器端yum 1.1.安装yum源工具 1.2.配置nginx 1.2.1.配置nginx页面目录 1.3.替换yum源文件 1.4.建立yum源仓库 2.配置客户 ...
- JMM之synchronized关键字
对于通讯,涉及两个关键字volatile和synchronized: Java支持多个线程同时访问一个对象或者对象的成员变量,由于每个线程可以拥有这个变量的拷贝(虽然对象及其成员变量分配的内存实在共享 ...
- CentOS单机安装k8s并部署.NET 6程序 压测 记录
前面部分依照CentOS单机安装k8s并部署.NET 6程序来进行,内存.cpu.centos版本一致,之前222元买的三年8M 2c4g腾讯云轻量服务器,这个教程算是写的很详细的了,基本可以一致执行 ...
- Ubuntu20.04 Focal Cloudimage扩容以及KVM安装的问题记录
运行Ubuntu20.04的KVM虚机遇到一些问题, 单独总结一下 镜像扩容 不能用virt-resize --expand /dev/sda1 old.qcow2 new.qcow2这样的命令, 这 ...
- [自动化]基于kolla-ansible部署的openstack自动化巡检生成xlsx报告
自动化巡检介绍 此巡检项目在kolla-ansible部署的openstack环境上开发,利用ansible-playbook编排的功能,对巡检的任务进行编排和数据处理.主要巡检的对象有IaaS平台和 ...
- 手把手教你如何通过CC2531抓取Zigbee包,并解析加密Zigbee包
前言 好久不见啊,大伙假期过得咋样? 最近我在研究 Zigbee ,使用了EFR32(购买链接)的开发板,之前也研究过一点,水了几篇文章,但是没有深了解和使用.最近 arduino 玩腻了,我开始回过 ...
- 利用AWVS扫描Web漏洞
实验目的 利用AWVS扫描Web漏洞. 实验原理 AWVS是一款知名的网络漏洞扫描工具,它通过网络爬虫测试你的网站安全,检测流行安全漏洞. 实验内容 AWVS是一个自动化的web应用程序安全测试工具, ...