作者:黄健宏
引言
在工作中常常使用到 Redis 服务器,但一直没有系统性的学习过它,只是在使用时查一下操作手册看一下要用到的数据类型及相关命令,前段时间终于把这本书看完了,对 Redis 有了进一步的了解,某些设计理念也给了我不少的启发,推荐大家可以看一下。
摘录
有序集合
Redis 的有序集合底层实现是基于跳跃表,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。
过期键删除策略
Redis 的过期键删除策略有三种:定时删除
、惰性删除
和定期删除
。Redis 服务器实际使用的是惰性删除
和定期删除
两种策略:通过配合使用这两种删除策略,服务器可以很好地在合理使用CPU时间和避免浪费内存空间之间取得平衡。
- 定时删除:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作。
- 惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。
- 定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。至于要删除多少过期键,以及要检查多少个数据库,则由贪心算法决定。
RDB执久化
有两个 Redis 命令可以用于生成RDB文件,一个是SAVE
,另一个是BGSAVE
。
SAVE
命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在服务器进程阻塞期间,服务器不能处理任何命令请求BGSAVE
命令会派生出一个子进程,然后由子进程负责创建RDB文件,服务器进程(父进程)继续处理命令请求
AOF持久化
AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的,被写入AOF文件的所有命令都是以Redis的命令请求协议格式保存的。
- AOF持久化功能的实现可以分为命令追加(append)、文件写入、文件同步(sync)三个步骤。
- 为了解决AOF文件体积膨胀的问题,Redis提供了AOF文件重写(rewrite)功能,这个功能是通过读取服务器当前的数据库状态来实现的。
- 为了解决这种数据不一致问题,Redis服务器设置了一个AOF重写缓冲区,这个缓冲区在服务器创建子进程之后开始使用,当Redis服务器执行完一个写命令之后,它会同时将这个写命令发送给AOF缓冲区和AOF重写缓冲区
主从复制
复制分为完整重同步和部分重同步两种模式,完整重同步一般时在首次同步时使用,复制主要分为以下几个步骤:
- 建立连接(从服务器向主服务器发送
SYNC
命令,请求建立主从复制关系) - 数据同步(主服务器接收到
SYNC
命令后,执行BGSAVE
命令生成 RDB 快照文件,并将快照文件发送给从服务器。同时,主服务器会将缓冲区中的写命令记录下来,在发送完 RDB 快照文件后,将这些缓冲区中的写命令发送给从服务器) - 命令传播(完成数据同步后,主服务器此后执行的写命令都会通过命令传播机制发送给从服务器,从而保证主从服务器数据的一致性)
在主从复制过程中,主服务器负责写操作,从服务器负责读操作,这样可以实现读写分离,提高系统的性能和扩展性。
写于 2024-07-05 22:13 杭州