Alan Hou的个人博客

Redis 的学习总结

“两大维度”就是指系统维度和应用维度,“三大主线”也就是指高性能、高可靠和高可扩展(可以简称为“三高”)。

Redis 使用一个哈希表来保存所有键值对,这个哈希表,其实就是一个数组,数组的每个元素称为一个哈希桶。哈希桶中的元素保存的并不是值本身,而是指向具体值的指针。

集合类型的底层数据结构主要有 5 种:整数数组、双向链表、哈希表、压缩列表和跳表。

Redis 单线程是指它对网络 IO 和数据读写的操作采用了一个线程,而采用单线程的一个核心原因是避免多线程开发的并发控制问题。单线程的 Redis 也能获得高性能,跟多路复用的 IO 模型密切相关,因为这避免了 accept() 和 send()/recv() 潜在的网络 IO 操作阻塞点。(Redis 6.0开始,网络请求的解析可以用多线程来执行,但是读写内存还是一个线程。)

基于多路复用的Redis高性能IO模型

Redis 的持久化主要有两大机制: AOF(Append Only File)日志和 RDB (Redis Database)快照。

AOF 配置项 appendfsync 的三个可选值:

主从相关

主从库第一次同步的流程

主从库第一次同步的流程[/caption]

主库使用环形缓冲区repl_backlog_buffer记录写到的位置(注意环形缓冲区有可能写满而产生覆盖,可调整参数repl_backlog_size),从库记录自己已经读到的位置。在主从库连接恢复后,从库会向主库发送 psync 命令以及读取的位置slave_repl_offset,主库会判断自己的master_repl_offset 和 slave_repl_offset 之间的差距。

Redis repl_backlog_buffer的使用

Redis增量复制流程


Redis增量复制流程[/caption]

在 Redis Cluster 方案中,一个切片集群共有 16384 个哈希槽,首先根据键值对的 key,按照CRC16 算法计算一个 16 bit 的值;然后,再用这个 16bit 值对 16384 取模,得到 0~16383 范围内的模数,每个模数代表一个相应编号的哈希槽。

 

相关链接

退出移动版