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

发布于:2024-05-05 ⋅ 阅读:(29) ⋅ 点赞:(0)

在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:记录真正数据的指针


网站公告

今日签到

点亮在社区的每一天
去签到