redis 底层数据结构

本文深入探讨了Redis的底层数据结构,包括RedisDB和RedisObject。文章详细介绍了7种类型的对象,如字符串对象(使用SDS)、跳跃表(用于有序集合)、字典(哈希表,用于存储键值对,采用数组和哈希函数解决冲突)和压缩列表。同时,文章还讨论了10种不同的对象编码方式,以适应不同场景和优化存储效率。
摘要由CSDN通过智能技术生成

一、底层结构

Redis作为Key-Value存储系统,数据结构如下:
在这里插入图片描述
Redis没有表的概念,Redis实例所对应的db以编号区分,db本身就是key的命名空间。

RedisDB结构

Redis中存在“数据库”的概念,该结构由redis.h中的redisDb定义。
当redis 服务器初始化时,会预先分配 16 个数据库
所有数据库保存到结构 redisServer 的一个成员 redisServer.db 数组中
redisClient中存在一个名叫db的指针指向当前使用的数据库
RedisDB结构体源码:

typedef struct redisDb {
   
	int id; //id是数据库序号,为0-15(默认Redis有16个数据库)
	long avg_ttl; //存储的数据库对象的平均ttl(time to live),用于统计
	dict *dict; //存储数据库所有的key-value
	dict *expires; //存储key的过期时间
	dict *blocking_keys;//blpop 存储阻塞key和客户端对象
	dict *ready_keys;//阻塞后push 响应阻塞客户端 存储阻塞后push的key和客户端对象
	dict *watched_keys;//存储watch监控的的key和客户端对象
} redisDb;

id
id是数据库序号,为0-15(默认Redis有16个数据库)
dict
存储数据库所有的key-value,后面要详细讲解
expires
存储key的过期时间,后面要详细讲解

RedisObject结构

Value是一个对象,包含字符串对象,列表对象,哈希对象,集合对象和有序集合对象

结构信息概览

typedef struct redisObject {
   
	unsigned type:4;//类型 五种对象类型
	unsigned encoding:4;//编码
	void *ptr;//指向底层实现数据结构的指针
	//...
	int refcount;//引用计数
	//...
	unsigned lru:LRU_BITS; //LRU_BITS为24bit 记录最后一次被命令程序访问的时间
	//...
}robj;

4位type
type 字段表示对象的类型,占 4 位;
REDIS_STRING(字符串)、REDIS_LIST (列表)、REDIS_HASH(哈希)、REDIS_SET(集合)、REDIS_ZSET(有序集合)。
当我们执行 type 命令时,便是通过读取 RedisObject 的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值