Redis学习——2. 对象类型(一):字符串对象

NI-HIL学习开篇 自我介绍下,四年零部件厂工作经验,一年(至今)主机厂工作经验,负责BMS/VCU方向软硬件测试。 学习目的:把握新能源汽车的测试发展趋势,顺应历史的洪流。 学习目标:1.掌握HIL开发测试流程中的IO配置、开环验证、闭环模型开发及调试、自动化测试 2.掌握第三方模型的搭建及simulink关联仿真(2019.05.21新增:需巩固练习matlab基础——2... 阅读详情

2、对象类型

第一部分的6节简单介绍了Redis的基础数据结构,接下来要开始学习Redis的对象系统。下面(2-1)是redis中对象的实现:

typedef struct redisObject {
    unsigned type:4;
    unsigned encoding:4;
    unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or
                            * LFU data (least significant 8 bits frequency
                            * and most significant 16 bits access time). */
    int refcount;
    void *ptr;
} robj;

 其中 type共有5中:

对象属性type 指令输出
字符串对象REDIS_STRINGstring
列表对象REIDS_LISTlist
哈希对象REDIS_HASHhash
集合对象REDIS_SETset
有序集合对象REDIS_ZSETzset

encoding共8中,指明了*ptr的具体的数据结构,*ptr则是存储具体数据的指针。

2.1  字符串对象(string)

Redis中字符串对象针对不同的数据可能有三种编码方式。

2.1.1 REDIS_ENCODING_INT

整数型的字符串会使用这种编码进行存储,其取值范围为 -9223372036854775808~9223372036854775807(long)

127.0.0.1:6379> SET val1 1
OK
127.0.0.1:6379> type val1
string
127.0.0.1:6379> object encoding val1
"int"

2.1.2 REDIS_ENCODING_EMBSTR

对于长度小于等于39的字符串(3.0之后长度小于等于44),采用embstr编码方式存储。

127.0.0.1:6379> SET val1 abcd
OK
127.0.0.1:6379> SET val2 abcd
OK
127.0.0.1:6379> type val2
string
127.0.0.1:6379> object encoding val2
"embstr"

为什么是39和44这样的数呢?

对于字符串的存储,Redis使用robj+sdshdr实现;每次创建字符串对象程序必须进行两次内存申请,为了提升程序的性能,对于短字符串会一次申请64byte的内存大小(Redis使用jemalloc内存分配器,可以分配8,16,32,64字节等大小的内存),通过1-1、2-1我们可以算出robj需要的内存大小为4x4=16,sdshdr需要的内存大小为4x2=8,那buf的可用大小就是64-16-8=40,再出去'\0'占用的一个空间,则还剩39。

而44则是由于3.2之后redis对于sdshdr实现的修改,因为对于短字符串来说,int型的len和free有点过于浪费了,所以redis分别实现了sdshdr5,sdshdr8,sdshdr16,sdshdr32,sdshdr64。具体的长度大家可以自己自行计算,我在下面贴上这种类型的实现。

typedef unsigned char     uint8_t;

struct sdshdr8 {
    uint8_t len; /* used */
    uint8_t alloc; /* excluding the header and null terminator */
    unsigned char flags; /* 3 lsb of type, 5 unused bits */
    char buf[];
};

值得注意的是,Redis并没有为embstr编写任何的修改程序,所以embstr对象实际上是只读的,当我们执行修改命令是,embstr对象会被转为raw对象,修改完成之后不会转换回去。

127.0.0.1:6379> set val4 hello
OK
127.0.0.1:6379> object encoding val4
"embstr"
127.0.0.1:6379> append val4 ' world'
(integer) 11
127.0.0.1:6379> object encoding val4
"raw"
127.0.0.1:6379> set val4 'hello world'
OK
127.0.0.1:6379> object encoding val4
"embstr"

2.1.3 REDIS_ENCODING_RAW

127.0.0.1:6379> SET val3 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678
OK
127.0.0.1:6379> object encoding val3
"embstr"
127.0.0.1:6379> type val3
string
127.0.0.1:6379> SET val3 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789
OK
127.0.0.1:6379> object encoding val3
"raw"
127.0.0.1:6379> type val3
string

出了上述两种情况外,字符串都会是raw编码。

论文理解【LLM-Clarification】—— 【QDrawer】Asking the Right Question at the Right Time: Human and Model Unce 本文基于 CoDraw 任务对 LLM 澄清提问的触发方式进行探索,发现模型内部不确定性与人类澄清决策相关性弱,使用不确定性阈值触发澄清提问相比模仿人类提问时机,性能和计算效率都更好 阅读详情

相关推荐

软考中级-系统集成项目管理工程师**的超详细知识点笔记。

软考中级系统集成项目管理工程师核心知识点摘要 综合知识:涵盖信息化基础(国家信息化六要素、信息系统开发方法)、系统集成特点(高技术性、团队协作)、IT服务管理(ITIL流程)、网络技术(OSI模型、TCP/IP)、信息安全(CIA三要素、加密技术)、软件工程(生命周期、测试类型)、面向对象分析与设计(UML图)、新一代信息技术(云计算、大数据、物联网)。 案例分析:聚焦项目管理十大知识领域,重点包括: 整体管理(项目章程、变更控制流程) 范围管理(WBS分解、需求跟踪矩阵) 进度管理

最爱で毛毛熊的博客 1991

redis系列-对象

redis对象 redis对象系统包含字符串对象,列表对象,哈希对象,集合对象和有序集合对象,通过这5种对象,redis在执行命令时,用来判断一个对象是否可以执行给定的命令。 redis使用对象来表示数据库中的键和值,当创建一个新的键值对,会创建两个对象,一个是键,一个是值。 对象类型和编码 redis对象结构 typedf struct redisObject{ unsigned type:4; unsigned encoding:4 void *ptr; }robj; 类型 redisObje

代码机器 275

Apifox 自动化测试新增流程控制条件,复杂测试场景不再是问题

在 if 条件后的输入框填写请求接口得到的变量 viewed ,选择条件为「小于」,输入比较数值 10 ,并在 if 条件下添加「宠物下架处理」步骤。借助新增的自动化测试流程控制条件,测试人员就可以使用 Apifox 去实现更深层更多样的测试应用场景,帮助提升测试效率,减少复杂场景的测试操作。「查询新建宠物」、「修改宠物状态为已售出」和「查询宠物状态是否修改」步骤为当前在售宠物信息盘点的三个标准步骤,所以将这三个步骤合成一组。在循环中添加「查询在售宠物」和「修改宠物状态」步骤;

877

redis对象之字符串对象

字符串对象有三种编码方式 第一种编码方式int 第二种编码方式raw 第三种编码方式embstr 如果字符串对象保存的是一个字符串值,并且这个字符串值的长度小于等于39个字节,那么字符串对象将使用embstr编码的方式来保存这个值。 使用embstr编码的字符串对象来保存短字符串值有以下好处: embstr编码将创建字符串对象所需的内存分配次数从raw编码的二次降...

zkc_home 1万+

文献阅读:SAR像素偏移的性能改进An Improvement of the Performance of SAR Offset Tracking Approach

像素偏移追踪POT文献阅读

weixin_56301271的博客 342

逆向工具:一文讲述 Ghidra 的详细使用

Ghidra是由NSA开源的一款功能强大的逆向工程框架,支持多平台、多架构和多种文件格式分析。本文详细介绍了Ghidra的核心优势、安装配置方法、主界面功能模块,并通过一个CrackMe示例演示了完整的逆向分析流程。文章还讲解了高级功能如交叉引用、控制流图分析、数据类型重建和脚本自动化等,最后提供了常见文件格式的分析技巧。作为IDA Pro的免费替代方案,Ghidra适合个人学习、教学和中小项目使用。(149字)

数据知道的博客 4350

Redis数据结构和对象(一)

一,简单动态字符串(SDS) 1,用途:保存数据库中的字符串值,及用作缓冲区(AOF)。 2,数据结构。 3,SDS与C字符串的区别。 1)常数复杂度获取字符串长度。SDS会记录自身的长度信息。 2)杜绝缓冲区溢出。C字符串不记录自身长度很容易造成缓冲区溢出。 3)减少修改字符串时带来的内存重分配次数。 a) c字符串内存重分配。 拼接:拼接前需要内存重分配,扩展底层数组的大小,——如果忘了可

不忘初心 614

如何使用 SAP ABAP Development Tool 连接 SAP BTP 上的免费 ABAP 编程环境

在云端环境编写 ABAP 代码会遇到一些限制,比如你无法在云端 ABAP 编程环境进行发生在传统 SAPGUI 里的 Dynpro 和 Screen 编程。部分在 SAPGUI 里使用的 List 处理相关的关键字比如 WRITE,还有 CALL TRANSACTION 等代码,也无法在云端使用。 当然如果大家觉得上面提到的这些限制不会影响自己的 ABAP 学习,就可以继续本文的阅读,使用 ABAP Development Tool 登录云端的 ABAP 编程环境。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1519

Redis 底层结构和对象介绍 超级详细!!

本文主体参考Redis设计与实现第二版 对于有时间的同学可以直接阅读原书,我这里做一个详细的总结,并结合自己的一些思考。 1.SDS Redis没有直接使用C语言传统的字符串,而是自己构建一个简单动态字符串(SDS),并将SDS作未Redis的默认字符串表示。 reids>SET msg "hello world" 会在Redis创建一个新的键值对: key是一个字符串对象,对象的底层是一个保存"msg"的SDS value也是一个字符串对象,底层同样是保存 "hello world"的SDS.

qq_39751320的博客 531

在 ABAP Cloud 中玩转 CL_ABAP_PARALLEL 并行处理:从原理到实战

ABAP并行处理框架CL_ABAP_PARALLEL解析 本文系统介绍了SAP ABAP环境中实现并行处理的CL_ABAP_PARALLEL框架。该框架通过封装异步RFC和对话进程,为开发者提供了面向对象的API,显著提升大批量数据处理的效率。 文章首先分析了ABAP环境需要并行处理的原因:传统的串行处理在面对百万级数据时效率低下。然后详细介绍了CL_ABAP_PARALLEL的设计思路,它是一个"小型线程池"式的同步并行框架,适用于批量计算场景。此外,文章重点讲解了控制并行任务的关键参

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 341

微信小程序 - 实现大文件上传分片/切片+本地选择文件上传超大文件,小程序大文件切片上传+断点续传+上传进度条+失败自动重传完整运行示例源码,支持图片、视频、文档各种文件(支持上传单个文件或批量上传)

微信小程序实现大文件上传,实现分片大文件上传,微信小程序 分片 断点续传 大文件上传,微信小程序实现大文件上传 分片上传 进度条,小程序文件分片上传,微信小程序如何上传很大的文件,在选择文件后,按指定大小将文件切割成独立的文件片,并逐片上传,uniapp 微信小程序上传大文件如何切片,微信小程序实现大文件分片上传、断点续传、秒传,解决大文件上传问题,大文件上传如何做断点续传,微信小程序wx.uploadFile,小程序上传视频,小程序上传文档,实现大文件上传(切片上传)实现大文件上传到服务器教程,支持批量多

🏆 前端领域优质创作者 1万+

Redis的五种对象类型及其底层实现

Redis对象类型简介 Redis是一种key/value型数据库,其中,每个key和value都是使用对象表示的。比如,我们执行以下代码: redis>SET message "hello redis" 其中的key是message,是一个包含了字符串"message"的对象。而value是一个包含了"hello redis"的对象。 Redis共有五种对象的类型,分别是:

聚沙成塔 积水成渊 4万+

【深度学习|多实例学习】多实例学习(Multiple Instance Learning, MIL)的起源、发展和应用,附代码(一)

【深度学习|多实例学习】多实例学习(Multiple Instance Learning, MIL)的起源、发展和应用,附代码(一)

2401_89898861的博客 1923

Redis 五种对象类型

Redis中五种类型的对象 为什么是五种类型的对象呢? 对象的类型与编码 Redis使用对象来表示数据库中的键和值,每当创建一个键值对的时候,其实我们至少创建了两个对象:键对象和值对象。 键对象其实就是字符串对象。而值对象是字符串、列表、哈希、集合、有序集合对象中的一个。 为什么创建的是对象呢? 不管是值对象和键对象,其都是用redisObject结构表示。结构中有三个属性:type、encodi...

小呼哥的博客 3232

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Redis 常见数据类型(对象类型)和应用案列

前言: 每次你在游戏中看到玩家排行榜,或者在音乐应用中浏览热门歌单,有没有想过这个排行榜是如何做到实时更新的?当然,依靠 Redis 即可做到。 在技术领域,我们经常听到「键值存储」 这个词。但在 Redis 的世界里,这只是冰山一角。Redis 的对象,不仅仅是简单的数据,它们是为各种任务量身定制的超能工具。 接下来,让我们走进 Redis 的对象世界,Redis 5.0版本就已经支持了下面的 9 种类型,分别是 :字符串对象、列表对象、哈希对象、集合对象、有序集合对象、Bitmaps 对象、HyperL

Henry313的博客 1642

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Redis的五种对象类型

基本概念 Redis是一个基于内存中的数据结构存储系统,可以用作数据库、缓存和消息中间件。Redis支持五种常见的对象类型: 字符串(String) 哈希(Hash) 列表(List) 集合(Set) 有序集合(Zset) 对象类型与编码 Redis 使用对象来存储键和值,在Redis中,每个对象是由redisObject结构表示。redisObject结构主要包含三个属性:type、encoding 和 ptr。 typedef struct redisObject { //记录对象数据类型 un

sulayman的博客 645

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Redis 水滴石穿之(三)对象类型与内存编码

redis学习笔记(二):数据类型与数据结构 一、Redis数据类型 官方命令大全网址:http://www.redis.cn/commands.html Redis 中存储数据是通过 key-value 格式存储数据的,其中 value 可以定义五种数据类型: String(字符类型) Hash(散列类型) List(列表类型) Set(集合类型) SortedSet(有序集合类型,简称zset) Redis key 简介 Redis key值是二进制安全的,这意味着可以用任何二进制序列作为key值,从形

qq_39169614的博客 1728

redis 五大对象类型及底层实现原理分析

在Redis中,并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这些对象系统也就是前面说的五大数据类型,每一种数据类型都至少用到了一种数据结构。通过这五种不同类型的对象,Redis可以在执行命令之前,根据对象的类型判断一个对象是否可以执行给定的命令,而且可以针对不同的场景,为对象设置多种不同的数据结构,从而优化对象在不同场景下的使用效率。 1、对象的类...

360linker 423

redis存储对象_Redis源码学习(16)Redis中字符串对象类型实现(上)

对于Redis中字符串对象的类型的代码主要分布在两个文件之中,其中在src/object.c文件中主要是实现了字符串数据类型的构造相关的操作,另外在src/t_string.c文件中则实现了字符串的相关命令。对于Redis中的字符串对象,可以使用三种编码类型,分别是:OBJ_ENCODING_RAWOBJ_ENCODING_INTOBJ_ENCODING_EMBSTR其中当字符串的长度较...

weixin_39706491的博客 181

通过对象属性去重_Redis常见对象类型的底层数据结构

作者:伍陆七来源:cnblogs.com/chentianming/p/13838347.htmlRedis 是一个基于内存中的数据结构存储系统,可以用作数据库、缓存和消息中间件。Redis 支持五种常见对象类型:字符串(String)、哈希(Hash)、列表(List)、集合(Set)以及有序集合(Zset),我们在日常工作中也会经常使用它们。知其然,更要知其所以然,本文将会带你读懂这...

weixin_39914049的博客 199

深入Redis原理与应用——Redis 中的对象类型

(1)redis 并未直接使用基本数据结构而是基于基本的数据结构封装了对象系统,包括了字符串对象、列表对象、哈希对象、集合对象和有序集合对象。(2)使用对象的好处是可以才不同的场景对对象设置不同的数据结构实现从而优化效率。(3)redis 对象机制使用了基于引用计数的回收机制,当程序不再使用某个对象时该对象就会自动释放,同时也通过引用计数实现了共享机制,节约内存。(4)redis 带有访问时间记录信息,当开启 maxmemory 时空转时长较大的将会优先被删除。

qq_45838559的博客 1008

(三)、Redis对象类型和底层数据结构对应关系---Redis设计与实现读书笔记

五种基本类型 Redis创建一个键值对时至少会创建两个对象,一个对象用作键值对的键(键对象),另一个对象用作键值对的值(值对象)。其中键总是一个字符串对象,值则可以是以下五种对象中的一种。 类型常量 对象的名称 type命令输出 REDIS_STRING 字符串对象 “string” REDIS_LIST 列表对象 “list” RE...

qq_34092585的博客 6199

一文读懂Redis常见对象类型的底层数据结构

你知道的越多,不知道的就越多,业余的像一棵小草!你来,我们一起精进!你不来,我和你的竞争对手一起精进!编辑:业余草cnblogs.com/chentianming/p/13838347....

xmt1139057136的专栏 764

Redis原理(二) Redis的对象类型及其内部编码

Redis 支持 5 种对象类型,而每种结构都有至少两种编码。 这样做的好处在于:一方面接口与实现分离,当需要增加或改变内部编码时,用户使用不受影响,另一方面可以根据不同的应用场景切换内部编码,提高效率。 Redis 各种对象类型支持的内部编码官网描述: Strings can be encoded as raw (normal string encoding) or int (strings ...

不能说的秘密的博客 1487
上一篇: Redis学习——1. 基础数据结构(三):字典
下一篇: go源码分享---Ascii字符包含判断
Finalowee
博客等级 码龄11年 0粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值