redis 的设计与实现(三)——对象

news2024/11/26 0:29:56

1. 前言:

在这里插入图片描述

在第一章节我们了解到了,redis底层所涉及的数据结构,但是这并非是离我们最近的一层,在此之上,redis实现了一层对象与我们交互。我们在本篇内容中将了解到:

  • 对象对应的实现
  • redis一些常用特性的实现

2.对象:

2.1:对象的基本结构:

redis 在通常建立存储一个内容的同时会建立两个对象,一个为key(通常为字符串),一个为value(可以为任何类型的对象)。
在这里插入图片描述

  1. type 指的是对象的类型,redis中有五种类型。
类型常量对象名称
REDIS_STRING字符串对象
REDIS_LIST列表对象
REDIS_HASH哈希对象
REDIS_SET集合对象
REDIS_ZSET有序集合对象
  1. encoding指的是底层数据结构
编码常量数据结构
REDIS_ENCODING_INTlong类型整数
REDIS_ENCODING_EMSTRembstr编码的简单动态字符串
REDIS_ENCODING_RAR简单动态字符串
REDIS_ENCODING_HT字典
REDIS_ENCODING_INKEDLIST双端链表
REDIS_ENCODING_ZIPLIST压缩列表
REDIS_ENCODING_INTSET整数集合
REDIS_ENCODING_SKIPLIST跳跃表和字典

当然,type和encoding不能随意组合。可组合列表如下。

类型编码对象
REDIS_STRINGREDIS_ENCODING_INT整数实现的字符串对象
REDIS_STRINGREDIS_ENCODING_EMSTRembstr编码的简单动态字符串对象
REDIS_STRINGREDIS_ENCODING_RAR简单动态字符串组成的动态字符串对象
REDIS_LISTREDIS_ENCODING_ZIPLIST压缩列表实现的列表对象
REDIS_LISREDIS_ENCODINGLINKEDLIST双端链表实现的列表对象
REDIS_HASHREDIS_ENCODINGLINKEDLIST压缩列表实现的哈希对象
REDIS_HASHREDIS_ENDODING_HT字典实现的哈希对象
REDIS_SETREDIS_ENCODING_INSET使用整数集合实现的集合对象
REDIS_SETREDIS_ENCODING_SET使用字典实现的集合对象
REDIS_ZSETREDIS_ENCODING_ZIPLIST使用压缩列表实现的有序集合对象
REDIS_ZSETREDIS_ENCODING_SKIPLIST使用跳跃表和字典实现的有序集合对象
  1. ptr 指向底层实现的数据结构。

2.2:字符串对象:

字符串对象的编码可以是int,raw和embstr。

  1. embstr: 小于32位,用于存储短的字符串,并且不提供变更的方法,如果存在修改总会变成raw格式。
    a4a2.png)

  2. long:用于存储整数,当在long范围内的整数通常用long格式编码;long追加字符串总会变为 raw 编码。

  3. raw:用于存储长的字符串
    在这里插入图片描述

在这里插入图片描述

  • raw 创建释放对象对内存的操作为两次,与sdshdr内存不连续
  • embstr 创建释放对象对内存操作的次数为1次,内存连续
  • 在这里插入图片描述

2.3:列表对象:

列表对象的底层可以是压缩列表和链表

  • 压缩列表的列表的数据结构在这里插入图片描述
  • 双端链表的列表的数据结构
    -

编码使用的条件

  1. 如果列表对象保存的所有字符串的长度都小于64字节且元素数量小于512个,则使用压缩列表。
  2. 反之,则使用双端链表。
    在这里插入图片描述

2.4:哈希对象:

哈希对象的底层实现可以是压缩列表和字典。

  1. 当使用压缩列表
    在这里插入图片描述
  • 使用压缩列表作为底层数据结构的时候,元素从尾部添加。
  • 在添加key-value时,压缩列表会把key先放入尾部,然后吧value放入尾部。在这里插入图片描述
  1. 当使用字典
    在这里插入图片描述

编码使用的条件

  • 如果列表对象保存的所有字符串的长度都小于64字节且元素数量小于512个,则使用压缩列表。
  • 反之,则使用字典。
  • 在这里插入图片描述

2.5:set集合对象:

集合对象可以使用 inset 和 ht 字典实现,
在这里插入图片描述
编码使用的条件

  • 如果列表对象保存的所有字符串的长度都小于64字节且元素数量小于512个,则使用intset。
  • 反之,则使用字典。
    在这里插入图片描述

2.6. 有序集合对象

有序集合对象的底层可以是压缩列表和跳表。

  1. 当使用压缩列表
  • 存储思路和哈希对象类似,依旧是 value score 并列放置,不过内部是有序的。小元素在前,大元素在后。
  • 插入的时候一般使用插入排序,如果插入的元素最大,则时间复杂度最小,因为不需要挪动元素。
    在这里插入图片描述
    在这里插入图片描述
  1. 使用跳表+字典
    在这里插入图片描述

有序集合在使用这两种组合结构是为链各个目标。

  • 能O(1)查询时间分值
  • 能通过分值快速筛序成员
    编码使用的条件
  • 如果列表对象保存的所有字符串的长度都小于64字节且元素数量小于128个,则使用intset。
  • 反之,则使用字典。
  • 在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1554484.html

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

相关文章

物联网实战--入门篇之(三)嵌入式STM32

目录 一、Keil简介 二、工程结构 三、文件目录 四、STM32简介 五、编码风格 六、总结 一、Keil简介 Keil是一款常用的单片机开发工具,主要包含了编译、仿真、调试和开发界面(IDE),后被ARM公司收购,与其MDK-ARM合并为MDK-ARM Keil软件包…

宝塔面板操作一个服务器域名部署多个网站

此处记录IP一样,端口不一样的操作方式: 宝塔面板操作: 1、创建第一个网站: 网站名用IP地址,默认80端口。 创建好后,直接IP访问就可以了。看到自带的默认首页 2、接下来部署第二个网站: 仍然是…

Spark-Scala语言实战(7)

在之前的文章中,我们学习了如何在IDEA中导入jars包,并做了一道例题,了解了RDD。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢…

自建机房私有云吗?

大家好,我是小码哥,之前一种有没搞清楚公有云、私有云的概念,今天算是弄清楚了,这里给大家分享一下公有云、私有云的区别,以及自建机房算不算私有云! 其实私有云(Private Cloud)和公…

修复系统中缺失的VCRUNTIME140.dll文件DLL错误问题

在计算机编程中,动态链接库(DLL)是一种重要的组件,它提供了许多功能和资源供程序使用。其中,VCRuntime140.dll是Visual C Redistributable Packages的一部分,它包含了运行C应用程序所需的运行时库。本文将详…

双端队列deque和vector以及list的优缺点比较

参考:https://blog.csdn.net/TWRenHao/article/details/123483085 一、vector vector具体用法详情点这里 优点: 支持随机访问 CPU高速环缓存命中率很高 缺点: 空间不够,便需要增容。而增容代价很大,还存在一定的空间浪费。 头部…

DSVPN实验报告

一、分析要求 1. 配置R5为ISP,只能进行IP地址配置,所有地址均配为公有IP地址。 - 在R5上,将接口配置为公有IP地址,并确保只进行了IP地址配置。 2. R1和R5之间使用PPP的PAP认证,R5为主认证方;R2于R5之间…

DC-5靶机

一.环境搭建 1.下载地址 靶机下载地址:https://download.vulnhub.com/dc/DC-5.zip 2.虚拟机配置 切换nat模式,有问题全选重试和是,打到这了,我感觉这个配置我都不用写了,启动靶机如下图所示即可 二.开始渗透 1.信…

Unity | 工具类-UV滚动

一、内置渲染管线Shader Shader"Custom/ImageRoll" {Properties {_MainTex ("Main Tex", 2D) "white" {}_Width ("Width", float) 0.5_Distance ("Distance", float) 0}SubShader {Tags {"Queue""Trans…

ARMv8-A架构下的外部debug模型(external debug)简介

Armv8-A external debug Armv8-A debug模型一,外部调试 External debug 简介二,Debug state2.1 Debug state的进入与退出 三,DAP,Debug Access Port3.1 EDSCR, External Debug Status and Control Register调试状态标识&#xff0…

Midjourney绘图欣赏系列(十四)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子,它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同,Midjourney 是自筹资金且闭源的,因此确切了解其幕后内容尚不…

什么是自然语言处理(NLP)?

此为观看视频What is NLP (Natural Language Processing)?后的笔记。 你正在看这个视频,试图理解作者说的单词和句子,当我们要求计算机做到这一点时,这就是 NLP,即自然语言处理。 NLP 在人工智能应用中实用价值很高。NLP 从非结构…

C++项目——集群聊天服务器项目(七)Model层设计、注册业务实现

在前几节的研究中,我们已经实现网络层与业务层分离,本节实现数据层与业务层分离,降低各层之间的耦合性,同时实现用户注册业务。 网络层专注于处理网络通信与读写事件 业务层专注于处理读写事件到来时所需求的各项业务 数据层专…

Mysql从0到1 —— CRUD/索引/事务

文章目录 1 预备知识1.1 安装1.2 登录 & 退出1.3 配置文件my.cnf 2 基础知识2.1 链接服务器2.2 什么是数据库2.3 基本使用2.3.1创建表2.3.2 插入数据 2.4 服务器、数据库、表的关系2.5 SQL分类2.6 存储引擎 3 Mysql数据库的操作3.1 创建和删除3.2 字符集和校验规则3.3 查看…

YOLOv8全网独家改进:红外小目标 | 注意力机制改进 | 维度感知选择性集成模块DASI,红外小目标暴力涨点| 2024年3月最新成果

💡💡💡本文独家改进:维度感知选择性集成模块DASI,解决目标的大小微小以及红外图像中通常具有复杂的背景的问题点,2024年3月最新成果 💡💡💡红外小目标实现暴力涨点,只有几个像素的小目标识别率大幅度提升 改进结构图如下: 收录 YOLOv8原创自研 https://blo…

Challenging BIG-Bench tasks and whether chain-of-thought can solve them阅读笔记

不是新文章哈,就是最近要看下思维链(chain of thought,CoT)这块,然后做点review。 文章链接(2022年):https://arxiv.org/pdf/2210.09261.pdf GitHub链接:GitHub - suzg…

100个AI Agent应用场景合集

人工智能代理(AI Agent)的发展正在以前所未有的速度改变我们的生活和工作方式。从日常生活的小事到企业级的复杂决策,AI Agent 的应用场景广泛且多样。 100个AI Agent应用场景合集 以下是 100 个 AI Agent 的创新应用场景,它们展示…

代码随想录算法训练营第三十八天 | 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

代码随想录算法训练营第三十八天 | 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯 509. 斐波那契数题目解法 70. 爬楼梯题目解法 746. 使用最小花费爬楼梯题目解法 感悟 509. 斐波那契数 题目 解法 使用动态规划 class Solution { public:int fib(int n) {if(n <…

书生浦语训练营2期-第一节课笔记

笔记总结: 了解大模型的发展方向、本质、以及新一代数据清洗过滤技术、从模型到应用的典型流程、获取数据集的网站、不同微调方式的使用场景和训练数据是什么&#xff0c;以及预训练和微调在训练优势、通信/计算调度、显存管理上的区别。 收获&#xff1a; 理清了预训练和微调…

unity学习(77)--多玩家信息交互--不同类型的数据包

明白各个数据包的作用&#xff0c;以及是否正确的发挥作用 1.“120包”&#xff0c;客户端登录时发给服务器的&#xff0c;服务器处理后返回“121包”。 2.“121包” &#xff0c;服务器返回给客户端的&#xff0c;包含登录时所有在线玩家的信息。 客户端也通过createPlayer函…