Redis系列(三):redisServer、redisDb、redisObject、sds四大结构体理解
一.源码下载:
Windows中的Redis源码下载:https://github.com/microsoftarchive/redis/tree/3.2
根据官网说明可知,用VS2013编译,但是必须更新到update5, 否则会出现各种编译错误,确实如此,之前用vs2013的其它版本,出现各种错误,无法修改。
打开VS2013---帮助---关于,即可查看自己的VS版本,例如我重装之后的update5:
不是VS2013 update5的可以下载重装。
vs2013 update5下载链接:http://www.121down.com/soft/softview-43319.html
打开RedisServer.sln 一共9个项目:

Linux中的Redis源码:http://download.redis.io/releases/redis-6.0.5.tar.gz
二.整体示意图:

三.源码解析
1.redisServer 解析
redisServer本身是一个结构体
通过main函数来初始化redisServer()
int main(int argc, char **argv) {
struct timeval tv;
int j;
//.....
initServer();
}

监听端口

这里面的server代表的就是redisServer

初始化db数目

2.redisDb解析
redisDb本身也是一个结构体
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;


3.redisObject解析
redisObject本身也是一个结构体
typedef struct redisObject {
unsigned type:;
unsigned encoding:;
unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or
* LFU data (least significant 8 bits frequency
* and most significant 16 bits access time). */
int refcount;
void *ptr;
} robj;
编码:

类型:

4.sds解析
在C语言中都是用char数组来存放数据,在Redis中为了性能,封装了char
常用的一种
struct __attribute__ ((__packed__)) sdshdr8 {
uint8_t len; /* used */
uint8_t alloc; /* excluding the header and null terminator */
unsigned char flags; /* 3 lsb of type, 5 unused bits */
char buf[];
};

注:有兴趣的朋友可以通过cmake把redis编译成vs解决方案项目
Redis系列(三):redisServer、redisDb、redisObject、sds四大结构体理解的更多相关文章
- Redis系列(三):Redis的持久化机制(RDB、AOF)
本篇博客是Redis系列的第3篇,主要讲解下Redis的2种持久化机制:RDB和AOF. 本系列的前2篇可以点击以下链接查看: Redis系列(一):Redis简介及环境安装. Redis系列(二): ...
- Redis系列三之持久化
一.Redis持久化 Redis是一个支持持久化的内存数据库,redis需要经常将内存中的数据同步到磁盘来保证持久化. redis提供了不同级别的持久化方法: Snapshotting(快照,默认方式 ...
- Redis系列三(redis配置文件分析)
在第一篇文章中有提到过redis.conf这个文件,这个文件就是redis-server的具体配置了.要使用好redis,一定要搞清楚redis的配置文件,这样才能最大的发挥redis的性能. # B ...
- Redis系列(三)-Redis发布订阅及客户端编程
阅读目录 发布订阅模型 Redis中的发布订阅 客户端编程示例 0.3版本Hredis 发布订阅模型 在应用级其作用是为了减少依赖关系,通常也叫观察者模式.主要是把耦合点单独抽离出来作为第三方,隔离易 ...
- Redis系列三:reids常用命令
全局命令 keys * 查看所有键 dbsize 查看的是当前所在redis数据库的键总数 如果存在大量键,线上禁止使用此指令 exists key 检查键是否存在,存在返回1,不存在返回0 del ...
- Redis系列三 Redis数据类型
一 .Redis的五大数据类型 1.String(字符串) string是redis最基本的数据类型,可以理解成与 Memached一模一样的数据类型,一个key对应一个value. string 类 ...
- Redis系列(三)--消息队列、排行榜等
Redis命令执行生命周期: 发送命令--->排队(单线程)--->执行命令--->返回结果 慢查询: 只是针对命令执行阶段 慢查询日志通过一个固定长度的FIFO queue,这个q ...
- Redis系列三 - 缓存雪崩、击穿、穿透
前言 从学校出来,做开发工作也有一定时间了,最近有想系统地进一步深入学习,但发现基础知识不够扎实,故此来回顾基础知识,进一步巩固.加深印象. 最初开始接触编程时,总是自己跌跌撞撞.不断摸索地去学习,再 ...
- Spring系列(三):Spring IoC中各个注解的理解和使用
原文链接:1. http://www.cnblogs.com/xdp-gacl/p/3495887.html 2. http://www.cnblogs.com/xiaoxi/p/5935 ...
随机推荐
- JavaScript基础技术总结
javascript的作用 HTML网页运行在浏览器端,与用户没有交互功能,用户访问网页的时候只能看,如果网页没有程序员去更新,永远是一成不变的.JavaScript就是可以让程序运行在网页上,提高客 ...
- ExtJS动态改变字体颜色
为按钮设置文本属性,用标签包裹变色. //pButton为按钮IDExt.getCmp('pButton').setText('<span style="color:#FF0000;& ...
- 《机器学习_09_01_决策树_ID3与C4.5》
简介 先看一个例子,某银行是否给用户放贷的判断规则集如下: if 年龄==青年: if 有工作==是: if 信贷情况==非常好: 放 else: 不放 else: if 有自己的房子==是: if ...
- Android_存储之文件存储
前面几篇随笔 讲到的关于存储的,SharedPreferences.Room.数据库等 最终都是以文件形式 存储到手机上的(除特殊的存储于手机内存的:如Room可以创建内存数据库). 这些存储方式,A ...
- [安卓基础] 001.学习Android开发的好教程
如果想自学android,有许多不错的android网站.这里收集了一些,列举如下: 国内 极客学院,这里有非常丰富的视频教程. http://www.jikexueyuan.com/course/a ...
- php序列化和反序列化学习
1.什么是序列化 序列化说通俗点就是把一个对象变成可以传输的字符串. 1.举个例子,不知道大家知不知道json格式,这就是一种序列化,有可能就是通过array序列化而来的.而反序列化就是把那串可以传输 ...
- k-means聚类分析 python 代码实现(不使用现成聚类库)
一.实验目标 1.使用 K-means 模型进行聚类,尝试使用不同的类别个数 K,并分析聚类结果. 2.按照 8:2 的比例随机将数据划分为训练集和测试集,至少尝试 3 个不同的 K 值,并画出不 ...
- Java 解析 XML文件
个人博客网:https://wushaopei.github.io/ (你想要这里多有) package com.example.poiutis.xml; import com.example ...
- Java实现 LeetCode 441 排列硬币
441. 排列硬币 你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币. 给定一个数字 n,找出可形成完整阶梯行的总行数. n 是一个非负整数,并且在32位有符号整 ...
- Java实现 LeetCode 112 路径总和
112. 路径总和 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和. 说明: 叶子节点是指没有子节点的节点. 示例: 给定如下二叉树,以及目标 ...