所有数据库都保存在服务器状态redis.h/redisServer结构的db数组(每个项都是redisDb结构,每个redisDb结构都代表一个数据库)中,在初始化服务器时,程序会根据服务器状态的dbnum属性来决定应该创建多少个数据库。dbnum属性的值由服务器配置的database选项决定,默认的值是16。 每个redis客户端有自己的目标数据库,可以通过SELECT命令来切换当前数据库。 客户端没有返回当前数据库 单机数据库的实现主要涉及了Redis数据库的基本结构、数据库切换、键空间操作、键的生存时间设置、过期键的删除策略以及相关的持久化、复制和数据库通知功能。以下是这些知识点的详细说明: 1. **数据库结构**: Redis中的数据库存储在`redis.h/redisServer`结构的`db`数组中,每个`redisDb`结构代表一个数据库。在服务器启动时,根据`dbnum`属性创建相应数量的数据库,这个属性默认为16,可以通过配置文件的`database`选项来设置。 2. **切换数据库**: 客户端可以通过`SELECT`命令切换目标数据库,但没有返回当前数据库号的命令。在执行可能影响全局操作的命令前,通常会先用`SELECT`切换到特定数据库。 3. **键空间操作**: `redisDb`结构中的`dict`字典保存了键值对,构成了键空间。大多数数据库操作如添加、删除、更新键,获取键值,清空数据库,随机返回键,返回键数量,判断键是否存在,重命名键,查找键等,都是通过操作键空间完成的。这些操作会维护键空间的命中率、LRU信息,以及过期键和被监视的键的状态。 4. **键的生存时间和过期时间**: 使用`EXPIRE`, `PEXPIRE`, `EXPIREAT`, `PEXPIREAT`和`TTL`, `PTTL`命令设置键的生存时间。过期时间存储在`redisDb`的`expires`字典中,键是键的指针,值是毫秒级的过期时间戳。过期键的检测通过`is_expired(key)`函数实现。 5. **过期键的删除策略**: Redis采用惰性删除(仅在访问时检查并删除过期键)和定期删除(周期性扫描检查过期键)两种策略。具体实现函数包括`db.c/expireIfNeeded`和`redis.c/activeExpireCycle`。 6. **RDB和AOF持久化**: - RDB持久化通过`SAVE`(阻塞)和`BGSAVE`(后台子进程)将内存状态保存到磁盘,防止数据丢失。RDB文件生成时不会包含过期键。 - AOF(Append Only File)持久化记录每次写操作,保证数据完整性。AOF重写时也会检查并删除过期键。 - 在复制过程中,主服务器负责删除过期键,并同步给从服务器。 7. **数据库通知**: 可以通过`redis.conf/notify-keyspace-events`配置开启数据库通知。键空间通知和键事件通知分别通过以`keyspace`和`keyevent`为前缀的频道发送。`notifyKeyspaceEvent`函数负责生成通知。 8. **持久化与复制的交互**: - 手动或定时执行RDB保存不会受复制影响,而AOF重写可能被延迟。 - 从服务器的过期键删除由主服务器控制,确保数据一致性。 单机数据库的实现涉及到Redis内部数据结构、数据库操作、过期键管理、持久化策略以及复制和通知机制等多个方面,这些都是保障Redis作为内存数据库高效、可靠运行的关键要素。
- 粉丝: 2
- 资源: 963
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助