看书时的一些简单总结。每一个知识点展开都可以单写一篇了。。。
Redis数据结构数据类型
redis底层的数据结构并非c语言字符串,而是自己定义的类型SDS。与字符串不同的是,除了存储字符串内容,一个SDS对象还包含了一段free空间和一个len属性。free空间是为了redis更好的实现空间预分配和惰性空间释放,字符串小于1MB时,free空间与字符串空间一样,大于1MB时,free为1M。
Redis选举机制
哨兵机制:启动多个哨兵对集群进行监控。发现异常就报告给管理员,或自动进行故障迁移。将失效的Master的其中一个Salve选举为新的Master。
从主服务器的从服务器中选出一个从服务器作为新的主服务器。选点的依据依次是:网络连接正常->5秒内回复过INFO命令->10*down-after-milliseconds内与主连接过的->从服务器优先级->复制偏移量->运行id较小的。选出之后通过slaveif no ont将该从服务器升为新主服务器
当主服务器宕机之后,从服务器切换成主服务器的时间内,服务是不可用的
Redis集群
Cluster MEET IP host 命令用于将指定的ip,host所属的节点添加到当前的集群中。例如客户端连接7000节点,向7000节点发送 CLUSTER MEET 127.0.0.1 7001指令,则7000与7001握手之后,7001加入7000所在的集群中。
redis一个集群节点与一个普通的redis服务器并没有太大的不同。
Redis通讯协议
redis底层是通过tcp来进行通信的。。。所以通信其实非常简单,jedis客户端也只是将socket通信做一个封装。
命令发送格式:
*<参数数量>CRLF
$<参数1的字节数量>CRLF
<参数1>CRLF
$<参数2的字节数量>CRLF
<参数2>CRLF
...
例如要 set name xxx
最终传输的协议为:*3\r\n$3\r\nset\r\n$4\r\nname\r\n$5\r\nxxx\r\n
命令回复格式:
状态回复,第一个字节为+ 例如+OK\r\n
错误回复,第一个字节为- 例如-NoSuchKey\r\n
整数回复,第一个字节为: 例如:1\r\n
批量回复,第一个字节为$ 例如 $3\r\nxxx\r\n
多条批量回复,第一个字节为* *2\r\n$3\r\nxxx\r\n$3\r\nxxx\r\n
了解了协议之后,可以尝试自己手动实现一个。
命令执行器
- Redis客户端向服务端发送请求大致分为这几个过程:
- 客户端输入命令
- 命令被转成协议
- 协议被发送给服务器
- 可读套接字建立,服务器读取套接字
- 服务器分析输入缓冲区的内容,对协议进行分析
- 服务器提取出命令的内容,将参数和参数个数保存到redisClient的 argv和argc参数中
- 调用命令执行器
- 命令执行器根据第一个参数从命令表中查找对应的redisCommand, 命令表的key就是客户端传来的set,del等命令
- 从redisCommand中解析出对应的执行函数,参数等
- 执行命令之前进行一系列的校验,例如客户端状态的cmd指针是否指向NULL,或者指向arity属性则需要校验参数个数,客户端身份验证是否通过,服务器是否处于SUBSCRIBE订阅模式,是否处于执行lua脚本并且阻塞的状态,是否正在执行事务等等, 校验若通过,调用命令的实现函数
- 实现函数将返回值写到客户端状态的输出缓冲区里
- 进行后续操作,例如开启了AOF持久化则将命令写到AOF文件,如果正在进行复制则将命令传播到从服务器
- 当客户端的套接字变为可写状态,将输出缓冲区里的命令回复发送到客户端
网友评论