首页 > 数据库 >Redis数据结构分析1:Redis对象

Redis数据结构分析1:Redis对象

时间:2023-12-08 21:04:45浏览次数:37  
标签:encoding 对象 Redis 占用 REDIS robj 数据结构

Redis数据结构分析

本篇将涉及C语言,请确保您拥有C语言相关基础与计算机底层知识

RedisObject (robj)

robj是Redis对象的起点,所有的数据结构都封装到了robj之中。

其源码如下:

struct redisObject {
    unsigned type:4;
    unsigned encoding:4;
    unsigned lru:LRU_BITS;
    int refcount;
    void *ptr;
};

结构分析

type

type表示对象的类型,占用4bit存储空间。目前包含:REDIS_STRING(字符串)、REDIS_LIST (列表)、REDIS_HASH(哈希)、REDIS_SET(无序集合)、REDIS_ZSET(有序集合)。

encoding

encoding表示对象的内部编码,占用4bit存储空间。

Redis的每种数据类型都至少有两种编码格式。

例如,对于REDIS_STRING,有INT,EMBSTR,RAW三种编码格式。

通过将encoding封装在robj中,Redis可以根据不同场景快速获取编码格式,并针对该场景决定是否优化编码。

lru

lru全称Least Recently Used(最近最少使用),记录对象最后一次被访问的时间。

其占用的内存空间不定,4.0版本占用24bit,2.6版本占用22bit。

该值主要是用于配合LRU算法对内存进行优化。

当Redis占用内存达到maxmemory配置后,会根据LRU删除最近最少使用的对象。

refcount

refcount全称Reference Count(引用计数),主要用于记录当前对象被引用的次数,以判断该对象何时可以回收。

当refcount为0时,代表对象未被引用,可安全回收。

ptr

ptr全称Pointer(指针),这里是robj封装的数据结构的指针。

如果这里的数据是数字,则直接存储数字,其他对象则正常存储。

综上计算,robj的大小一般为4bit+4bit+24bit+4Byte+8Byte,即:16字节。

标签:encoding,对象,Redis,占用,REDIS,robj,数据结构
From: https://blog.51cto.com/ErickRen/8741601

相关文章

  • 数据结构与算法----------3
    队列队列也是一种受限制的线性表,只能在一端进行插入,在另一端进行删除。当然也有一种特殊的队列,名叫双端队列,也就是一段既可以插入也可以删除,在另一端也可以插入和删除。这就是双端队列。队列的顺序实现(非环形数组)代码实现//队列的顺序实现(非环形数组)#define_CRT_SECUR......
  • 数据结构与算法---------2
    栈栈是一个具有一定操作约束的线性表,只能在一端(栈顶,top)做插入和删除。栈的顺序实现//栈的顺序实现#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#include<time.h>#include<stdbool.h>#defineuun......
  • Caused by: io.lettuce.core.RedisCommandExecutionException: NOAUTH Authentication
    原文链接:https://blog.csdn.net/De_Buffer/article/details/132492287最终解决方法虽然通过更换连接客户端为jedis解决了问题,但不符合发展趋势,lettuce已成为主流redis客户端,springboot2官方推荐,因此在这个保底方案基础上继续探究。终于!!找到解决我的问题的一篇文章,跟着他的思......
  • Redis生产实战-热key、大key解决方案、数据库与缓存最终一致性解决方案
    生产环境中热key处理热key问题就是某一瞬间可能某条内容特别火爆,大量的请求去访问这个数据,那么这样的key就是热key,往往这样的key也是存储在了一个redis节点中,对该节点压力很大那么对于热key的处理就是通过热key探测系统对热key进行计数,一旦发现了热key,就将热key......
  • 秦疆的Java课程笔记:64 面向对象 构造器详解
    类中的构造器也称为构造方法,世在进行创建对象的时候必须要调用的。并且构造器有以下两个特点必须和类的名字相同必须没有返回类型,也不能写void构造器必须掌握!一个类即使什么也没写,也会存在一个方法//写一个空的Person类=========================publicclassPer......
  • Redis报错:(error) DENIED Redis is running in protected mode because protected mod
    一、报错内容  (error)DENIEDRedisisrunninginprotectedmodebecauseprotectedmodeisenabledandnopasswordissetforthedefaultuser.Inthismodeconnectionsareonlyacceptedfromtheloopbackinterface.Ifyouwanttoconnectfromexternal......
  • 使用Java实现面向对象编程 第八章 File IO 总结笔记
    java里操作文件1.第一步一定是获得这个文件(获得的文件,你是无法解析获得里面的内容,约等于获得冰。你只能知道大小颜色等。外表能够获取信息.)。2.第二步获得这个文件将这个文件转换成流。然后从这个io流里读取数据io流里又分为字符流(专门处理文字)字节流(专门处理2进制等文件)3.......
  • Redis报错:WARNING: The TCP backlog setting of 511 cannot be enforced because /pro
    报错内容:1:C08Dec202305:47:33.348#oO0OoO0OoO0OoRedisisstartingoO0OoO0OoO0Oo1:C08Dec202305:47:33.348#Redisversion=7.0.5,bits=64,commit=00000000,modified=0,pid=1,juststarted1:C08Dec202305:47:33.348#Configurationloaded1:M08De......
  • java JSON对象与字符串间的转换
    importcom.alibaba.fastjson.JSON;importcom.alibaba.fastjson.JSONObject;//字符串转为JSON对象StringstrParam="{\"callerid\":\"013941128270\",\"timestart\":\"2021-07-2709:37:42\",\"status\"......
  • 鸿蒙原生应用开发——分布式数据对象
     01、什么是分布式数据对象在可信组网环境下,多个相互组网认证的设备将各自创建的对象加入同一个sessionId,使得加入的多个数据对象之间可以同步数据,也就是说,当某一数据对象属性发生变更时,其他数据对象会检测到这一变更,同时将自身属性更新。此时,该sessionId下的所有数据对象属......