redis 从0到1完整学习 (十):RedisObject 数据结构

发布时间:2023年12月28日


1. 引言

前情提要:
《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 的数据结构

2. redis 源码下载

Redis 源码可以点击这里下载,方便查看其中定义的一些数据结构。
在这里插入图片描述

3. redisObject 数据结构

通过 redisObject 结构,Redis 能够灵活地处理不同类型和大小的数据,并且能够在内存管理和性能优化方面进行精细控制。这个数据结构是 Redis 高效性和灵活性的重要基础。

以下是源码的定义:
在这里插入图片描述
Redis 的 redisObject 是 Redis 数据库中用于存储各种类型数据的基础数据结构。它包含了以下几个关键字段:

  1. type: 这是一个4比特的字段,表示对象的类型。它可以是以下几种类型之一:

    • REDIS_STRING(字符串)
    • REDIS_LIST(列表)
    • REDIS_HASH(哈希)
    • REDIS_SET(集合)
    • REDIS_ZSET(有序集合)
  2. encoding: 这是一个4比特的字段,表示对象的编码方式。不同的数据类型可以有不同的编码方式,以优化存储和操作效率。例如,对于列表类型,可能的编码方式包括 ziplist(压缩列表)和 linkedlist(双端链表),如下:

编号编码方式说明
0OBJ_ENCODING_RAWraw 编码动态字符串
1OBJ_ENCODING_INTlong int 的字符串
2OBJ_ENCODING_HThash 表
3OBJ_ENCODING_ZIPMAP已废弃
4OBJ_ENCODING_LINKEDLIST双端链表(linkedList)
5OBJ_ENCODING_ZIPLIST压缩列表(zipList)
6OBJ_ENCODING_INTSET整数集合
7OBJ_ENCODING_SKIPLIST跳表(skipList)
8OBJ_ENCODING_EMBSTRembstr 的动态字符串
9OBJ_ENCODING_QUICKLIST快速列表(quickList)
10OBJ_ENCODING_STREAMStream 流
  1. ptr: 这是一个指针字段,指向实际的数据值。根据对象的类型和编码方式,这个指针可以指向不同类型的内部数据结构。

  2. refcount: 这是一个整数字段,表示对象的引用计数。每当有新的键或者其他对象引用这个对象时,引用计数加一;当不再有引用时,引用计数减一。当引用计数降为0时,对象将被垃圾回收机制释放。

  3. lru: 这是一个 24 比特的字段,用于记录对象的最近使用时间(LRU,Least Recently Used)。在 Redis 的内存管理中,LRU 字段可以帮助确定哪些对象是最少使用的,以便在内存不足时进行淘汰。

4. 参考

《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 数据结构》

文章来源:https://blog.csdn.net/qq_36803941/article/details/135247573
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。