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

在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.mzph.cn/diannao/6662.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

美团面试(一面)

前言 给位小伙伴好,这里呢,分享一下最近一次美团的面试的面经,自己把面试的大多数内容通过博客的形式记录了下来,希望对各位有所帮助哦~ 一、项目篇 1、**对于自己的点餐小程序数据库表是怎么设计的 2、对于多个人下订单的问题…

Java---类和方法的再研究

上一篇主要介绍了面向对象的思想以及内存实现,关于类与对象感觉写的不够好,因此才会有这一篇作为补充; 一:类与对象 (1)类 一些相同属性和行为的事物的统称,比较广泛、抽象,比如…

专项技能训练五《云计算网络技术与应用》实训7-1:安装mininet

文章目录 mininet安装1. 按6-1教程安装opendaylight控制器。2. 按6-2教程安装RYU控制器。3. 按5-1教程安装openvswitch虚拟交换机并开启服务。4. 将老师所给mininet安装包试用winSCP传送至电脑端。5. 安装net-tools。6. 安装mininet7. 安装完成后,使用命令建立拓扑&…

C#基础之选择排序

选择排序 文章目录 选择排序1、概念2、代码实现 1、概念 1、新建一个下标 int index 0; 2、依次比较 3、找出极值 arr[index] < arr[n] 4、放入目标 //数组长度-1-n轮从第0轮开始 5、比较n轮2、代码实现 int[] arr new int[]{8,7,1,5,4,2,6,3,9}; 第一步 声明索引0&…

Python实战开发及案例分析(7)—— 排序算法

排序算法是计算机科学中的基础&#xff0c;用于将数据元素按照特定的顺序排列。Python 提供了多种方式来实现排序算法&#xff0c;包括内置的排序函数和手动实现各种经典排序算法。 Python 内置排序函数 Python 的内置函数 sorted() 和列表的 sort() 方法提供了高效的排序功能…

什么?你用service调controller,那参数校验怎么办?

你好&#xff0c;我是柳岸花开。 你有没有遇到过用service调controller的场景&#xff1f;我司公有云用的微服务架构&#xff0c;私有云则用的合并完的微服务架构——一个单体&#xff0c;这就涉及到用service调controller&#xff0c;这个明显的问题是参数校验会失效&#xff…

【网络安全产品】---应用防火墙(WAF)

what Web应用防火墙&#xff08;Web Application Firewall) WAF可对网站或者App的业务流量进行恶意特征识别及防护&#xff0c;在对流量清洗和过滤后&#xff0c;将正常、安全的流量返回给服务器&#xff0c;避免网站服务器被恶意入侵导致性能异常等问题&#xff0c;从而保障…

快速了解Django:核心概念解析与实践指南

title: 快速了解Django&#xff1a;核心概念解析与实践指南 date: 2024/5/1 20:31:41 updated: 2024/5/1 20:31:41 categories: 后端开发 tags: Django核心路由系统视图系统ORM管理中间件Web框架登录装饰器 第一章&#xff1a;Django简介 背景和发展历程&#xff1a; Djan…

计算机毕业设计springboot基于vue电商抢购限时秒杀系统ch0h8

技术栈 ide工具&#xff1a;IDEA 或者eclipse 编程语言: java 数据库: mysql5.7以上版本 可选框架&#xff1a;ssmspringboot都有的 前端&#xff1a;vue.jsElementUI 详细技术&#xff1a;springbootSSMvueMYSQLMAVEN 数据库工具&#xff1a;Navicat/SQLyog都可以 开发工具 Ec…

CMakeLists.txt语法规则:部分常用命令说明四

一. 简介 前面几篇文章学习了CMakeLists.txt语法中前面几篇文章学习了CMakeLists.txt语法中部分常用命令。文章如下&#xff1a; CMakeLists.txt语法规则&#xff1a;部分常用命令说明一-CSDN博客 CMakeLists.txt语法规则&#xff1a;部分常用命令说明二-CSDN博客 CMakeLi…

【算法设计与分析】六、动态规划:(二)上机-1、地牢逃生【理论到程序】

文章目录 一、题目1、问题2、输入输出要求3、样例说明4、数据范围 二、思路1、GPT4 - fail算法解释C 实现 2、Claude3 - fail问题分析算法实现 3、个人拙见 - succeed 三、代码实现 一、题目 1、问题 用一个 nn 的矩阵表示一座地牢&#xff0c;矩阵中第 i 行第 j 列的方格的值…

力扣每日一题106:从中序与后序遍历序列构造二叉树

题目 中等 相关标签 相关企业 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7], postorder …

OpenCV(五) —— 人脸识别模型训练与 Windows 下的人脸识别

本文主要内容&#xff1a; 如何训练 OpenCV 的人脸识别模型如何在 Windows 下利用 OpenCV 进行人脸识别 1、概述 人脸识别需要人脸模型&#xff08;特征集合&#xff09;的支持&#xff0c;人脸定位的速度与准确度取决于模型。 OpenCV 提供了已经训练好的模型&#xff0c;无…

KAN网络认识

首先&#xff0c;这是一个基于柯尔莫哥洛夫-阿诺德表示定理的网络。这个定理指出如果函数f是定义在有界域上的多变量连续函数&#xff08;即最终要拟合的非线性函数是连续的&#xff09;&#xff0c;那么该函数就可以表示为多个单变量、加法连续函数的有线组合。 对于机器学习…

大数据BI可视化(Echarts组件)项目开发-熟悉交互API5.0

全局echarts对象 init初始化 registerTheme注册主题 var mCharts echarts.init(document.querySelector("div"), itcast)registerMap地图图表 connect 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8&qu…

程序员副业项目开发支付解决方案

个人支付解决方案 让我们跳过开发环节&#xff0c;来谈谈如何变现。大部分支付方案都是为企业设计的&#xff0c;面向个人的正规支付方案相对较少。那么&#xff0c;对于那些没有注册公司的个人来说&#xff0c;怎样才能更安全地收款呢&#xff1f; 常见的几种个人收款方式 个…

OpenCV(六) —— Android 下的人脸识别

本篇我们来介绍在 Android 下如何实现人脸识别。 上一篇我们介绍了如何在 Windows 下通过 OpenCV 实现人脸识别&#xff0c;实际上&#xff0c;在 Android 下的实现的核心原理是非常相似的&#xff0c;因为 OpenCV 部分的代码改动不大&#xff0c;绝大部分代码可以直接移植到 …

ubuntu安装LVGL/lv_img_conv并在thinkphp中进行调用生成bin文件

项目需求&#xff1a;需要处理图片成为bin文件&#xff0c;并以二进制的方式传给蓝牙设备&#xff0c;当前仅介绍如何安装&#xff0c;对lvgl功能和简介不做过多描述 项目库地址&#xff1a;https://github.com/lvgl/lv_img_conv 安装过程比较简单 一&#xff0c;确保node.j…

mall-cook本地部署运行

下载源代码 https://github.com/wangyuan389/mall-cook 下载好之后解压&#xff0c;删除.github和yarn.lock&#xff0c;因为使用pnpm 启动文档部署 切换到packages\mall-cook-document&#xff0c;删除yarn.lock&#xff0c;安装依赖包pnpm install 执行pnpm dev启动文档…

C语言/数据结构——(用双链表实现数据的增删查改)

一.前言 嗨嗨嗨&#xff0c;大家好久不见&#xff01;前面我们已经通过数组实现数据的增删查改、单链表实现数据的增删查改&#xff0c;现在让我们尝试一下使用双链表实现数据的增删查改吧&#xff01; 二.正文 如同往常一样&#xff0c;对于稍微大点的项目来说&#xff0c;…