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

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。
  • 反之,则使用字典。
  • 在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数字化坚鹏:小熊电器面向数字化转型的大数据顶层设计实践培训

小熊电器面向数字化转型的大数据顶层设计实践培训圆满结束 ——努力打造“数据技术营销”三轮驱动的数字化领先企业 小熊电器股份有限公司由李一峰创立于2006年,是一家专业从事创意小家电研发、设计、生产和销售的实业型企业。2019年8月23日正式在深交所挂牌上市。…

rust使用Command库调用cmd命令或者shell命令,并支持多个参数和指定文件夹目录

想要在不同的平台上运行flutter doctor命令,就需要知道对应的平台是windows还是linux,如果是windows就需要调用cmd命令,如果是linux平台,就需要调用sh命令,所以可以通过cfg!实现不同平台的判断,然后调用不同…

【21-40】操作系统基础知识(非常详细)从零基础入门到精通,看完这一篇就够了

【21-40】操作系统基础知识(非常详细)从零基础入门到精通,看完这一篇就够了 以下是本文参考的资料 欢迎大家查收原版 本版本仅作个人笔记使用44、程序从堆中动态分配内存时,虚拟内存上怎么操作的45、常见的几种磁盘调度算法1. 先来…

codesys通过moudbus TCP连接西门子1214c,西门子做客户端

思路在codesys中发送数据到西门子,西门子原封不动的将数据传回。 1.首先配置codesys; 我设置了500个,但是好像发不这么多,只能120多个。因为什么来我忘了。但是这里不影响。 2.配置映射: 3.写代码 PROGRAM PLC_PRG VARarySendDa…

URL编码:原理、应用与安全性

title: URL编码:原理、应用与安全性 date: 2024/3/29 18:32:42 updated: 2024/3/29 18:32:42 tags: URL编码百分号编码特殊字符处理网络安全应用场景标准演变未来发展 在网络世界中,URL(统一资源定位符)是我们访问网页、发送请求…

Laya1.8.4 UI长按选择对应位置释放技能

需求: 需要实现拖拽摇杆选择技能释放位置,释放技能。 原理:首先拆分需求,分为两部分,UI部分和场景部分,UI部分需要实现长按效果,长按后又要有拖动效果,将官方文档的示例代码改了改…

HANA-公司间销售ICS-IDOC系统配置-保姆级配置文档

HANA公司间销售ICS-IDOC系统配置—保姆级配置文档 在项目实施过程中经常会遇到关联方交易的问题,有公司间采购的业务场景,也会存在公司间销售的业务场景,本文将着重讲解公司间销售在SAP系统中的实现场景。很多公司会在香港设置一个公司用于对外的销售接单,然后将接到的销售…

企业微信知识库:从了解到搭建的全流程

你是否也有这样的疑惑:为什么现在的企业都爱创建企业微信知识库?企业微信知识库到底有什么用?如果想要使用企业微信知识库企业应该如何创建?这就是我今天要探讨的问题,感兴趣的话一起往下看吧! | 为什么企业…

小白python爬虫基础教程(看这一篇就完了)

爬虫的五个步骤: 1)需求分析,找到需求相关的网址 2)获取网址的返回信息(urllib,requests) 3)定位需要的信息所在位置(re正则表达式,XPATH, CSS selector) 4&#xff…

argo rollout使用

一、前言 argorollout是比argocd更高级的发布工具,其中包含自动化金丝雀发布、自动化蓝绿发布、还可以通过argo命令或者dashboard查看发布的过程 二、使用 需要先部署argo rollout服务 参考:https://github.com/argoproj/argo-rollouts/tree/master/m…

关于web_server项目的学习记录(自用)

主要参考资料: 我在地铁吃闸机 基础处理框架:Multi-reactor muduo库有三个核心组件实现持续监听reactor的fd:channel;epoll/poller/eventloop类 channel 事件监听器epoll_ctl监听到了fd发生了什么事件,channel类会封装每个fd和fd感兴趣的事…

036—pandas 按行将列名根据值由大到小排序

前言 数据处理中,按行排列的列名可以提供更直观的数据探索和分析方式。 你可以逐行查看列名,了解每列的含义和特征,有助于更好地理解数据集的结构和内容。 需求: 需要增加一列「分布方式」,每行的值是本行基金名称对…

C++多线程:thread构造源码剖析与detach大坑(三)

1、thread源码浅剖析 基于Ubuntu18.04版本64位操作系统下进行分析thread源码分析,与Window或者其他版本可能有出入。 1.1、thread线程id的源头 typedef pthread_t __gthread_t; typedef __gthread_t native_handle_type;/// thread::id class id {native_handl…

常用类(日期时间)

目录 一、JDK 8之前的日期时间API1.1、System类中获取时间戳的方法1.2、Java中两个Date类的使用1.3、SimpleDateFormat的使用1.4、Calendar日历类的使用 二、JDK8中日期时间API的介绍2.1、LocalDate、LocalTime、LocalDateTime的使用2.2、Instant类的使用2.3、DateTimeFormatte…

Abaqus模拟新能源汽车电池理论概念

在新能源汽车电池的分析过程中,存在众多典型问题,这些问题跨越了机械、热管理和电气三大关键领域。其中,结构仿真分析作为一种重要的技术手段,主要聚焦于解决机械和热管理方面的挑战,为电池系统的性能优化和安全性提升…

集合(未完。。。)

集合 例题引入1.java集合引入2.为什么要使用集合?3.List、Set、Queue和Map的区别4.ListList——ArrayList(!!实用!!)ArrayList常用方法 List——VectorList——LinkedList 5.Set6.MapHashMapHas…

【CTFshow 电子取证】套的签到题

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收…

Spring 源码调试问题 ( List.of(“bin“, “build“, “out“); )

Spring 源码调试问题 文章目录 Spring 源码调试问题一、问题描述二、解决方案 一、问题描述 错误&#xff1a;springframework\buildSrc\src\main\java\org\springframework\build\CheckstyleConventions.java:68: 错误: 找不到符号 List<String> buildFolders List.of…

【C++】常对象

目录 常对象常对象特点常数据成员常成员函数对象的常引用 常对象 把对象定义为常对象&#xff0c;对象中的数据成员就是常变量&#xff0c;在定义时必须带实参&#xff08;或者有缺省构造函数&#xff09;作为数据成员的初值。 const Person p1(3,4);//定义了一个常对象常对象特…

202452读书笔记|《永安梦》——错过前世 般配 换取今生 奉陪 任波谲云诡 共安危 共进退

今年追的第一本剧同名小说&#xff0c;《永安梦》改编自剧《长安第一美人》。本来是冲着徐正溪去看的&#xff0c;被娜娜、孙坚、夏楠路转粉了&#xff0c;只限这个剧。名字跟我有一个字一样诶。妆造&#xff0c;姿态&#xff0c;男女主&#xff0c;男二女二配角都不错。 因为看…