Redis数据库实现以及各种操作实现
redisRedis数据库实现,保存键值对的方法,针对数据库添加、删除、更新、查询等方法的实现,设置生存时间和过期时间操作。
数据库实现
Redis服务器的所有数据库存在redisServer的db数组中:
redisServer {
// db数组,保存服务器中所有数据库
redisDb *db;
// 服务器的数据库数量
int dbnum;
}
服务器初始化时,程序会根据dbnum属性来决定创建多少个数据库,默认16个。
服务器数据库示例:
数据库键空间
Redis数据库由redisDb结构表示,所有键值对保存在redisDb的dict字典中,这个字典称为键空间key space:
redisDb {
// 键空间,保存数据库中所有键值对
dict *dict;
// 过期字典,保存着键的过期时间
dict *expires
}
- 键空间的键,就是数据库的键,是字符串对象
- 键空间的值,就是数据库的值,可以是:字符串对象、列表对象、哈希表对象、集合对象、有序集合对象
键空间示例:
- 添加新键:将新键值添加到键空间字典里面。
- 删除键:在键空间里面删除键所对应的键值对对象。
- 更新键:对键空间里键对应的值对象进行更新。
- 对键取值:在键空间字典里取出键对应的值对象。
读写键空间时的附加操作
- 对键的读写操作,会根据键是否存在来更新服务器键空间命中hit次数和不命中miss次数。
- 读取键后,服务器会更新键的LRU时间。
- 读取一个键时发现键过期,服务器会先删除这个键。
- 客户端如果使用WATCH监听了键,服务器对键的修改,会把这个键标记为dirty,让事务程序注意到这个键被修改。
- 服务器每修改一次键,会对dirty计数器加1,计数器会触发服务器的持久化以及复制操作。
- 如果服务器开启了数据库通知功能,对键修改后,服务器会按照配置发送通知。
设置键的生存时间或过期时间
- EXPIRE,设置键的生存时间TTL,单位:秒
- PEXPIRE,设置键的生存时间TTL,单位:毫秒
- EXPIREAT,设置键的过期时间,单位:秒
- PEXPIREAT,设置键的过期时间,单位:毫秒
- EXPIRE、PEXPIRE、EXPIREAT三个命令都是使用PEXPIZREAT命令来实现的。
保存过期时间
redisDb使用expires字典来保存数据库中所有键的过期时间,叫做过期字典:
redisDb {
// 键空间,保存数据库中所有键值对
dict *dict;
// 过期字典,保存着键的过期时间
dict *expires
}
- 过期字典的键是个指针,指向某个键对象。
- 过期字典的值是一个long long类型整数,保存了键指向的键对象过期时间,毫秒经度的unix时间戳。
参考
- 《redis设计与实现》(第二版)