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 范围内的模数,每个模数代表一个相应编号的哈希槽。

常见问题

  1. MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error.
    一般为意外重启所致,快速解决方案为进入redis-cli,执行config set stop-writes-on-bgsave-error no
  2. 无法远程访问:

 

相关链接

退出移动版