Redis是一个key-value型数据库,key只能是字符串,value可以是字符串、列表、集合、有序集合和散列表,这5种数据类型用结构体robj表示,我们称之为Redis对象。

#define LRU_BITS 24
typedef struct redisObject {unsigned type:4;unsigned encoding:4;unsigned lru:LRU_BITS;  //缓存淘汰使用int refcount;           //引用计数void *ptr;
} robj;

redisObject的type字段表示具体的数据类型,如下

#define OBJ_STRING 0
#define OBJ_LIST 1
#define OBJ_SET 2
#define OBJ_ZSET 3
#define OBJ_HASH 4

redisObject的encoding字段表示具体当前对象底层存储采用的数据结构

type类型 encoding类型 备注
OBJ_STRING raw,int,embstr raw与embstr都是sds
OBJ_LIST quicklist
OBJ_SET dict,intset
OBJ_ZSET dict,ziplist
OBJ_HASH ziplist,skiplist+dict

raw与embstr区别
redisObject的ptr字段是void*类型的指针,指向实际存储的某一种数据结构,但是当redisObject存储的数据可以用long类型表示时,数据直接存储在ptr字段。可以看出,为了创建一个字符串对象,必须分配两次内存,redisObject与sds存储空间;两次内存分配效率低下,且数据分离存储降低了计算机高速缓存的效率。因此提出OBJ_ENCODING_EMBSTR(embstr)编码的字符串,当字符串内容比较短时,只分配一次内存,robj与sds连续存储,以此提升内存分配效率与数据访问效率。

redisObject的refcount存储当前对象的引用次数,用于实现对象的共享。共享对象时,refcount加1;删除对象时,refcount减1,当refcount值为0时释放对象空间。删除对象的代码如下:

void decrRefCount(robj *o) {if (o-refcount == 1) {switch(o-type) { //根据对象类型,释放其指向数据结构空间case OBJ_STRING: freeStringObject(o); break;case OBJ_LIST: freeListObject(o); break;case OBJ_SET: freeSetObject(o); break;…………}zfree(o); //释放对象空间} else {//引用计数减1if (o-refcount != OBJ_SHARED_REFCOUNT) o-refcount--;  }
}

robj的refcountlru字段占24比特,用于实现缓存淘汰策略,可以在配置文件中使用maxmemory-policy配置已用内存达到最大内存限制时的缓存淘汰策略。lru根据用户配置的缓存淘汰策略存储不同数据,常用的策略就是LRU与LFU。LRU的核心思想是,如果数据最近被访问过,那么将来被访问的几率也更高,此时lru字段存储的是对象访问时间;LFU的核心思想是,如果数据过去被访问多次,那么将来被访问的频率也更高,此时lru字段存储的是上次访问时间与访问次数。

Redis07-对象结构体redisObject相关推荐

  1. C语言 结构体 struct Cat cat1;

    引入 使用传统技术解决 需要定义多个变量或数组 结构体与结构体变量的关系示意图 类似Java类中的对象(结构体)与属性(结构体变量) 一切物体都可以看作对象(结构体) 补充:C语言数据类型 简单使用案 ...

  2. 【Objective-C】类与结构体的区别

    只能在类里面写方法,不能在结构体里面写方法 类--对象,结构体--值 类--引用类型 位于栈上的指针(引用) 位于堆上的实体对象 结构体--值类型 实例直接位于栈中 拷贝行为: classname * ...

  3. 【结构体】C语言结构体使用教程

    目录 1.结构体简介 2.结构体的含义 ​编辑 3.结构体的语法 3.1创建一个简单结构体 3.2给结构体赋值 3.3结构体的打印 4.结构体扩展内容 5.结尾彩蛋 1.结构体简介 在日常使用中我们很 ...

  4. C++与C语言02 结构体区别

    这里写目录标题 C++与C语言02 结构体区别 11-18 类型上不再需要struct关键字,直接用结构体名即可 C++结构体中允许函数存在 动态内存申请 内存池 string类型 C++与C语言02 ...

  5. 安防监控之软硬件环境分析和通信结构体定义

    文章目录 声明 软硬件环境分析 FS4412 资源描述 ZigBee 开发套件简介 通信结构体定义 zigbee 模块对象信息参数结构体 A9模块对象信息参数结构体 环境参数对象结构体参数 所有监控区 ...

  6. go云原生语法-结构体(一)

    前言 Go语言结构体(Struct)从本质上讲是一种自定义的数据类型,只不过这种数据类型比较复杂,是由 int.char.float 等基本类型组成的.你可以认为结构体是一种聚合类型. 在实际开发中, ...

  7. 自定义数据类型——结构体

    结构体的定义与使用 数组是一种数据形式,其特点是多个相同类型的元素集合起来 结构体是另一种重要的数据形式,特点是将不同类型的成员组合起来 数组和结构体形成了两种风格迥异的聚合方式,通过他们以及相互组合 ...

  8. JNI调用c++函数,该函数的参数是结构体(——对象的传递)

    第三方C++函数接口为 int api_get_logfile(Struct fileinfo tfile),参数是个结构体,且套了另一个结构体: struct fileinfo{  char *fu ...

  9. C++ VS C# 结构体和对象的细微区别

    C++ VS C# 结构体和对象的细微区别 类与结构体在C++与C#中都是可以使用的,但是两者在两种语言中的区别却很大,今天在这里进行一下记录. 在C++中,类与结构体的唯一区别就是默认访问权限的区别 ...

最新文章

  1. pjax php,ZBlogPHP简单实现pjax的一种方法
  2. Spring MVC请求处理流程
  3. 可以添加自定义的Select控件
  4. Android学习总结(4)——Andorid Studio熟练使用
  5. 免费下载谷歌maps软件_Android Google Maps当前位置,夜间模式功能
  6. C#与.NET程序员面试宝典 1.2.4 简历中的闪光点----突出可转移技能(可能是你忽略的优势)...
  7. Android开发-Android项目结构
  8. android 全屏FullScreen的配置
  9. 【前端进阶】-TypeScript类型声明文件详解及使用说明
  10. Vue3 Mixin的使用方法(全局,局部,setup内部使用)
  11. 小爱控制HA上的开关(红外线)
  12. react组件书写规范
  13. PPT这样学就对了之首页制作
  14. 35去一线城市找工作_空间计算如何改变一线工作的现状
  15. c#语法糖模式匹配【switch 表达式】
  16. C++读txt文件,存入vector容器中
  17. 云管理平台是个什么东西
  18. 一部以中国现实为大背景的英国科幻电影《未来密码46》
  19. schedule函数浅析
  20. 计算机专业英语第04章,2021计算机专业英语第四章

热门文章

  1. finereport mysql 插件,web报表插件领导品牌FineReport
  2. attrib批量显示文件夹_Windows 下彻底隐藏文件和文件夹的方法
  3. LCA(最近公共祖先)
  4. 【数据结构与算法】算法的时间复杂度
  5. 部署weblogic 12c时遇到的问题
  6. IDEA----将本地svn项目导入idea后没有拉取提交按钮
  7. 怎么卡我的世界服务器物品,我的世界手机版卡BUG刷物品方法攻略
  8. c++驱动键鼠源码_Android移植FM芯片RDA5807M驱动指导
  9. java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String
  10. resttemplate发送post请求