redisDB

Redis数据库底层实现原理

血红的双手。 提交于 2019-12-11 18:43:16
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> (一)基本数据结构 1)redisServer Redis服务器使用redisServer结构保存服务器的状态,其中,dbnum表示服务器的数据库数量,一个redisDb类型的数组保存所有的数据库。 struct redisServer { //服务器的数据库数量 int dbnum; //一个数组,保存服务器中的所有数据库 redisDb *db; } 2)redisClient Redis客户端使用redisClient结构来记录客户端当前的状态,其中,一个redisDb类型的指针指向了客户端当前使用的数据库。 struct redisClient { //记录客户端当前正在使用的数据库 redisDb *db; } redisClient.db指针指向redisServer.db数组中的一个元素,被指向的元素就是客户端的目标数据库。通过修改redisClient.db指针,让它指向服务器中的不同数据库,从而实现切换目标数据库的功能。 3)redisDb 来源: oschina 链接: https://my.oschina.net/u/3498791/blog/3141889

redis 复制笔记 - 2019.09

牧云@^-^@ 提交于 2019-11-30 03:26:44
redisClient 中有输入输出缓冲区 输入缓冲区:命令处理器将用户输入的命令写入客户端输入缓冲区,该缓冲区可动态扩展,但最大不能超过 1G ,否则服务器将关闭客户端; 输出缓冲区:命令执行器将命令执行生成的回复写入输出缓冲区,并关联回复响应处理器,待客户端产生可写事件时,回复响应处理器将输出缓冲区的内容发送给客户端,并清空输出缓冲区; 输入缓冲区的内容被解析后,生成命令、参数等信息,存入redisClient中的argv数组,并记录数组长度,以待后续命令检查及执行; serverCron(时间事件,默认每隔100ms执行一次): 更新服务器时间:unixtime/mstime(s/ms),默认100ms; 更新lru_time:默认10s; 更新服务器每秒执行命令数(大概值,取1ms次数乘以1000为一次样本,默认取16次样本平均值); 处理sigterm信号(不带参数的kill):redisServer.asap状态,serverCron每次执行,都将检测该标识,为1时,将关闭服务器,且关闭前将进行持久化操作; 管理客户端资源:每次serverCron都执行,释放过期客户端及清理客户端输入缓冲区; 管理数据库资源:每次都调用databaseCron,随机处理一部分数据的过期键,并在需要时,对字典(键空间)进行收宿操作; bgrewriteaof:redisServer

Redis数据库结构和持久化

佐手、 提交于 2019-11-29 08:04:29
Redis数据库,持久化 数据库 Redis服务器将所有的数据库都保存在服务器状态redis.h/redisServer结构的db数组中,每个项目都是一个redis.h/redisDb结构,每个redisDb结构代表一个数据库。 struct redisServer { //... // 一个数组,保存这服务器中的所有数据库 redisDb *db; // 服务器数据库数量 int dbnum; // ... } 服务器初始化的时候,程序会根据服务器状态的dbnum属性来决定创建多少个数据库,这个属性值由redis.conf中配置项database选项决定,值默认是16。 切换数据库使用select +数据库号来切换,默认是0号数据库。例如:select 9。 在服务器内部,客户端状态redisClient结构的db属性记录了客户端当前的目标数据库,这是个指向redisDb结构的指针。 typedef struct redisClient { // ... // 记录客户端当前正在使用的数据库 redisDb *db; // ... } redisClient; 键空间 Redis是一个key-value数据库服务器,而每个数据库都有redis.h/redisDb结构表示,其中dict字典(hash表)保存了数据库中所有的键值对,我们将这个字典成为 键空间(key space) 。