1、解决键冲突:使用的是链地址法,每个哈希表节点都有一个next指针,多个哈希节点可以用next指针连接成一个单链表,被分配到同一个索引上的节点可以用这个单链表连接起来。
2、内存回收:C语言不具备自动回收功能,Redis的对象引用了“计数” 技术实现内存回收机制;对象引用计数会随着对象使用状态不断改变:
- 创建一个新对象时,引用计数会被初始化为 1;
- 当对象被一个新对象引用时,引用计数会加 1;
- 当对象不被引用时,会进行减 1;
- 当对象的引用计数变为0时,对象所占内存会被回收;
3、过期删除策略
- 定时删除:通过定时器过时删除
- 惰性删除:放任键过期不管,每次去值时检查是否过期,过期就删除
- 定期删除:每隔一段时间检查是否有过期的键,过期就删除
4、AOF、RDB和复制功能对过期键的处理
- RDB: 1、生成RDB时,程序会对数据库中的键进行检查,过期的键不会保存到RDB文件中;2、载入RDB文件,服务器以主服务器模式运行,程序会对文件中保存的键进行检查,未过期会载入到数据库,过期则被忽略;服务器以从服务器模式运行,文件中不论是否过期都会被 载入到数据库中,不过主从服务器进行同步时,从服务器数据会被清空。
- AOF:1、AOF文件写入,服务器以持久化模式运行,如果数据中的某个键已经过期,没有被惰性删除或定期删除,那么AOF文件不会因为过期键产生任何影响(定期删除或者惰性删除后,程序会向AOF追加一条DEL命令)。2、AOF重写,程序会对键进行检查,过期的键不会被保存到AOF文件中
- 复制: 复制模式下,从服务器过期键的删除有主服务器控制,主服务器删除过期键时向从服务发送一个DEL命令,才会删除过期键;从服务器读取数据时,即使碰到过期键也不会删除,而是当做未过期键来处理
5、RDB持久化
- 有两个命令可以生成RDB文件,分别是:SAVE 和 BGSAVE;SAVE命令会直接阻塞Redis服务器进程,直到RDB文件创建完毕,在阻塞过程服务器不能处理任何命令请求;BGSAVE命令会派生一个子进程,然后有子进程创建RDB文件,父进程继续处理请求。 注意:RDB是服务器启动时自动载入,Redis没有载入的命令,只要Redis服务器检测到RDB不存在就会自动载入RDB。
- AOF文件的更新频率比RDB文件更新频率高。如果服务器开启AOF持久化功能,服务器会优先使用AOF文件来还原数据库状态;只有AOF持久化功能关闭时才会用RDB文件来还原数据库状态。
- 服务器在载入RDB文件期间,会一直处于阻塞状态,直到载入完成为止。
- RDB文件是一个经过压缩的二进制文件,有多个文件进行组成。
6、AOF持久化
- AOF持久化实现:命令追加(append)、文件写入、文件同步(sync)三个步骤
- 命令追加:AOF写功能,服务器在执行完成一个写命令后,会以协议格式将被执行的写命令追加到服务器状态的 aof_buf 缓冲区末尾。
- AOF文件的写入和同步:Redis的服务器进程其实是一个时间循环(loop),这个循环负责接收客户端的命令请求,以及向客户端发送命令回复,而时间事件则负责执行像 serverCron 函数这样需要定时的函数;服务去执行文件时间时可能会执行写命令,使得内容被追加到 aof_buf 缓冲区,所以每次结束一个循环之前,都会调用 flushAppendOnlyFile 函数,考虑是否将 aof_buf 缓存区中 写入AOF文件中。
- AOF文件重写:AOF文件重写并不需要对现有AOF进行任何操作,这个功能是通过读取服务器当前的数据库状态来实现的。实现原理:读取键现在的值,然后用一条命令去记录键值对,代替之前建立的这个键值对的多条命令。
- AOF后台重写:AOF重写程序 aof_rewrite 会进行大量写入操作,会使线程长时间阻塞,造成服务器无法处理请求。所以Redis将AOF重写程序放到子进程执行。为了解决数据一致性问题,Redis服务器设置了一个AOF重写缓冲区,这个缓冲区在子进程创建的时候开始使用,当Redis服务器执行完成一个写命令时,会同时将写命令发送给AOF缓冲区和 AOF重写缓冲区。子进程执行AOF重写时服务器会执行三个工作:1、执行客户端发来的命令 ; 2、将执行后台的写命令追加到 AOF缓冲区; 3、将执行的写命令追加到AOF的重新缓冲区。
- AOF文件通过保存所有的修改数据库的写命令请求来记录服务器的数据状态
- AOF文件所有的命令都以Redis命令的请求协议的格式来保存
7、RDB的优缺点
优点:
- RDB快照是一个压缩过的非常紧凑的文件,保存着某个时间点的数据集,适合做数据的备份,灾难恢复
- 可以最大化Redis的性能,在保存RDB文件,服务器进程只需fork一个子进程来完成RDB文件的创建,父进程不需要做IO操作
- 与AOF相比,恢复大数据集的时候会更快
缺点:
- RDB的数据安全性是不如AOF的,保存整个数据集的过程是比繁重的,根据配置可能要几分钟才快照一次,如果服务器宕机,那么就可能丢失几分钟的数据
- Redis数据集较大时,fork的子进程要完成快照会比较耗CPU、耗时
8、AOF的优缺点
优点:
- 数据更完整,安全性更高,秒级数据丢失(取决fsync策略,如果是everysec,最多丢失1秒的数据)
- AOF文件是一个只进行追加的日志文件,且写入操作是以Redis协议的格式保存的,内容是可读的,适合误删紧急恢复
缺点:
- 对于相同的数据集,AOF文件的体积要大于RDB文件,数据恢复也会比较慢
- 根据所使用的 fsync 策略,AOF 的速度可能会慢于 RDB。 不过在一般情况下, 每秒 fsync 的性能依然非常高