Redis将数据库结构保存在RedisServer数据结构中的db数组中,数组大小由RedisServer结构中的dbnum决定,dbnum的默认大小为16。结构如下:
class RedisServer {
int dbnum;
RedisDb[] db;
}
而对于客户端而言,会选择一个指定的数据库,可以通过select命令来切换数据库,目标数据库保存在redis客户端数据结构RedisClient的db指针中。
class RedisClient {
RedisDb db;
}
Redis是一个K-V数据库,RedisDb中的dict字典保存了数据库中的所有键值对,这个字典被称作键空间。键空间的key是Redis字符串对象,value是RedisObject对象。此外还有expire字典保存了键空间中所有键的过期时间,expire的key是键空间中的key,value是保存的过期时间。
class RedisDb {
// 键空间
Dict dict;
// 键空间设置了过期时间的键的过期时间
Dict expire;
}
当使用Redis命令对数据库进行读写时,会进行一些额外操作
通过pexpireat命令可以设置对Key过期时间(此外还有expire、expireat、pexpire命令,但底层实现都是pexpireat),过期时间由expire属性保存,通过过期时间和当前时间对比,可以判断键是否过期。此外,可以使用persist命令来移除键的过期时间。
过期键一共由以下三种删除策略,其中第一种为被动删除策略,另外两种是主动删除策略。
AOF和RDB对过期键的处理:
通过订阅给定的频道或者模式来获知数据库的键的变化和命令执行情况。类似于MySQL监听Binlog。
原文:https://www.cnblogs.com/ccoder/p/15240003.html