Redis之字符串类型

redis flags 标志 💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨。 阅读详情

应用场景:

      缓存功能, 共享session,计数

底层结构

    重新定义了C语言中的字符串

    字符串的实现代码在sds.h文件中。

SDS:简单动态字符串

在Redis3.2之前的版本中,是如下存储字符串的

/*
 * 类型别名,用于指向 sdshdr 的 buf 属性
 */
typedef char *sds;
/*
 * 保存字符串对象的结构
 */
struct sdshdr { 
    
    int len;  // buf 中已占用空间的长度
    
    int free;  // buf 中剩余可用空间的长度
    
    char buf[]; // 数据空间
};

示意图:

 

 

而在新版本中Redis是如下存储的。 

   Redis官网GitHub地址

struct __attribute__ ((__packed__)) sdshdr5 {
    unsigned char flags; /* 3 lsb of type, and 5 msb of string length */ // 类型
    char buf[];         // 实际存储数据
};
struct __attribute__ ((__packed__)) 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[];
};
struct __attribute__ ((__packed__)) sdshdr16 {
    uint16_t len; /* used */
    uint16_t alloc; /* excluding the header and null terminator */
    unsigned char flags; /* 3 lsb of type, 5 unused bits */
    char buf[];
};
struct __attribute__ ((__packed__)) sdshdr32 {
    uint32_t len; /* used */
    uint32_t alloc; /* excluding the header and null terminator */
    unsigned char flags; /* 3 lsb of type, 5 unused bits */
    char buf[];
};
struct __attribute__ ((__packed__)) sdshdr64 {
    uint64_t len; /* used */
    uint64_t alloc; /* excluding the header and null terminator */
    unsigned char flags; /* 3 lsb of type, 5 unused bits */
    char buf[];
};

示意图:

 

相对于旧版本,只是添加了几种类型,更好的优化了存储,节省空间。

 

其中 len 是字符串长度。 alloc 是分配的内存。 flags 是当前结构体类型。  buf[] 用来存储具体的数据

Question1: 为什么sdshdr5没有len,alloc这两个属性?

       答:由于sdshdr5存储的数据量小,没有必要有那两个属性,如果加上,那两个属性的占用空间比字符串本身还要大,所以没有必要。范围大小为2^5-1    默认不使用,长度固定,无法动态扩容

Question2:为什么不直接采取C语言的字符数组进行存储,那样不是占用内存更小吗?(不用存储长度,类型,占用内存..)

   答:①为了二进制安全。  所谓二进制安全,是 C 语言中字符串结束的标志符为  '\0' , 而在实际的生产中,后端语言可能将对象或者其他类型序列化成一个字符串存储在 Redis 中, 中间可能会出现 '\0' ,如果采用C语言的方式直接存储,会导致字符串异常结束。

    ②len这个变量就很好的解决了这个问题。 '\0' 也会当做一个字符进行存储,len存储整个字符串的长度。而且在Redis中查看字符串长度时,由于 len 直接存储了字符串长度,不用遍历整个字符数组,时间复杂度为O(1)

Question3:flags存在的意义?

   flags占用一个字节,前三位是用来 判断当前字符串的类型,分配不同类型的结构体,在当前结构体不再满足字符串存储的需求时,向更大内存的结构体进行扩展,更好的节省内存

      后五位则表示未使用的内存大小

alloc 属性记录了自己的总分配空间

 

总的来说,Redis自创的字符串结构体有如下优点:

     1.二进制安全

     2.查看字符串的时间复杂度为O(1)

    3.预分配内存,减少修改字符串带来的内存重分配次数,每次扩容都会额外预留一些空间方便下次扩容:

    4.不会造成缓冲区溢出,动态分配内存

    5.兼容部分C语言操作字符串函数

 

操作字符串命令:

1.set命令:设置键值

2.get命令:获取某个键的值

3.incr: 对整型自增1

4.decr: 对整型自减1

5.incrby : 对整型做加法

6.decrby:对整型做减法

7.mget:批量获取键

8.mset:批量设置键(能使用批量设置时,尽量使用批量设置,这样只需发送一次命令。减少传输)

9.append:字符串连接

10.strlen:查看字符串长度

11.incrbyfloat:浮点型自增

12.getrange :获取字符串某个区间的值

13.setrange:设置字符串某个下标的值

存储用户数据

    1.使用后端语言将用户id作为key,数据序列化存储在redis中 。

优点:占用内存小

缺点:不方便修改

 

   2.使用用户id和属性作为key,存储值

优点:直观,方便修改

缺点:占用内存大,用户数据分散

Redis字符串类型和哈希类型讲解 本节介绍Redis数据类型中字符串类型和哈希类型的常用命令、内部编码及常用场景 阅读详情

相关推荐

短视频mssdk中get_token协议逆向与加密流程深度解析

本文深度解析了短视频mssdk中get_token协议的逆向分析与加密流程。通过抓包、Frida Hook、静态分析等手段,详细拆解了协议数据的Protobuf结构、设备信息采集来源,并重点剖析了其核心加密链路:zlib压缩、自定义TEA算法与AES-CBC加密,最终实现完整的协议模拟。

flower的专栏 555

Redis命令的flags的选项:

O : 客户端是 MONITOR 模式下的附属节点(slave) S : 客户端是一般模式下(normal)的附属节点 M : 客户端是主节点(master) x : 客户端正在执行事务 b : 客户端正在等待阻塞事件 i : 客户端正在等待 VM I/O 操作(已废弃) d : 一个受监视(watched)的键已被修改, EXEC 命令将失败 c : 在将回复完整地写出之后,关闭链接 u : 客户端未被阻塞(unblocked) A : 尽可能快地关闭连接 N : 未设置任何 flag

u012632105的博客 628

LTE信令流程实战:从Attach到Service Request的完整解析(附常见问题排查)

本文深入解析LTE信令流程中的Attach和Service Request关键环节,提供从基础原理到实战排查的完整指南。涵盖鉴权、承载建立等核心步骤,分析常见故障模式及优化方案,并附赠信令跟踪工具使用技巧,助力通信工程师提升网络运维效率。

alpha的博客 319

Redis入门完整教程:故障转移

Redis集群自身实现了高可用。高可用首先需要解决集群部分失败的场 景:当集群内少量节点出现故障时通过自动故障转移保证集群可以正常对外 提供服务。本节介绍故障转移的细节,分析故障发现和替换故障节点的过 程。 10.6.1 故障发现 当集群内某个节点出现问题时,需要通过一种健壮的方式保证识别出节 点是否发生了故障。Redis集群内节点通过ping/pong消息实现节点通信,消 息不但可以传播节点槽信息,还可以传播其他状态如:主从状态、节点故障 等。因此故障发现也是通过消息传播机制实现的,主要环节包括:主观下

Lee达森的博客 2632

使用 Python 获取实时港股行情数据

在本教程中,你将学习如何通过 Infoway API 获取港股实时行情数据,具体以腾讯控股(0700.HK)和汇丰控股(0005.HK)为例,使用 Python 进行数据请求和解析。

kk_stoper的博客 1515

rk3568 OpenHarmony4.0如何使用中文输入法

问题:rk3568开发板 OpenHarmony4.0release系统自带输入法kikaInput软件只有英文输入,不含中文输入,不方便。本文基于rk3568开发板 OpenHarmony4.0release移植了laval社区发布的开发者手机中的搜狗输入法(测试版),实现了中文输入,为OpenHarmony4.0release的其他开发板中文输入提供参考。

Devlin_的博客 2912

Redis运维和开发学习笔记(4) Redis参数意义

Redis运维和开发学习笔记(4) Redis参数意义 文章目录Redis运维和开发学习笔记(4) Redis参数意义参数意义 参数意义 Client连接 问题 id=567800790 addr=10.18.17.217:37310 fd=1572 name= age=2039114 idle=2034860 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 q...

csdn_kou的博客 344

Keil5编译报错:ARM Compiler Version 5缺失的完整解决方案

本文提供了Keil5编译报错“ARM Compiler Version 5缺失”的完整解决方案。详细介绍了手动安装ARM Compiler Version 5的步骤,包括下载安装包、配置编译器路径及常见问题排查,帮助开发者快速恢复老项目的编译环境。

bb456的博客 945

Redis日常运维

作为一名资深运维工程师,了解 Redis 的不同架构模式及其优缺点是非常重要的。此外,监控 Redis 的关键指标也是确保其稳定运行的关键。以下是对这些问题的详细解答。

happy_king_zi的博客 1503

Cesium中级开发教程之五十二:气泡弹窗

支持多种交互方式触发气泡弹窗显示,如鼠标悬停、点击地图上的特定元素(像实体、标注、模型等)。例如,当用户鼠标悬停在一个表示城市的点上时,弹出显示该城市名称、人口等信息的气泡。:依据特定的数据条件或业务逻辑触发。比如,当某个区域的气象数据达到一定阈值时,自动弹出显示相关气象预警信息的气泡。

664

UNet 改进(39):结合残差连接与CBAM注意力机制的unet模型

本文提出了一种改进的UNet架构,通过融合残差连接和CBAM注意力机制来增强医学图像分割性能。该网络保留UNet的U形结构,但将基础模块替换为ResidualBlock和CBAM的组合:残差块通过快捷连接解决梯度消失问题,CBAM模块结合通道和空间注意力机制突出重要特征。整体架构采用编码器-解码器设计,包含5个下采样和上采样阶段,通过跳跃连接融合多尺度特征。实验表明,这种改进显著提升了原始UNet的性能,特别适用于需要精细边界的医学图像分割任务。

2401_82355416的博客 1016

Redis 中 String 字符串类型详解

所有键都是字符串:在 Redis 里,所有的键(key)都是字符串类型。其他数据结构的基础:列表、集合等其他数据结构的元素也都是字符串类型。值的多样性:字符串类型的值可以是普通的文本、JSON 或 XML 格式的字符串、数字(整数或浮点数),甚至是二进制数据(如图片、音频、视频等)。最大长度限制:一个字符串的最大长度不能超过 512 MB。字符集编码:Redis 内部存储字符串时,完全按照二进制流的形式保存,不处理字符集编码问题。客户端传入的命令是什么字符集编码,就存储什么字符集编码。

Y_1215的博客 1579

微信小程序视频内容服务类目审核不过?绕过审核的两种思路!

虽然不推荐绕过官方审核,但在实际项目中,总有一些特殊情况:比如,最近开发的小程序涉及视频播放,提交审核时,被官方要求补充“教育服务 - 在线视频课程”类目。但我们的内容只是车辆使用介绍,并非教育课程,无法提供相应资质。该怎么办?很多开发者发现,小程序开发不是最难的,审核才是最难的。 微信为了规避法律风险,要求某些功能必须提供资质。例如:然而,并不是所有公司都能轻松申请到这些资质,甚至有些资质根本不适用于我们的业务,导致审核卡住,无法上线。就像我遇到的这个问题,官方要求我们补充“在线视频课程”类目,但实际业务

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 3241

redis字符串类型

而在Redis中,当SDS API需要对SDS进行修改时,API会先检查SDS的空间是否满足修改所需的要求,如果不满足的话,API会自动将SDS的空间扩展至执行修改所需的大小,然后才执行实际的修改操作,所以使用SDS既不需要手动修改SDS的空间大小,也不会出现前面所说的缓冲区溢出问题。C字符串并不记录自身的长度信息,所以为了获取一个C字符串的长度,程序必须遍历整个字符串,对遇到的每个字符进行计数,知道遇到代表字符串结尾的空字符为止,这个操作的复杂度为O(N)。比如jpg图片或者序列化的对象。

qqqwx_111115的博客 1727

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

redis 字符串类型

本文和大家分享的主要是redis中字符串相关内容,一起来看看吧,希望对大家学习redis有所帮助。   字符串类型是最基本的数据类型,能够存储所有的字符串,包括二进制数据 json 化对象, 一个字符串类型的键的数据的最大容量是 512 MB   字符串类型是其他几种类型的基础,如列表类型是以列表的形式组织字符串,集合类型是以集合的形式组织字符串 获得符合规则的键名列表 keys pa

qq_32506555的博客 447

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

redis的字符串类型

然而,在某些情况下(例如,每天午夜),你可能希望获取当前计数器的值并将其重置为零,以便开始计算下一时段的事件数量。覆盖存储在 key 处的字符串的一部分,从指定下标开始, 对于要更改的整个value 的长度, 将后面对应长度的字节进行覆盖。如果存储的值不是字符串,则会返回错误,因为仅处理字符串值。返回所有指定 key 的 value. 对于每个不包含 string or 不存在的 key, 以 nil 返回.将给定 key 值 设为 value, 并返回 key 的旧值。将存储的数字 增加指定数字。

chenhuyu7的博客 615

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

redis的基本类型之字符串

Redis字符串是最基础的数据类型,文章介绍了字符串的核心命令:SET、GET、MSET/MGET以及计数命令(INCR/DECR等)。在这之后还介绍了字符串类型的内部编码,最后介绍了redis字符串在实际开发中的一些场景。

2302_81805546的博客 1285

Redis字符串类型详解

字符串类型是Redis中最基本的数据类型,它能存储任何形式的字符串,包括二进制数据。可以用其存储用户的邮箱、JSON化的对象甚至是一张图片。一个字符串类型键允许存储的数据的最大容量是512MB。......

贾欣晓的博客 645

redis中字符串类型

字符串类型是Redis中最基本的数据类型,它能存储任何形式的字符串,包括二进制数据。你可以用其存储用户的手机号,邮箱,Json化后的对象甚至是图片。在ifuchuan类型中键允许存储的数据的最大容量是512MB。 字符串类型是其它4种数据类型的基础,其他数据类型和字符串类型的差别从某种角度来说只是组织字符串的形式不同。例如,列表类型是以列表的形式组织字符串,集合类型是以集合的形式组织字符串。基本命

lizhao007 391

【Redis】String字符串类型

Redis 字符串类型 一、Redis 的类型 值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型 二、Redis 字符串 (Nodejs 中用的最多) Redis 字符串数据类型的相关命令用于管理 redis 字符串值 基本语法: 查看所有的 key: keys * 普通设置: set key value 设置并加过期时间: set key value EX 30 表示 30 秒后过期 获取数据: g

Milk~每天分享一点点,技术进步一点点 167

Redis数据类型之字符串类型

Redis内部支持的各种数据类型及数据类型支持的操作进行逐个说明,一方面加深一下自己的印象,另一方面也是给需要的人一个直观的了解。那么我们开始吧。 在Redis中,key都是字符串,但是value可以是多种类型,主要有以下几种类型:字符串、列表、集合、有序集合和哈希表。本文先从最常见的也是最常用的字符串数据类型开始讲起。 Redis支持的字符串操作大约有20种,下面是一个简单的概述: ...

ASP.NET 377

Redis字符串类型

本文简要介绍redis字符串类型的命令、内部编码和使用场景

qq_61081855的博客 792

Redis 中一个字符串类型的值能存储最大容量是多少?

作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬。

smart_an的专栏 1463

redis 之三: Redis字符串类型的操作

title: redis 之三: Redis字符串类型的操作 tags: [redis] categories: redis set key value [ex 秒数] / [px 毫秒数] [nx] /[xx] 如: set a 1 ex 10 , 10秒有效 Set a 1 px 9000 , 9秒有效 注: 如果ex,px同时写,以后面的有效期为准 如 set a 1 ex 100 px 9000, 实际有效期是9000毫秒 nx: 表示key不存在时,执行操作 xx: 表示key存在.

liuzhupeng的专栏 136

五、Redis五种类型 - 字符串类型

1.介绍: 字符串类型是Redis中最基本的数据类型,可以存储任何形式的字符串数据,最大容量是512MB。 key 和 value 都是区分大小写的。 2.命令介绍 (1).赋值: set key value (2).取值: get key (3).递增数字: incr key 默认的初始值是 1 3.实践 (1).文章访问量统计 1 名为"post:文章ID...

weixin_30552635的博客 130
上一篇: LeetCode 1589. 所有排列中的最大和
下一篇: Redis之哈希类型
error0318
博客等级 码龄9年 57粉丝 515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值