当前位置:首页 » 操作系统 » 雪崩数据库

雪崩数据库

发布时间: 2023-02-15 22:53:39

‘壹’ 12 个问题搞懂 Redis

都说学习需要带着问题,带着思考进行学习,下面就以问题的形式来学习下 Redis 。

1、什么是 Redis ?

2、都说 Redis 是单线程模型,到底是什么意思?

3、为什么在数据读写处理上不使用多线程?

4、为什么使用单线程,速度却很快?

5、单线程处理的瓶颈是什么?

6、Redis 6.0 调整为多线程的原因?

7、在 Redis 中怎样做持久化?

8、常说的缓存雪崩、击穿、穿透是什么?

9、怎样解决雪崩、击穿、穿透带来的问题?

10、怎样设计缓存的淘汰机制?

11、怎样保证缓存和数据库的数据一致?

12、Redis 有什么使用规范?

Redis 的知识远不止如此,本文总结了一些我认为比较重要的一些点,希望对您有所帮助!

‘贰’ 哪些因素影响了数据库性能

网络宽带,磁盘IO,查询速度都会影响到数据库的性能。

具体问题具体分析,举例来说明为什么磁盘IO成瓶颈数据库的性能急速下降了。

为什么当磁盘IO成瓶颈之后, 数据库的性能不是达到饱和的平衡状态,而是急剧下降。为什么数据库的性能有非常明显的分界点,原因是什么?

相信大部分做数据库运维的朋友,都遇到这种情况。 数据库在前一天性能表现的相当稳定,数据库的响应时间也很正常,但就在今天,在业务人员反馈业务流量没有任何上升的情况下,数据库的变得不稳定了,有时候一个最简单的insert操作, 需要几十秒,但99%的insert却又可以在几毫秒完成,这又是为什么了?

dba此时心中有无限的疑惑,到底是什么原因呢? 磁盘IO性能变差了?还是业务运维人员反馈的流量压根就不对? 还是数据库内部出问题?昨天不是还好好的吗?

当数据库出现响应时间不稳定的时候,我们在操作系统上会看到磁盘的利用率会比较高,如果观察仔细一点,还可以看到,存在一些读的IO. 数据库服务器如果存在大量的写IO,性能一般都是正常跟稳定的,但只要存在少量的读IO,则性能开始出现抖动,存在大量的读IO时(排除配备非常高速磁盘的机器),对于在线交易的数据库系统来说,大概性能就雪崩了。为什么操作系统上看到的磁盘读IO跟写IO所带来的性能差距这么大呢?

如果亲之前没有注意到上述的现象,亲对上述的结论也是怀疑。但请看下面的分解。

在写这个文章之前,作者阅读了大量跟的IO相关的代码,如异步IO线程的相关的,innodb_buffer池相关的,以及跟读数据块最相关的核心函数buf_page_get_gen函数以及其调用的相关子函数。为了将文章写得通俗点,看起来不那么累,因此不再一行一行的将代码解析写出来。

咱们先来提问题。buf_page_get_gen函数的作用是从Buffer bool里面读数据页,可能存在以下几种情况。

提问. 数据页不在buffer bool 里面该怎么办?

回答:去读文件,将文件中的数据页加载到buffer pool里面。下面是函数buffer_read_page的函数,作用是将物理数据页加载到buffer pool, 图片中显示

buffer_read_page函数栈的顶层是pread64(),调用了操作系统的读函数。


通过解析buf_wait_for_read函数的下层函数,我们知道其实通过首先自旋加锁pin的方式,超过设定的自旋次数之后,进入等待,等待IO完成被唤醒。这样节省不停自旋pin时消耗的cpu,但需要付出被唤起时的开销。

再继续扩展问题: 如果会话线程A 经过物理IO将数据页1001读入buffer之后,他需要修改这个页,而在会话线程A之后的其他的同样需要访问数据页1001的会话线程,即使在数据页1001被入读buffer pool之后,将仍然处于等待中。因为在数据页上读取或者更新的时候,同样需要上锁,这样才能保证数据页并发读取/更新的一致性。

由此可见,当一个高并发的系统,出现了热点数据页需要从磁盘上加载到buffer pool中时,造成的延迟,是难以想象的。因此排在等待热点页队列最后的会话线程最后才得到需要的页,响应时间也就越长,这就是造成了一个简单的sql需要执行几十秒的原因。

再回头来看上面的问题,mysql数据库出现性能下降时,可以看到操作系统有读IO。 原因是,在数据库对数据页的更改,是在内存中的,然后通过检查点线程进行异步写盘,这个异步的写操作是不堵塞执行sql的会话线程的。所以,即使看到操作系统上有大量的写IO,数据库的性能也是很平稳的。但当用户线程需要查找的数据页不在buffer pool中时,则会从磁盘上读取,在一个热点数据页不是非常多的情况下,我们设置足够大的innodb_buffer_pool的size, 基本可以缓存所有的数据页,因此一般都不会出现缺页的情况,也就是在操作系统上基本看不到读的IO。 当出现读的IO时,原因时在执行buf_read_page_low函数,从磁盘上读取数据页到buffer pool, 则数据库的性能则开始下降,当出现大量的读IO,数据库的性能会非常差。

‘叁’ SpringBoot进阶之缓存中间件Redis

大家好,一直以来我都本着 用最通俗的话理解核心的知识点, 我认为所有的难点都离不开 “基础知识” 的铺垫

“大佬可以绕过 ~”

本节给大家讲讲 java的SpringBoot框架” , 之前我们学习的都是java的基础知识和底层提供的一些能力,我们日常工作都是在写接口。在我们在产品开发中,一般我们都会选择比较稳定的框架来帮我们加速开发,不会自己去造轮子,而在java众多框架中,spring框架表现的非常好,大部分公司都会首选它作为开发框架,而至今,大部分企业都是以 springboot 来构建项目了,一个稳健的系统需要引入稳定的技术~

如果你是一路看过来的,很高兴你能够耐心看完。前几期都是带大家学习了 SpringBoot 的基础使用以及集成 mybatis 开发,这也是我们写业务的基础,如果你还不熟悉这些,请先看完它们。接下来的几期内容将会带大家进阶使用,会先讲解基础 中间件 的使用和一些场景的应用,或许这些技术你听说过,没看过也没关系,我会带大家一步一步的入门,耐心看完你一定会有 收获 ,本期将会给大家讲解最热门的缓存中间件技术 Redis ,同样的,我们集成到 Springboot 中。最近github可能会被墙,所以我把源码放到了国内gitee上,本节我们依然使用上期的代码

Redis 是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库。全称叫 Remote Dictionary Server(远程数据服务) 是由 C语言 编写的,Redis是一个 key-value 存储系统,它支持丰富的数据类型,如: string、list、set、zset(sorted set)、hash

它本质上是一种键值对数据库,我们之前学习的 mysql 它是持久层的关系型数据库,而 redis 它的存储主要存在 内存 中。我们都知道在 内存 中的数据读取是非常快的,就好比你把一个变量存到磁盘读取和直接放到代码中运行,肯定是在代码中拿到的速度快,因为运行时期,都是直接存到内存的。

给大家总结一下:

有了基本的概念之后,我们下面进行环境搭建,在学习阶段,安装 redis 很简单,生产环境一般我们也会选择云产品,一切为了服务保障,虽说它只是做缓存用,但也是系统的一把 保护伞

如果你是 mac 用户,你可以运行如下命令:

安装完成后会提示你运行命令,运行即可。

win 用户也很简单,直接下载 redis 软件,双击运行即可,运行之后它会有一个小方块的图案,和 locahost:6379 的log,说明运行成功了。初始阶段没有配置的 redis 默认 host 就是本地, port 就是 6379 , 而且是 没有密码 就可以访问的。

推荐一个客户端软件 Redis Desktop Manager ,它是 redis 的客户端界面软件,方便面我们学习的时候 清理缓存 使用,生产慎连。

我们不给大家讲它的基本命令使用,它也有语法,可以通过类似命令执行,如果想学习的小伙伴,可以自行搜索。本期重点内容是在 sprinboot 中的使用,我们平时开发不可能是去命令行里敲的,都是代码里执行,而目前市面上有很多封装好的库,我们可以直接调用它的方法,很方便的就可以操作它了,不用记一些繁琐的命令,下面我们就实际操作一下:

修改 pom.xml

修改 application.yml :

redis 默认是有 16 个库,不是 15 个啊,从 0 开始算的,我们随便连一个

通过代码很好理解, 首先需要引入 StringRedisTemplate ,然后需要设置一个 key ,那么思考一下,这个 key 允许重复吗

我们进客户端看一下,发现 key 还是只有一个,但是值变成了新的值了,所以可以得知 key 是唯一的,我们重新设置的时候相当于刷新了它。

redis 中删除缓存有两种方式,一种是自我消亡,也就是 过期 销毁,还有有一种是 主动 销毁,我们先看一下,过期时间如何设置

我们设置了 10s 后过期,过完10s后发现,这个```key data``消失了。我们在看看如何主动删除

我们可以利用 Redis 做一个计数器,实现自增功能,你可以用它做网站访问统计

通常做法,我们会把它封装一下,后续使用直接引入封装好的即可,把它直接交给 Springboot容器 管理

其实这个类,你还可以继续进一步封装,比如约束 key 的规范,约束过期时间,约束数据类型等等,这一切也都是为了规范和后期维护,防止滥用缓存

缓存的主要场景是用于解决热点数据问题,因为这些数据是访问频率比较高的,当大量的请求进来, mysql 可能压力很大,这样一来,数据查询效率就很慢,用户肯不高兴等了,这样用户体验很不好。所以我们一般做法,都是把这些热点数据放到缓存里,因为缓存读取速度很快。当有新数据的时候,我们再及时更新它,一般流程是先查询缓存,查到了直接返回缓存数据,查不到再走数据库,然后再刷回缓存。

但是并发足够大的时候,还是会暴露出很多问题,比如面试常问的一些高频问题 缓存雪崩、缓存穿透、缓存雪崩 ,这些问题后边会给大家专门讲,和如何去防范。所以总的来说,引入任何一门技术并不是万事大吉,还需我们不断的在实践中积累经验

本期到这里就结束了,总结一下,我们了解了什么是 redis ,以及在 springboot 中如何去使用它们,很简单,没什么复杂的东西。但这里想多说一点的是,缓存的设计却是很复杂的,因为工具是死的,人是活的,我们如何正确设计,需要我们在项目中不断的积累。

我们之前教大家查询列表数据,都是所有数据返回,还没有教大家如何去做分页,下期将带大家学习一下 mybatis 分页插件的使用 ,下期不见不散, 关注我,不迷路~

‘肆’ 用云数据库会被打死吗

缓存雪崩、击穿、穿透及解决方案
1、缓存雪崩,出现过程,假如一个系统,高峰期5000次/s,4000次走了缓存,1000次走数据库,数据库1000/s是正常指标,完全可以工作,但是如果缓存宕机了,或者缓存设置了相同的过期时间,导致缓存同一时间失效,然后5000次请求都打在了数据库上,数据库立马被打死了,数据库一般1s最多抗2000个请求(这个取决于具体硬件配置),如果DBA重启数据库,同样的立马会继续被打死,这就是缓存雪崩。

‘伍’ Redis缓存雪崩就这么简单

在实际项目开发中,我们都知道Redis不可能把所有的数据都缓存起来( 内存昂贵且有限 ),所以Redis需要对数据设置过期时间,并采用的是惰性删除+定期删除两种策略对过期键删除。

如果缓存数据 设置的过期时间是相同 的,并且Redis恰好将这部分数据全部删光了。这就会导致在这段时间内,这些缓存 同时失效 ,全部请求到数据库中。

这就是缓存雪崩

缓存雪崩如果发生了,很可能就把我们的数据库 搞垮 ,导致整个服务瘫痪,造成的后果很严重。

对缓存数据设置相同的过期时间,导致某段时间内缓存失效。”

对于“Redis挂掉了”,我们可以有以下的思路:

‘陆’ redis常见问题

1. 缓存击穿

缓存击穿是指一个请求要访问的数据,缓存中没有,但数据库中有的情况。这种情况一般都是缓存过期了。

但是这时由于并发访问这个缓存的用户特别多,这是一个热点 key,这么多用户的请求同时过来,在缓存里面没有取到数据,所以又同时去访问数据库取数据,引起数据库流量激增,压力瞬间增大,直接崩溃给你看。

所以一个数据有缓存,每次请求都从缓存中快速的返回了数据,但是某个时间点缓存失效了,某个请求在缓存中没有请求到数据,这时候我们就说这个请求就"击穿"了缓存。

针对这个场景,对应的解决方案一般来说有三种。

借助Redis setNX命令设置一个标志位就行。设置成功的放行,设置失败的就轮询等待。就是在更新缓存时加把锁

后台开一个定时任务,专门主动更新过期数据

比如程序中设置 why 这个热点 key 的时候,同时设置了过期时间为 10 分钟,那后台程序在第 8 分钟的时候,会去数据库查询数据并重新放到缓存中,同时再次设置缓存为 10 分钟。

其实上面的后台续命思想的最终体现是也是永不过期。

只是后台续命的思想,会主动更新缓存,适用于缓存会变的场景。会出现缓存不一致的情况,取决于你的业务场景能接受多长时间的缓存不一致。


2. 缓存穿透

缓存穿透是指一个请求要访问的数据,缓存和数据库中都没有,而用户短时间、高密度的发起这样的请求,每次都打到数据库服务上,给数据库造成了压力。一般来说这样的请求属于恶意请求。

解决方案有两种:

就是在数据库即使没有查询到数据,我们也把这次请求当做 key 缓存起来,value 可以是 NULL。下次同样请求就会命中这个 NULL,缓存层就处理了这个请求,不会对数据库产生压力。这样实现起来简单,开发成本很低。


3. 缓存雪崩

缓存雪崩是指缓存中大多数的数据在同一时间到达过期时间,而查询数据量巨大,这时候,又是缓存中没有,数据库中有的情况了。

防止雪崩的方案简单来说就是错峰过期。

在设置 key 过期时间的时候,在加上一个短的随机过期时间,这样就能避免大量缓存在同一时间过期,引起的缓存雪崩。

如果发了雪崩,我们可以有服务降级、熔断、限流手段来拒绝一些请求,保证服务的正常。但是,这些对用户体验是有一定影响的。

4. Redis 高可用架构

Redis 高可用架构,大家基本上都能想到主从、哨兵、集群这三种模式。

哨兵模式:

它主要执行三种类型的任务:

哨兵其实也是一个分布式系统,我们可以运行多个哨兵。

然后这些哨兵之间需要相互通气,交流信息,通过投票来决定是否执行自动故障迁移,以及选择哪个从服务器作为新的主服务器。

哨兵之间采用的协议是 gossip,是一种去中心化的协议,达成的是最终一致性。

选举规则:

‘柒’ 该怎么解决 Redis 缓存穿透和缓存雪崩问题

缓存雪崩: 由于缓存层承载着大量请求,有效地 保护了存储层,但是如果缓存层由于某些原因不能提供服务,比如 Redis 节点挂掉了,热点 key 全部失效了,在这些情况下,所有的请求都会直接请求到数据库,可能会造成数据库宕机的情况。
预防和解决缓存雪崩问题,可以从以下三个方面进行着手:
1、使用 Redis 高可用架构:使用 Redis 集群来保证 Redis 服务不会挂掉
2、缓存时间不一致: 给缓存的失效时间,加上一个随机值,避免集体失效
3、限流降级策略:有一定的备案,比如个性推荐服务不可用了,换成热点数据推荐服务
缓存穿透: 缓存穿透是指查询一个根本不存在的数据,这样的数据肯定不在缓存中,这会导致请求全部落到数据库上,有可能出现数据库宕机的情况。
预防和解决缓存穿透问题,可以考虑以下两种方法:
1、缓存空对象: 将空值缓存起来,但是这样就有一个问题,大量无效的空值将占用空间,非常浪费。
2、布隆过滤器拦截: 将所有可能的查询key 先映射到布隆过滤器中,查询时先判断key是否存在布隆过滤器中,存在才继续向下执行,如果不存在,则直接返回。布隆过滤器有一定的误判,所以需要你的业务允许一定的容错性。

‘捌’ java清缓存前可以进后台方法,清完缓存不进了

关于java清缓存前可以进后台方法,清完缓存不进了相关资料如下
java我们在使用缓存时,往往先尝试去缓存中取值,如果没有,再去数据库取值,如果数据库也没有值,则根据业务需求,返回空或者抛异常。

如果用户一直访问一个数据库不存在的数据,比如id为-1的数据,就会导致每次请求都会先去缓存查一次,然后再去数据库查一次,造成严重的性能问题。这种情况就叫缓存穿透。

解决方案

以下几种解决方案:对请求参数做校验,比如用户鉴权校验,id做基础校验,id <= 0的直接拦截。

如果查询到数据库没有值,也将对应的key存进缓存中,value为null。这样下次查询就直接从缓存返回了。但这里的key的缓存时间应该比较短,比如30s。防止后面在数据库插入了这条数据,而用户获取不到。

使用布隆过滤器,判断一个key是否已经查过了,如果已经查过了,就不去数据库查询。

缓存击穿

缓存击穿指的是,一个key的访问量非常大,比如某秒杀活动,有1w/s的并发量。这个key在某一时刻过期,那这些大量的请求就会一瞬间到数据库,数据库可能会直接崩溃。

解决方案

缓存击穿的解决方案也有几种,可以配合使用:对于热点数据,慎重考虑过期时间,确保热点期间key不会过期,甚至有些可以设置永不过期。

使用互斥锁(比如Java的多线程锁机制),第一个线程访问key的时候就锁住,等查询数据库返回后,把值插入到缓存后再释放锁,这样后面的请求就可以直接取缓存里面的数据了。

缓存雪崩

缓存雪崩指的是,在某一时刻,多个key失效。这样就会有大量的请求从缓存中获取不到值,全部到数据库。还有另一种情况,就是缓存服务器宕机,也算做缓存雪崩。

解决方案

针对上述两种情况,缓存雪崩有两种解决方案:对每个key的过期时间设置一个随机值,而不是所有key都相同。

使用高可用的分布式缓存集群,确保缓存的高可用性,比如redis-cluster。

‘玖’ 《雪崩》epub下载在线阅读,求百度网盘云资源

《雪崩》([美] 尼尔·斯蒂芬森)电子书网盘下载免费在线阅读

资源链接:

链接:https://pan..com/s/1B0AFf5XovrmXGIDhkEc8ag

提取码:lkze

书名:雪崩

作者:[美] 尼尔·斯蒂芬森

译者:郭泽

豆瓣评分:8.1

出版社:四川科学技术出版社

出版年份:2018-7

页数:588

内容简介:

中央情报局成了中央情报公司,国会图书馆成了中央情报公司数据库;至于国会,没几个人知道它是什么玩意儿。美国的大地上到处是特许邦国,也就是特许经营组织准国家实体,一种类似麦当劳连锁店的机构。

美国政府呢?这个东西仅仅存在于不多的几处联邦建筑里,由联邦特工持枪把守,随时准备抵抗来自街头的袭击。

这就是未来的美国,一个车水马龙与颓废荒凉并存、尖端科技与野蛮低俗混杂之地。

但在这片喧嚣混乱之上,还存在着另一个无比广阔、无比自由的国度:赛博空间,由电脑和网络构成的虚拟空间。

在现实生活中,本书主人公只是个微不足道的披萨速递员,但在虚拟空间中,他是首屈一指的黑客、擅使双刀的高手。这样的人拥有毁灭世界的力量 —— 也可以拯救这个世界……

作者简介:

[美]尼尔•斯蒂芬森

美国着名幻想文学作家,其作品包括科幻小说、历史小说和高科技惊险小说,题材涉及数学、哲学、宗教、金融、密码破译和科技史等多个学科领域。

出版于1992年的《雪崩》是斯蒂芬森重要的科幻作品之一,标志着他创作风格的成熟,面世后引发汹涌的赛博朋克阅读风潮。此后,他的作家生涯进入黄金期,几乎每四年便推出一部脍炙人口的大作。其中,1995年的《钻石时代》获得雨果奖;1999年的《编码宝典》及此后的“巴洛克”三部曲以破译数据密码为中心线索,结合历史小说和科技惊险小说的元素,戏剧性地重述了科技发展史,大受读者好评。其后,斯蒂芬森推出的《飞越修道院》和《七族》都成功入围雨果奖决选。

‘拾’ sre是什么意思

SRE是指Site Reliability Engineer (网站可靠性工程师)。他是软件工程师和系统管理员的结合,一个SRE工程师基本上需要掌握很多知识:算法,数据结构,编程能力,网络编程,分布式系统,可扩展架构,故障排除。

大部分人理解SRE等于传统运维工程师(OP)或者系统管理员(SA),实则不然,这两类角色离一名合格的SRE还有太大的差距,完全无法匹配得上这个称号。在国内,只有少数几家顶尖互联网公司才会出现真正的SRE。

相关信息:

SRE不是做底层硬件维护,而是负责各种服务的性能和稳定性。

远离底层硬件,更多靠近软件基础架构层面,帮助企业客户打造强大的软件基础构架。

Google SRE是业内最有影响力的,也是最早提出这个概念的公司。

热点内容
计算机二级java考试 发布:2025-07-30 01:01:41 浏览:11
安卓设备一般起什么作用 发布:2025-07-30 00:55:48 浏览:242
用友如何验证服务器端口 发布:2025-07-30 00:43:19 浏览:321
恐怖学校密码锁如何开 发布:2025-07-30 00:37:24 浏览:704
上传显示红叉 发布:2025-07-30 00:35:56 浏览:72
mysql存储过程withas 发布:2025-07-30 00:32:28 浏览:41
自己编程慢 发布:2025-07-30 00:30:33 浏览:360
php点击次数 发布:2025-07-30 00:29:40 浏览:590
androidtypeface 发布:2025-07-30 00:22:23 浏览:213
汽轮压缩机 发布:2025-07-30 00:14:25 浏览:381