总结redis持久化、服务处理模型、redis事务

本文详细介绍了Redis的服务处理模型,包括文件事件、时间事件及其处理流程,强调了Redis的单线程和I/O多路复用机制。此外,文章详细探讨了Redis的持久化策略,如RDB和AOF,以及过期键删除策略和内存淘汰策略。最后,文章还分析了Redis的事务特性,指出其与传统ACID事务的区别,推荐使用LUA脚本来实现更复杂的事务操作。
摘要由CSDN通过智能技术生成

服务模型

redis服务器可以与多个客户端建立连接,客户端将命令请求通过网络传输给服务器。redis服务器从在相应的数据库上执行读写操作。

redis服务是通过单线程单进程的方式处理客户端的请求。当一个redis客户端与redis服务器建立连接之后,服务器为客户端在服务器内部维护一个结构体RedisClient表示客户端状态,这个结构体用于保存当前客户的上下文信息。主要就是与客户端建立连接的套接字描述符、输入/输出缓冲区等与客户端有关的信息。

套接字描述符属性记录了客户端正在使用的套接字描述符。而输入缓存区用于保存redis客户端向redis服务器发送的命令,输出缓冲区用于保存redis服务器执行完毕命令,待回写到redis客户端的命令。

redis服务器可以一次性服务多个用户,这些用户使用链表结构组织起来。redis本质上就是一个事件驱动程序,可以处理文件事件和时间时间。文件事件就是服务器对套接字操作的抽象,因为send和receive本身就可以看作特殊的文件接口,而对端的socket输入缓冲区就是打开的文件。时间时间是需要在给定时间点执行的事件,是服务器定时操作的抽象
redis的文件处理器是reactor模型,基于事件驱动的。文件事件处理器使用I/O多路复用程序可以同时监听多个套接字,并且注册感兴趣的事件,包括accept(连接建立事件)、read(读事件)、write(写事件)、close(关闭事件)、slaveof(主从复制)等

Redis单进程线程的架构意思是:从网络IO到实际处理读写事件、时间事件等都是有单个线程基于I/O复用完成的。并不是整个redis中只有一个主线程和单一进程。
Redis 6支持多线程技术,仅针对处理网络请求的过程采用了多线程,而数据的读写命令仍然采用单线程进行处理。这里使用多线程IO的原因是在等待网络IO的时候最大化利用CPU资源

多路复用的IO模型,处理网络请求的时候,select()调用是阻塞的。如果并发量很高的情况下,可能成为瓶颈。多线程可以利用CPU多核的优势,使得多个线程并行。当select()调用返回的时候,请求依次交给多个线程去处理,充分利用CPU多核的优势。

但是处理事件(执行事件处理器)本身是很快的,不存在CPU瓶颈。而且可以避免线程安全问题。
虽然多线程模型执行读写事件能够提升并发性能,但是引入了多线程会使得程序的执行具有不确定性,还会造成额外的切换开销

redis基于内存数据库,本身在执行上不存在CPU瓶颈。如果采用多线程反而会增加上下文切换带来的开销,以及线程安全问题,为程序的执行带来不确定性。redis采用I/O多路复用模型,使得它可以同时响应多个事件,这极大地提升了I/O利用率。另外redis的对象底层根据不同的场景,会使用不同的数据结构进行实现,优化了性能。
redis真正的瓶颈在于网络带宽和机器内存大小

(redis4.0也支持了多线程技术,主要是用于后台处理包括对象回收、过期键回收等redis服务器部分的时间事件的功能)

文件事件

文件事件处理器由四个部分组成:套接字、I/O多路复用程序、文件事件分派器(dispatcher)、事件处理器(controller)
【1】redis客户端与redis服务器建立连接后,redis服务器就会在内存中维护一个redis客户端的对象,并且将redis客户端的套接字注册在I/O多路复用程序上
【2】I/O多路复用程序监听这些套接字,一旦有感兴趣的事件发生,就会传输产生了事件的套接字给文件事件分派器(他们通过队列通信,I/O复用程序将套接字同步有序的放入队列,而分派器则从队列中取出,类似基于生产者消费者模型的阻塞队列)
【3】分派器根据文件事件的种类,调用相应的事件处理器接口(事件处理函数,例如连接应答、命令请求、命令回复)(可以类比springMVC中的dispatcherSerlet和controller)

其中I/O多路复用程序底层依赖/O复用类库如select、epoll等。

时间事件

时间事件主要分为定时事件和周期事件,一个事件是定时事件还是周期事件取决于时间事件处理器的返回值(redis内部定义的常量值)。服务器会将所有的时间事件存入一个无序的链表。当时间事件执行器运行的时候,他就遍历整个链表,找到所有已达到的时间事件,并调用相应的事件处理器。redis作为内存数据库,遍历链表的操作是可以达到常量级别的。
redis服务器需要定时对自身的资源和状态进行检查和调整,这些定时操作由serverCron函数负责,包括定期清理过期键值对、更新记账信息、与从服务器定期同步、定期持久化操作等。正常模式下,redis服务器只运行serverCron一个时间事件,并且是周期事件

serverCron默认每隔100毫秒执行一次,负责管理服务器的资源。包括更新LRU时钟、更新服务器每秒执行命令的次数、更新服务器内存峰值记录、处理kill (15即sig term) 的信号、检查持久化操作的运行状态。
serverCron函数每次执行的时候,都会调用clientsCron函数管理客户端资源,以及调用databasesCron函数,管理数据库资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值