1. 默认情况下,redis的目标数据库是0号数据库,但客户端可以通过执行select命令来切换目标数据库。redis服务器的数据库主要由dict和expire两个字典构成,其中dict字典负责保存键值对,而expires字典则负责保存键的过期时间。因为数据库由字典构成,所以对数据库的操作都建立在字典操作之上。
2. expire字典的键指向数据库中的某个键,而值则记录了数据库键的过期时间,过期时间是一个以毫秒为单位的Unix时间戳。
3. redis使用惰性删除和定期删除两种策略来删除过期的键。惰性删除策略只在碰到过期键的时候才进行删除操作,定期删除则每隔一段时间主动查找并删除过期键。
4. 执行save命令或者bgsave命令所产生的rdb文件不会包含已经过期的键。执行bgrewriteof命令所产生的重写aof文件不会包含已经过期的键。当一个过期键被删除之后,服务器会追加一条del命令到现有的aof文件末尾,显示删除过期键。
5. 当主服务器删除一个过期键之后,会向所有从服务器发送一条del命令显式删除过期键。从服务器即使发现过期键也不会主动删除。
6. Rdb文件用于保存数据库的所有键值对数据,类似于数据库快照。save命令会阻塞服务器,而bgsave命令会派生一个子进程,由子进程负责创建rdb文件。因此redis允许用户通过设置服务器配置的save选项,让服务器每隔一段时间自动执行一次bgsave,从而实现自动间隔性保存。
7. 服务器状态中会保存所有用save选项设置的保存条件,当任意一个条件被满足时,服务器会自动执行bgsave命令。
8. aof文件通过保存所有写命令来记录服务器的数据库状态。命令会先保存在aof缓冲区里,然后定期写入并同步到aof文件。appendfsync选项的不同值对aof持久化功能的安全性以及redis服务器性能有很大影响。服务器只要载入并重新运行保存在aof文件中的命令就可以还原数据库状态。
9. 为了解决aof文件体积膨胀的问题,redis提供了aof重写功能。Aof重写是通过读取数据库中键值对来实现的,和原来的aof文件保存的数据库状态一样,但是体积更小。在执行bgrewriteaof命令时,redis服务器会维护一个重写缓冲区,记录在创建aof文件过程中服务器执行的所有写命令,在新的aof文件创建完之后会将缓冲区命令追加到aof文件末尾。这样2份aof文件就保持一致。
10. 通过使用I/o多路复用技术实现文件事件处理器,redis服务器使用单线程单进程方式来处理命令请求,并与多个客户端进行网络通讯。
11. redis中的伪客户端:redis在两个地方用到了伪客户端,一个是用于载入aof文件并还原数据库状态,一个是用于执行lua脚本中包含的redis命令。