前情提要:
《redis 从0到1完整学习 (一):安装&初识 redis》
《redis 从0到1完整学习 (二):redis 常用命令》
《redis 从0到1完整学习 (三):redis 数据结构》
《redis 从0到1完整学习 (四):字符串 SDS 数据结构》
《redis 从0到1完整学习 (五):集合 IntSet 数据结构》
《redis 从0到1完整学习 (六):Hash 表数据结构》
《redis 从0到1完整学习 (七):ZipList 数据结构》
《redis 从0到1完整学习 (八):QuickList 数据结构》
《redis 从0到1完整学习 (九):SkipList 数据结构》
本文主要结合源码来介绍 RedisObject 的数据结构
Redis 源码可以点击这里下载,方便查看其中定义的一些数据结构。
通过 redisObject
结构,Redis 能够灵活地处理不同类型和大小的数据,并且能够在内存管理和性能优化方面进行精细控制。这个数据结构是 Redis 高效性和灵活性的重要基础。
以下是源码的定义:
Redis 的 redisObject
是 Redis 数据库中用于存储各种类型数据的基础数据结构。它包含了以下几个关键字段:
type: 这是一个4比特的字段,表示对象的类型。它可以是以下几种类型之一:
encoding: 这是一个4比特的字段,表示对象的编码方式。不同的数据类型可以有不同的编码方式,以优化存储和操作效率。例如,对于列表类型,可能的编码方式包括 ziplist(压缩列表)和 linkedlist(双端链表),如下:
编号 | 编码方式 | 说明 |
---|---|---|
0 | OBJ_ENCODING_RAW | raw 编码动态字符串 |
1 | OBJ_ENCODING_INT | long int 的字符串 |
2 | OBJ_ENCODING_HT | hash 表 |
3 | OBJ_ENCODING_ZIPMAP | 已废弃 |
4 | OBJ_ENCODING_LINKEDLIST | 双端链表(linkedList) |
5 | OBJ_ENCODING_ZIPLIST | 压缩列表(zipList) |
6 | OBJ_ENCODING_INTSET | 整数集合 |
7 | OBJ_ENCODING_SKIPLIST | 跳表(skipList) |
8 | OBJ_ENCODING_EMBSTR | embstr 的动态字符串 |
9 | OBJ_ENCODING_QUICKLIST | 快速列表(quickList) |
10 | OBJ_ENCODING_STREAM | Stream 流 |
ptr: 这是一个指针字段,指向实际的数据值。根据对象的类型和编码方式,这个指针可以指向不同类型的内部数据结构。
refcount: 这是一个整数字段,表示对象的引用计数。每当有新的键或者其他对象引用这个对象时,引用计数加一;当不再有引用时,引用计数减一。当引用计数降为0时,对象将被垃圾回收机制释放。
lru: 这是一个 24 比特的字段,用于记录对象的最近使用时间(LRU,Least Recently Used)。在 Redis 的内存管理中,LRU 字段可以帮助确定哪些对象是最少使用的,以便在内存不足时进行淘汰。
《redis 从0到1完整学习 (一):安装&初识 redis》
《redis 从0到1完整学习 (二):redis 常用命令》
《redis 从0到1完整学习 (三):redis 数据结构》
《redis 从0到1完整学习 (四):字符串 SDS 数据结构》
《redis 从0到1完整学习 (五):集合 IntSet 数据结构》
《redis 从0到1完整学习 (六):Hash 表数据结构》
《redis 从0到1完整学习 (七):ZipList 数据结构》
《redis 从0到1完整学习 (八):QuickList 数据结构》
《redis 从0到1完整学习 (九):SkipList 数据结构》