(三)、Redis对象类型和底层数据结构对应关系---Redis设计与实现读书笔记

博客介绍了Redis创建键值对时会创建键对象和值对象,键为字符串对象,值有五种对象类型。还详细阐述了各对象类型的编码和底层实现,如字符串对象有int、embstr、raw编码,列表、哈希等对象也根据不同条件有不同编码类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

五种基本类型

Redis创建一个键值对时至少会创建两个对象,一个对象用作键值对的键(键对象),另一个对象用作键值对的值(值对象)。其中总是一个字符串对象,则可以是以下五种对象中的一种。

类型常量对象的名称type命令输出
REDIS_STRING字符串对象“string”
REDIS_LIST列表对象“list”
REDIS_HASH哈希对象“hash”
REDIS_SET集合对象“set”
REDIS_ZSET有序集合对象“zset”

Redis中每个对象都由RedisObject结构表示:

typedef struct redisObject {  
    // 类型  
    unsigned type:4;          
    // 不使用(对齐位)  
    unsigned notused:2;  
    // 编码方式  
    unsigned encoding:4;  
    // LRU 时间(相对于 server.lruclock)  
    unsigned lru:22;  
    // 引用计数  
    int refcount;  
    // 指向底层实现数据结构的指针
    void *ptr;  
} robj; 

编码和底层实现

编码常量底层数据结构object encoding命令输出
REDIS_ENCODING_INTlong 类型的整数“int”
REDIS_ENCODING_EMBSTRembstr 编码的简单动态字符串“embstr”
REDIS_ENCODING_RAW简单动态字符串“raw”
REDIS_ENCODING_HT字典“hashtable”
REDIS_ENCODING_LINKEDLIST双端链表“linkedlist”
REDIS_ENCODING_ZIPLIST压缩列表“ziplist”
REDIS_ENCODING_INTSET整数集合“intset”
REDIS_ENCODING_SKIPLIST跳跃表和字典“skiplist”

##字符串对象
编码类型:

  • int:当一个字符串对象保存的是整数值,并且可用long类型表示时,字符串对象的编码设置为int;
  • embstr:当一个字符串对象保存的是字符串值,并且字符串长度小于39字节,字符串对象的编码设置为embstr;
  • raw:当一个字符串对象保存的是字符串值,并且字符串长度大于39字节,字符串对象的编码设置为raw;

##列表对象
编码类型:【注意:3.2版本后统一使用quicklist作为编码类型】

  • ziplist:满足以下两个条件
    • 列表对象保存的所有字符串元素的长度都小于64字节
    • 列表对象保存的元素数量小于512个;
  • linkedlist:不满足以上两个条件

##哈希对象
编码类型:

  • ziplist:满足以下两个条件
    • 哈希对象保存的所有键值对的键和值得字符串长度小于64字节
    • 哈希对象保存的键值对数量小于512个
  • hashtable:不满足以上两个条件

##集合对象
编码类型:

  • intset:满足以下两个条件
    • 集合对象保存的所有元素都是整数值
    • 集合对象保存的元素数量小于512个
  • hashtable:不满足以上两个条件

##有序集合对象
编码类型:

  • ziplist:满足以下两个条件
    • 有序集合对象保存的所有元素成员长度小于64字节
    • 有序集合对象保存的元素数量小于128个
  • skiplist:不满足以上两个条件
### Redis设计实现概述 Redis 是一种高性能的键值数据库,支持多种数据结构并提供了丰富的功能。以下是关于 Redis设计实现细节以及其主要数据结构的相关说明。 #### 1. Redis 数据结构详解 Redis 中所有的 key 都是以字符串形式存在,而 value 则可以采用五种不同的数据结构来表示[^1]。这些数据结构分别是: - **String(字符串)**: 基本的数据类型,能够存储字符串或者整数/浮点数值。 - **List(列表)**: 实现为双向链表,适合用于队列栈的操作。 - **Set(集合)**: 存储无序且唯一的字符串元素集合。 - **Hash(哈希表)**: 类似于字典的形式,适用于对象字段映射。 - **ZSet(有序集合)**: Set 类似,但是每个成员关联一个分数(score),按照分数排序。 每种数据结构都有特定的应用场景支持的操作集,这使得 Redis 能够灵活应对各种需求[^2]。 #### 2. 底层数据结构分析 Redis底层采用了多种高效的数据结构来支撑上述高级抽象。例如: - 字符串(Strings) 使用简单的动态字符串 SDS (Simple Dynamic String)[^3]; - 列表(Lists) 可能基于压缩列表(ziplist) 或者双端链表(linkedlist) 构建; - 集合(Sets) 散列(Hashes) 在小规模时可能利用 ziplists, 当增长到一定大小则切换至 hashtable; - ZSets 结构内部由两个部分组成——一个是普通的 set 来保存 member;另一个是 skip list 维护 score-ordering 关系以便快速查找范围内的 members。 这种根据不同情况自动调整使用的策略极大地优化了内存利用率及访问效率。 #### 3. 持久化机制探讨 为了保障数据安全性可靠性,Redis 提供两种主要的持久化方式:RDB(Redis Database File)快照文件 AOF(Append Only File)日志记录。通过合理配置这两种方法参数组合可满足不同程度上的恢复要求。 另外值得注意的是,在实际工程实践中还需要考虑诸如过期策略、淘汰算法等因素对于整体性能的影响。 ```python import redis # 创建连接池实例 pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True) r = redis.Redis(connection_pool=pool) r.set('foo', 'bar') # 设置键 foo 对应值 bar print(r.get('foo')) # 获取键 foo 所对应的值 ``` 以上代码片段展示了如何简单地操作 Redis 客户端库完成基本增删改查动作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值