redis网络协议1.1、redis网络微观上:reactor宏观上:可以忽略其他流程,只关注数据包处理流程。当管道(连接)构成一个完整的包,处理对应的事件。1.2、redis协议redis协议设计redis采用RESP序列化协议,协议的不同部分使用以CRLF(\r\n)结束。RESP支持的数据类型,通过第一个字符判断数据类型RESP在redis请求-响应协议中的作用方式来看下面例子在redis-cli,发送一条命令set key value,对应的报文为:执行成功OK,回应的报文为:若执行失败,回应的报文为2、redis pipelineredis pipeline是redis客户端提供的机制,与redis本身无关,是为了节约网络传输时间而设计的。具体来说,客户端一次性发送多个请求,redis服务器按序依次回复,与http 1.1类似。3、redis事务事务:用户定义一系列数据库操作,这些操作视为一个完整的逻辑处理工作单元,要么全部执行,要么全部不执行,是不可分割的工作单元。探讨事务的前提:在并发连接的情况下,不同连接异步执行命令造成的不可预期的冲突。3.1、事务的特征3.2、事务命令redis客户端以MULTI开启一个事务,发送多个命令到服务端的队列,直到发送EXEC命令后redis服务端才会执行队列中的命令,将队列作为一个整体来执行。实际工作中不会使用,这是因为事务命令是由乐观锁实现的,失败需要重试,会增加业务逻辑的复杂程度。3.3、* lua脚本redis内置lua解释器来执行lua脚本,通过lua脚本实现原子性。面试点:lua脚本满足原子性和隔离性,不满足一致性和持久性。3.3.1、命令3.3.2、应用例:执行加倍操作4、redia发布订阅为了支持消息的多播机制,redis引入了发布订阅模块,是一种分布式消息队列机制。订阅者通过特定的频道来接收发送者发送至该频道的消息。该机制并不保证消息一定到达,可以采用stream方式确保可达。存在的问题有:发送者发送一条消息,若没有订阅者,则消息直接丢弃。若发送期间,一个订阅者断开连接,那么在断开连接期间消息对于该订阅者来说彻底丢失了。此外,redis停机重启,pubsub的消息是不会持久化的,所有的消息被直接丢弃。4.1、命令4.2、应用发布订阅功能一般要重新开启一个连接,这是因为命令连接严格遵循请求回应模式,pubsub能收到redis主动推送的内容。所以实际项目中如果支持pubsub的话,需要另开一条连接用于处理发布订阅。5、redis异步连接hiredis是一个redis的C客户端库函数,服务端可以使用它来访问redis服务器。5.1、同步连接同步连接采用阻塞io来实现,但是会阻塞当前线程,直至redis返回结果。参考文档:hiredis的使用例如:访问redis,并对counter实现自增1000次,统计用时。5.2、异步连接异步连接采用非阻塞io实现,不会阻塞当前线程。缺点是代码书写异步,业务逻辑割裂,可以通过携程解决。在有大量并发请求的情况,配合redis 6.0以后的io多线程,异步连接池,能更好解决应用层的数据访问性能5.2.1、redis驱动redis驱动:服务端使用异步连接,需要自己来实现redis驱动,也就是说需要把redis连接融合自己项目中的reactor进行管理。接着还需要设计redis适配器,其主要功能有:综上所述,hiredis的封装规则有:5.2.2、范例这里对4.1的例子使用异步的方法来实现。第1步,实现redis驱动第2步,实现redis适配器,主要是构建redis事件对象和适配hiredis的事件控制接口。接下来,实现主体代码,实现功能