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

embedded/2024/9/23 6:39:02/

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/embedded/32693.html

相关文章

spring boot “error“: “Not Found“

标题spring boot “error”: “Not Found” {"timestamp": "2024-05-04T07:26:21.15000:00","status": 404,"error": "Not Found","path": "/user/register" }出现以上这个提示可能是如下原因 查看在…

【已解决】VSCode 连接远程 Ubuntu :检测到 #include 错误。请更新 includePath。

文章目录 1. 环境声明2. 解决过程 1. 环境声明 即使是同一个报错,在不同的环境中,报错原因、解决方法都是不同的,本文只能解决跟我类似的问题,如果你发现你跟我遇到的问题不太一样,建议寻找其他解法。 必须要吐槽的是…

微软如何打造数字零售力航母系列科普09 - 什么是Dynamics 365 Customer Insight 以及如何使用它?

什么是Dynamics 365 Customer Insight(客户见解)以及如何使用它? 新的Dynamics 365 Customer Insights平台在Microsoft Inspire 2023上推出,为CX创新者提供了对组合客户数据平台(CDP)和旅程编排工具的访问。 更新后的解决方案于2023年9月首…

JVM笔记2--垃圾收集算法

1、如何确认哪些对象“已死” 在上一篇文章中介绍到Java内存运行时的各个区域。其中程序计数器、虚拟机栈、本地方法栈3个区域随着线程而生,随线程而灭,栈中的栈帧随着方法的进入和退出而有条不紊的执行着入栈和出栈操作。每个栈帧中分配多少内存基本上…

微博一级评论爬虫

cookies需要替换成自己的 import requests import requests from lxml import etree import openpyxl from concurrent.futures.thread import ThreadPoolExecutor import re from datetime import datetime, timedelta from urllib import parse from jsonpath import jsonpa…

01-MySQL 基础篇笔记

一、MySQL 概述 1.1 数据库相关概念 数据库:(DB:DataBase) 存储数据的仓库,数据是有组织的进行存储 数据库管理系统:(DBMS:DataBase Management System) 操作和管理数…

MATLAB 集成

MATLAB 集成(Integration) 集成处理两种本质上不同的问题。 在第一种类型中,给出了函数的导数,我们想找到函数。因此,我们从根本上扭转了分化的过程。这种反向过程称为反微分,或者找到原始函数&#xff0…

【Hadoop】--基于hadoop和hive实现聊天数据统计分析,构建聊天数据分析报表[17]

目录 一、需求分析 1、背景介绍 2、目标 3、需求 4、数据内容 5、建库建表 二、ETL数据清洗 1、数据问题 2、需求 3、实现 4、扩展概念:ETL 三、指标计算 1、指标1:统计今日消息总量 2、指标2:统计每小时消息量、发送量和接收用…