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

原理篇

一、Redis——线程IO模型

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

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

1、非阻塞IO

  • 非阻塞IO的对立面是阻塞IO
  • 阻塞IO:调用套接字的读写方法默认阻塞
    【比如read方法要传递进去一个参数n,表示最多读取n个字节后再返回,如果一个字节都没有,线程就会卡在那里,直到新的数据到来或者连接关闭,read方法才可以返回,线程才能继续处理。
    write方法一般来说不会阻塞,除非内核为套接字分配的写缓冲区已经满了,write方法就会阻塞,直到缓存区中有空间空闲出来。】

  • 非阻塞IO:在套接字对象上提供了一个选项Non_Blocking。当这个选型打开时,读写方法不会阻塞,而是能读多少读多少,能写多少写多少。
  • 能读多少取决于内核为套接字分配的读缓冲区内部的数据字节数
  • 能写多少取决于内核为套接字分配的写缓冲区的空闲空间字节数
    有了非阻塞IO意味着线程在读写IO时可以不考虑阻塞了,读写可以瞬间完成,之后线程可以继续其他工作。

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

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

  • 使用事件轮询API的select函数,
    输入:read_fds
    读取:write_fds
    输出是与之对应的可读可写事件,同时还提供了timeout参数。
  • 如果期间没有任何事件到来,那么最多等待timeout的值的时间,线程处于阻塞状态
  • 一旦其间有任何事件到来,就立即返回。事件过了之后还是没有任何事件,就立即返回
  • 拿到事件后,线程可以继续挨个处理相应事件,处理完了继续轮询,于是线程就进入了一个死循环,我们称循环为时间循环一个循环为一个周期

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操作的真正耗时。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值