redis保存数据的结构-redisobject结构体

devtools/2024/11/14 15:16:58/

redis中,所有键值对的保存,都是机遇redisboject的一个结构体,如下

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

type:记录了当前数据的数据类型,其中包括

REDIS_STRING:

字符串类型是 Redis 中最基本的数据类型,可以存储任何形式的字符串或二进制数据,例如文本数据或二进制图片数据。

REDIS_LIST:

列表类型用于存储一系列的字符串,按照插入顺序排序。列表是双向链表,支持在其头部或尾部高效地进行添加或删除操作。

REDIS_SET:

集合是由字符串组成的无序集,集合中的元素是唯一的。Redis 提供了一系列操作集合的命令,比如添加、删除元素,以及计算交集、并集和差集等。REDIS_ZSET (sorted set):

有序集合类似于集合,但每个元素都会关联一个浮点数分数值,Redis 根据分数来为集合中的元素进行从小到大的排序。有序集合适用于需要按范围查询或排序的场景。

REDIS_HASH:

哈希是键值对的集合,这里的键和值都是字符串类型。这种数据结构适合存储对象(例如表示用户的多个字段)。

这些类型是redis的基本类型

encoding:定义了内部存储数据的编码格式,每个类型的数据都有不同的编码格式,如下

REDIS_STRING:

REDIS_ENCODING_RAW: 用于存储字符串数据的动态字符串(SDS, Simple Dynamic String)。这是最常见的编码方式,适用于普通的字符串操作。

REDIS_ENCODING_INT: 当字符串内容可以被解析为整数时使用,可以直接将值存储为 C 语言的整型。这种方式在处理数字操作时内存效率更高。

REDIS_ENCODING_EMBSTR: 用于存储短字符串(通常小于 44 字节),这种编码方式可以减少内存分配的开销,因为对象元数据和字符串数据可以在同一内存块中连续存储。

REDIS_LIST:

REDIS_ENCODING_LINKEDLIST: 使用双向链表存储列表元素,适合于元素数量较大或者元素添加删除频繁的场景。

REDIS_ENCODING_ZIPLIST: 压缩列表是一种紧凑的内存结构,用于存储较小的列表。当列表中的元素较小且数量不多时,使用压缩列表可以节省内存。

REDIS_SET:

REDIS_ENCODING_HT: 使用哈希表存储集合元素,这适合元素数量较大的场景,可以快速进行元素查找、添加和删除。

REDIS_ENCODING_INTSET: 整数集合用于存储只包含整数的集合,当所有元素都是整数且数量不多时,使用整数集合可以节省内存。

REDIS_ZSET:

REDIS_ENCODING_ZIPLIST: 压缩列表同样可以用于存储有序集合,当元素数量少且每个元素的大小较小时使用。

REDIS_ENCODING_SKIPLIST: 跳跃表(和哈希表结合)用于存储较大的有序集合,可以提供快速的元素访问和范围查询性能。

REDIS_HASH:

REDIS_ENCODING_ZIPLIST: 压缩列表用于存储小型哈希,当字段和值的大小较小且数量较少时,使用压缩列表可以节约内存。

REDIS_ENCODING_HT: 使用哈希表来存储较大的哈希,适合于字段数量较多或数据大小较大的情况。

lru:LRU_BITS:

在LFU算法相关的内存淘汰策略下,表示该数据访问次数频率的多少,但不是具体的访问次数,他会计算1/(lru现在的指*ifu_log_factor(默认是10) + 1),并且拿出一个0-1的随机数判断是否小于这个值,如果小于则会加一,这样来看,除了第一次一定加一,随着lru越来越大,增大的概率也越来越小,这样做也是为了节省内存,并且仍然能够体现出最近访问次数频率的多少,没过一段时间还会减少1,默认是1分钟。

而在LRU算法相关的内存淘汰策略下这个属性则记录的是一个最近访问时间的时间戳

这个属性主要用于内存淘汰时的比较

refcount:记录当前数据被引用次数,如果为零,则可以被回收

*ptr:记录真正数据的指针


http://www.ppmy.cn/devtools/34230.html

相关文章

VS Code 保存+格式化代码

在 VSCode 中,使用 Ctrl S 快捷键直接保存并格式化代码: 打开 VSCode 的设置界面:File -> Preferences -> Settings在设置界面搜索框中输入“format on save”,勾选“Editor: Format On Save”选项,表示在保存…

【Redis】10大数据类型之Hash类型

文章目录 1.Hash类型2.常用命令3.示例hset和hgethgetallhlenhkeys和hvalshexistshdelhincrby和hincrbyfloathsetnx 1.Hash类型 Redis中的Hash类型是一种高效的数据结构,用于存储键值对的集合。这种类型特别适用于表示对象,因为它允许你将对象的多个属性…

开发日记-npm下载镜像超时,切换镜像源方式

使用npm下载组件和初始化等操作的时候可能会遇到下面的问题&#xff1a; npm ERR! Exit handler never called! npm ERR! This is an error with npm itself. Please report this error at: npm ERR! <https://github.com/npm/cli/issues> npm ERR! A complete log of t…

Linux内核--设备驱动(六)媒体驱动框架整理一--音频

目录 一、引言 二、ALSA ------>2.1、alsa声卡设备 ------>2.2、内部实现 ------------>2.2.1、usb通讯配置 ------------>2.2.2、midi设备创建 ------------>2.2.3、创建pcm设备 ------------>2.2.4、创建 control 设备 ------------>2.2.5、声…

Python基础详解一

一&#xff0c;print打印 print("hello word") print(hello word) 双引号和单引号都可以 二&#xff0c;数据类型 Python中常用的有6种值的类型 输出类型信息 print(type(11)) print(type("22")) print(type(22.2)) <class int> <class str&…

如何利用单声道音频进行说话人距离估计

音频中的距离估算在各种应用中扮演着关键角色&#xff0c;例如声学场景分析、声源定位和房间建模。大多数研究主要集中在采用分类方法&#xff0c;将距离离散化为不同的类别&#xff0c;这样虽然可以让模型训练更平滑&#xff0c;提高精度&#xff0c;但限制了获得的声源位置的…

STC单片机和串口触摸屏自由通讯协议

/*------------------主循环程序----------------*/ void main( ) /*主程序开始*/ { /**加一**/ P0M00XFF; //推挽输出 P0M…

AEC Capital Limited:开启可持续金融新纪元

在当今社会&#xff0c;环保和可持续发展已成为全球关注的焦点。在这个背景下&#xff0c;AEC Capital Limited作为香港的一家金融服务公司&#xff0c;以其专业、高端的服务和创新的理念&#xff0c;成为可持续金融领域的引领者。我们致力于将环境保护与金融服务相结合&#x…