Redis核心技术与实战
蒋德钧
中科院计算所副研究员
新⼈⾸单¥19.9
8847 人已学习
课程目录
已更新 30 讲 / 共 50 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 这样学Redis,才能技高一筹
免费
基础篇 (10讲)
01 | 基本架构:一个键值数据库包含什么?
02 | 数据结构:快速的Redis有哪些慢操作?
03 | 高性能IO模型:为什么单线程Redis能那么快?
04 | AOF日志:宕机了,Redis如何避免数据丢失?
05 | 内存快照:宕机后,Redis如何实现快速恢复?
06 | 数据同步:主从库如何实现数据一致?
07 | 哨兵机制:主库挂了,如何不间断服务?
08 | 哨兵集群:哨兵挂了,主从库还能切换吗?
09 | 切片集群:数据增多了,是该加内存还是加实例?
10 | 第1~9讲课后思考题答案及常见问题答疑
实践篇 (14讲)
11 | “万金油”的String,为什么不好用了?
12 | 有一亿个keys要统计,应该用哪种集合?
13 | GEO是什么?还可以定义新的数据类型吗?
14 | 如何在Redis中保存时间序列数据?
15 | 消息队列的考验:Redis有哪些解决方案?
16 | 异步机制:如何避免单线程模型的阻塞?
17 | 为什么CPU结构也会影响Redis的性能?
18 | 波动的响应延迟:如何应对变慢的Redis?(上)
19 | 波动的响应延迟:如何应对变慢的Redis?(下)
20 | 删除数据后,为什么内存占用率还是很高?
21 | 缓冲区:一个可能引发“惨案”的地方
22 | 第11~21讲课后思考题答案及常见问题答疑
23 | 旁路缓存:Redis是如何工作的?
24 | 替换策略:缓存满了怎么办?
加餐篇 (3讲)
加餐(一)| 经典的Redis学习资料有哪些?
加餐(二)| Kaito:我是如何学习Redis的?
加餐(三)| Kaito:我希望成为在压力中成长的人
期中测试 (2讲)
期中测试题 | 一套习题,测出你的掌握程度
期中测试题答案 | 这些问题,你都答对了吗?
Redis核心技术与实战
15
15
1.0x
00:00/00:00
登录|注册

21 | 缓冲区:一个可能引发“惨案”的地方

蒋德钧 2020-09-28
你好,我是蒋德钧。今天,我们一起来学习下 Redis 中缓冲区的用法。
缓冲区的功能其实很简单,主要就是用一块内存空间来暂时存放命令数据,以免出现因为数据和命令的处理速度慢于发送速度而导致的数据丢失和性能问题。但因为缓冲区的内存空间有限,如果往里面写入数据的速度持续地大于从里面读取数据的速度,就会导致缓冲区需要越来越多的内存来暂存数据。当缓冲区占用的内存超出了设定的上限阈值时,就会出现缓冲区溢出。
如果发生了溢出,就会丢数据了。那是不是不给缓冲区的大小设置上限,就可以了呢?显然不是,随着累积的数据越来越多,缓冲区占用内存空间越来越大,一旦耗尽了 Redis 实例所在机器的可用内存,就会导致 Redis 实例崩溃。
所以毫不夸张地说,缓冲区是用来避免请求或数据丢失的惨案的,但也只有用对了,才能真正起到“避免”的作用。
我们知道,Redis 是典型的 client-server 架构,所有的操作命令都需要通过客户端发送给服务器端。所以,缓冲区在 Redis 中的一个主要应用场景,就是在客户端和服务器端之间进行通信时,用来暂存客户端发送的命令数据,或者是服务器端返回给客户端的数据结果。此外,缓冲区的另一个主要应用场景,是在主从节点间进行数据同步时,用来暂存主节点接收的写命令和数据。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Redis核心技术与实战》,如需阅读全部文章,
请订阅文章所属专栏新⼈⾸单¥19.9
立即订阅
登录 后留言

精选留言(8)

  • Kaito
    应用程序和Redis实例交互时,应用程序中使用的客户端需要使用缓冲区吗?如果使用的话,对Redis的性能和内存使用有什么影响?

    客户端需要使用缓冲区,好处如下。

    1、客户端和服务端交互,一般都会制定一个交互协议,客户端给服务端发数据时,都会按照这个协议把数据拼装好,然后写到客户端buffer中,客户端再一次性把buffer数据写到操作系统的网络缓冲区中,最后由操作系统发送给服务端。这样服务端就能从网络缓冲区中读取到一整块数据,然后按照协议解析数据即可。使用buffer发送数据会比一个个发送数据到服务端效率要高很多。

    2、客户端还可以使用Pipeline批量发送命令到服务端,以提高访问性能。不使用Pipeline时,客户端是发送一个命令、读取一次结果。而使用Pipeline时,客户端先把一批命令暂存到buffer中,然后一次性把buffer中的命令发送到服务端,服务端处理多个命令后批量返回结果,这样做的好处是可以减少来回网络IO的次数,降低延迟,提高访问性能。当然,Redis服务端的buffer内存也会相应增长,可以控制好Pipeline命令的数量防止buffer超限。

    缓冲区其实无处不在,客户端缓冲区、服务端缓冲区、操作系统网络缓冲区等等,凡是进行数据交互的两端,一般都会利用缓冲区来降低两端速度不匹配的影响。没有缓冲区,就好比一个个工人搬运货物到目的地,每个工人不仅成本高,而且运输效率低。而有了缓冲区后,相当于把这些货物先装到一个集装箱里,然后以集装箱为单位,开车运送到目的地,这样既降低了成本,又提高了运输效率。缓冲区相当于把需要运送的零散数据,进行一块块规整化,然后分批运输。

    另外,关于Redis服务端为客户端分配的输出缓冲区,我想补充一点:主库上的从库输出缓冲区(slave client-output-buffer)是不计算在Redis使用的总内存中的,也就是说主从同步延迟,数据积压在主库上的从库输出缓冲区中,这个缓冲区内存占用变大,不会超过maxmemory导致淘汰数据。只有普通客户端和订阅客户端的输出缓冲区内存增长,超过maxmemory时,才会淘汰数据。
    2020-09-28
    4
    51
  • xueyuan
    使用pipline,减少client数目。
    2020-10-12
  • 无名小卒
    蒋老师的课程很深入,学到了很多底层redis知识,迫不及待的想看下面的章节,如果能更新快一点就更好了。催更啦😂!
    2020-09-29
  • yeek
    从节点客户端输出缓冲区会用来传输rdb文件吗?如果会的话,该设置项的大小,是参考rdb文件大小吧?这可能是所有缓冲区中实际可能使用的最大缓冲区了
    2020-09-28
  • yeek
    输出缓冲区,动态增加的部分,会产生内存碎片吗?何时回收呢?增加后会有机会缩小吗?
    2020-09-28
  • yeek
    服务器端处理请求的速度过慢,例如,Redis 主线程出现了间歇性阻塞,无法及时处理正常发送的请求,导致客户端发送的请求在缓冲区越积越多。


    这句话有点没理解,redis大部分请求是阻塞的,对客户端来说需要等待服务器的相应结果,虽然相应结果不一定有用,但这样的情况,redis服务端如果处理请求较慢,那么客户端输入缓冲区应该是当前请求一直在hold吧?服务器处理慢会导致等待的客户端变多,整体积压的输入缓冲变多,但对单个缓冲区来说,溢出应该不是主要的吧?

    不知道上述理解是否正确……
    2020-09-28
    1
  • 脱缰的野马__
    老师你好,在讲主从全量复制的时候,如果发生复制缓冲区溢出会导致全量复制失败,这个失败是指全部失败还是指rdb文件剩余部分同步复制失败,因为我知道的是每次从节点连接上主节点时会把当前对rdb复制偏移量给到主节点,主节点再判断是否重新全量复制还是从收到的偏移量位置开始复制
    2020-09-28
  • 漫步oo0云端
    我发现redis2.8版本执行CLIENT LIST,没有 qbuf 和 qbuf-free 这两个值。
    2020-09-28
收起评论
8
返回
顶部