1服务器中的数据库

Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中,db数组的每个项都是一个redis.h/redisDb结构,每个redisDb结构代表一个数据库。在初始化服务器时,程序会根据服务器状态的dbnum属性来决定应该创建多少个数据库。Dbnum属性的值由服务器配置的database选项决定,默认情况下,为16,所以Redis服务器默认会创建16个数据库。

2 切换数据库

每个Redis客户端都有自己的目标数据库,每当客户端执行数据库写命令或者数据库读命令的时候,目标数据就会成为这些命令的操作对象。默认情况下,Redis客户端的目标数据库为0号数据库,但客户端可以通过执行SELECT命令来切换目标数据库。

3 数据库键空间

Redis是一个键值对数据库服务器,服务器中的每个数据库都有一个Redis.h/redisDb结构表示,其中,redisDb结构的dict字典保存了数据库中的所有键值对。我们将这个字典称为键空间。

4 在读写之外维护操作

1)       在读取一个键之后,服务器会根据键是否存在来更新服务器的键空间命中或键不命中的次数。

2)       在读取一个键之后,服务器会更新键的LRU时间,这个值可以用于计算键的闲置时间。

3)       如果服务器在读取一个键时发现该键已经过期,那么服务器会先删除这个过期键,然后才执行余下的其他操作。

4)       如果有客户端使用WATCH命令监视了某个键,那么服务器在被监视的键进行修改之后,会将这个键标记为脏,从而让事务程序注意到这个键已经被修改。

5)       服务器每次修改一个键之后,都会对脏键计数器加1,这个计数器会触发服务器的持久化以及复制操作。

6)       如果服务器开启了数据库通知功能,那么在对键进行修改之后,服务器将按配置发送相应的数据库通知。

5 过期键删除

数据库键的过期时间都保存在过期字典中,过期键的删除策略如下:

1)       定时删除:在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来通知,立即执行对键的删除操作。

2)       惰性删除:放任键过期不管,但是每次从键空间获取键时,都检查取得的键是否过期,如果过期的话就删除,没有过期,就返回。

3)       定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键,至于要删除多少过期键,以及要检查多少个数据库,则有算法决定。

在三种策略中,第一种和第三种为主动策略,第二种为被动策略。

6 Redis过期键删除策略

Redis服务器实际使用的是惰性删除和定期删除两种策略:通过配合使用这两种策略,服务器可以很好地在合理使用CPU时间和避免浪费内存空间之间取得平衡。

7 Redis服务器过期键对其他模块的影响

模块名称

影响

RDB持久化

在执行SAVE命令或者BGSAVE命令创建一个新的RDB文件时,程序会对数据库中的键进行检查,已过期的键不会被保存在新的创建的RDB文件中,数据库中包含过期键不会对生成新的RDB文件造成影响。无论是加载现有的RDB文件,过期键对RDB文件没有影响

AOF持久化

当服务器以AOF持久化模式运行时,如果数据库中某个键已经过期,但它还没有被惰性删除或者定期删除,那么AOF文件不会因为这个过期键而产生任何影响。当过期键被惰性删除或者定期删除之后,程序会向AOF文件追加一条DEL命令,来显示地记录该键已被删除

复制

1)  当有请求发送请求到从服务器时,从服务器还是会返回过期的键值,而不删除

2)  当有请求发送到主服务器时,过期键才会被删除,不会被返回