我是靠谱客的博主 畅快铃铛,最近开发中收集的这篇文章主要介绍Redis数据库相关点数据库实现,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

  • 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数据库相关点数据库实现所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部