Redis数据库

来源:互联网 发布:老九门哪个软件 编辑:程序博客网 时间:2024/06/05 09:57
Redis 中的每个数据库,都由一个 redis.h/redisDb 结构表示

redisDb 结构的 id 域保存着数据库的号码。当执行 SELECT number 命令时,程序直接使用 redisServer.db[number] 来切换数据库

Redis 是一个键值对数据库(key-value pairs database), 所以它的数据库本身也是一个字典(俗称 key space)

在数据库中, 所有键的过期时间都被保存在 redisDb 结构的 expires 字典里

Redis 有四个命令可以设置键的生存时间(可以存活多久)和过期时间(什么时候到期):
EXPIRE 以秒为单位设置键的生存时间;
PEXPIRE  以毫秒为单位设置键的生存时间;
EXPIREAT 以秒为单位,设置键的过期 UNIX 时间戳;
PEXPIREAT  以毫秒为单位,设置键的过期 UNIX 时间戳。

虽然有那么多种不同单位和不同形式的设置方式, 但是 expires
 字典的值只保存“以毫秒为单位的过期 UNIX 时间戳”, 这就是说, 通过进行转换, 所有命令的效果最后都和 PEXPIREAT命令的效果一样。

如何判断过期键?
通过 expires 字典, 可以用以下步骤检查某个键是否过期:

检查键是否存在于 expires 字典:如果存在,那么取出键的过期时间;
检查当前 UNIX 时间戳是否大于键的过期时间:如果是的话,那么键已经过期;否则,键未过期。

Redis 使用的过期键删除策略是惰性删除加上定期删除, 这两个策略相互配合,可以很好地在合理利用 CPU 时间和节约内存空间之间取得平衡。

在创建新的 RDB 文件时,程序会对键进行检查,过期的键不会被写入到更新后的 RDB 文件中。

在键已经过期,但是还没有被惰性删除或者定期删除之前,这个键不会产生任何影响,AOF 文件也不会因为这个键而被修改。

当过期键被惰性删除、或者定期删除之后,程序会向 AOF 文件追加一条 DEL 命令,来显式地记录该键已被删除。

和 RDB 文件类似, 当进行 AOF 重写时, 程序会对键进行检查, 过期的键不会被保存到重写后的 AOF 文件。

总结
数据库主要由 dict 和 expires 两个字典构成,其中 dict 保存键值对,而 expires 则保存键的过期时间。
数据库的键总是一个字符串对象,而值可以是任意一种 Redis 数据类型,包括字符串、哈希、集合、列表和有序集。
expires 的某个键和 dict 的某个键共同指向同一个字符串对象,而 expires 键的值则是该键以毫秒计算的 UNIX 过期时间戳。
Redis 使用惰性删除和定期删除两种策略来删除过期的键。
更新后的 RDB 文件和重写后的 AOF 文件都不会保留已经过期的键。
当一个过期键被删除之后,程序会追加一条新的 DEL 命令到现有 AOF 文件末尾。
当主节点删除一个过期键之后,它会显式地发送一条 DEL 命令到所有附属节点。
附属节点即使发现过期键,也不会自作主张地删除它,而是等待主节点发来 DEL 命令,这样可以保证主节点和附属节点的数据总是一致的。
数据库的 dict 字典和 expires 字典的扩展策略和普通字典一样。它们的收缩策略是:当节点的填充百分比不足 10% 时,将可用节点数量减少至大于等于当前已用节点数量。
原创粉丝点击