数据库
首页 > 数据库> > 第二章:《Redis深度历险:核心原理与应用实践》读书笔记

第二章:《Redis深度历险:核心原理与应用实践》读书笔记

作者:互联网

原理篇

一、Redis——线程IO模型

Redis是个单线程程序。
它所有的数据都存储在内存中,所有的运算都是内存级别的运算。
要小心所有时间复杂度为O(n)的指令,要谨慎使用,否则一不小心就会导致Redis卡顿。

单线程的Redis,如何处理大量的并发客户端连接?
多路复用和非阻塞IO

1、非阻塞IO


非阻塞的问题:如果线程要读取数据,结果读了一部分就返回了,那么现成如何知道何时才能继续读?如果缓冲区满了,写不完,剩下的数据何时才能继续写?
–》线程应该得到通知

2、多路复用(事件轮询)
多路复用,可解决非阻塞遇到的部分读取的问题。

3、指令队列
客户端指令队列顺序,先到先服务
4、定时任务
如果线程阻塞在select系统调用上,定时任务将无法获得准确的调度,Redis如何解决?
Redis的定时任务会记录在一个被称为“最小堆”的数据结构中,在这个堆中,最快要执行的任务排在堆的最上方
在每个循环周期里,Redis都会对最小堆里面已经到时间点的任务进行处理。
处理完毕后,将最快要执行的任务还需要的时间记录下来,这个时间就是select系统调动的timeout参数。
因为redis知道未来timeout的值的时间内没有其他任务需要处理,所以可以安心睡眠timeout的值的时间。

5、Redis的通信协议——RESP序列号协议
是一种文本协议,又是:实现过程简单,解析性能极好。

二、持久化

Redis的数据全都保存在内存里,如果突然宕机,数据就会全部丢失。
而用来保护数据不丢失的机制,持久化。
Redis持久化有两种RDB快照AOF日志

RDB快照:快照是一次全量备份
是内存数据的二进制序列化形式,在存储上非常紧凑
AOF日志记录:AOF是连续的增量备份
内存数据修改的指令记录文本,AOF日志在长期的运行过程中会变得无比庞大,数据库重启时需要加载AOF日志进行指令重放,这个时间就会无比漫长,所以需要定期进行AOF重写,给AOF瘦身。

1、快照原理
Redis使用操作系统的多金正COW(copy on write)机制来实现持久化【读写分离,不同容器】
在这里插入图片描述
2、AOF原理
AOF日志存储的是Redis服务器的顺序指令序列,AOF日志只记录对内存进行修改的指令记录。
假设AOF日志记录记录了一个实例从创建开始之后所有修改性质的指令序列,那么只要通过一个空的Redis实例顺序执行所有的指令,可以恢复Redis当前实例的内存数据结构状态。
Redis在长期运行过程中,AOF的日志会越来越长。如果实例宕机重启,释放整个AOF日志会很耗时,导致Redis长时间不可用,AOF重写可解决这个问题。

3、AOF重写
指令:bgrewriteof
开辟一个子程序对内存进行遍历,转换成一系列Redis的操作指令,序列化到一个新的AOF中。序列化后再将操作期间发生的增量AOF日志追加到新的AOF日志文件中,追加完毕后立即代替旧的AOF日志文件。

4、AOF的fsync函数
生产环境服务器中,最好让redis每隔1s执行一次fsync操作,这个1s的周期是可以配置的。这是在数据安全性和性能之间做的折中,在保存高性能的同时,尽可能使数据少丢失。

三、管道

管道是客户端提供的。本身并不是Redis服务器直接提供的技术。

1、write操作负责将数据写到本地操作系统内核的发送缓冲中然后就返回了,剩下的交给操作系统内核异步数据送到目标机器。但是如果发送换充满了,那么就需要等待缓冲孔出空心空间来,这个就是写操作IO操作的真正耗时。

标签:AOF,读书笔记,Redis,阻塞,线程,IO,历险,日志
来源: https://blog.csdn.net/qq_31416771/article/details/100153246