概述
- Redis 服务器的所有数据库都保存在 redisServer.db 数组中, 而数据库的数量则由 Configuration 中读取的 redisServer.dbnum 属性保存。
- 客户端通过修改目标数据库指针, 让它指向 redisServer.db 数组中的不同元素来切换不同的数据库。
- 数据库主要由 dict 和 expires 两个字典构成, 其中 dict 字典负责保存键值对, 而 expires 字典则负责保存键的过期时间。
- 因为数据库由字典构成, 所以对数据库的操作都是建立在字典操作之上的。
数据库实现
数据结构定义:
/* Redis database representation. There are multiple databases identified
* by integers from 0 (the default database) up to the max configured
* database. The database number is the 'id' field in the structure. */
typedef struct redisDb {
dict *dict;
/* The keyspace for this DB */
dict *expires;
/* Timeout of keys with a timeout set */
dict *blocking_keys;
/* Keys with clients waiting for data (BLPOP)*/
dict *ready_keys;
/* Blocked keys that received a PUSH */
dict *watched_keys;
/* WATCHED keys for MULTI/EXEC CAS */
int id;
/* Database ID */
long long avg_ttl;
/* Average TTL, just for stats */
unsigned long expires_cursor; /* Cursor of the active expire cycle. */
list *defrag_later;
/* List of key names to attempt to defrag one by one, gradually. */
} redisDb;
切换数据库:
// 将客户端的目标数据库切换为 id 所指定的数据库
int selectDb(client *c, int id) {
if (id < 0 || id >= server.dbnum)
return C_ERR;
// 切换数据库 (更新指针)
c->db = &server.db[id];
return C_OK;
}
数据库大小:
void dbsizeCommand(client *c) {
addReplyLongLong(c,dictSize(c->db->dict));
}
由上述代码可看出,db的大小其实就是指的db中存储的dict大小
dict的大小计算在dict.h
中使用宏定义定义:
#define dictSize(d) ((d)->ht[0].used+(d)->ht[1].used)
由定义看出,dict大小是两个hash表的已用空间大小之和。
最后
以上就是畅快铃铛为你收集整理的Redis数据库相关点数据库实现的全部内容,希望文章能够帮你解决Redis数据库相关点数据库实现所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复