作者:黄健宏

引言

在工作中常常使用到 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 杭州