Redis:string类型

news2024/11/28 11:55:05

Redis:string类型

    • string命令
      • 设置与读取
        • SET
        • GET
        • MSET
        • MGET
      • 数字操作
        • INCR
        • INCRBY
        • DECR
        • DECRBY
        • INCRBYFLOAT
      • 字符串操作
        • APPEND
        • STRLEN
        • GETRANGE
        • SETRANGE
    • 内部编码
      • int
      • embstr
      • raw


Redis中,字符串string存储的是二进制,以byte为单位,输入的二进制是什么,那么存储的就是什么,string不进行编码的转化。

因此string类型可以存储非常多种类的数据,比如ASCII编码字符串,UTF-8编码字符串,int整型,甚至可以存储图片,视频音频等,因为这些都是二进制,怎么存进去的,最后就怎么解析。

当然,一般不会用string存储图片,视频音频,因为它们太大了,内存没那么多空间,只是理论上可行。


string命令

设置与读取

SET
  • 设置一个key
set key value [EX seconds | PX milliseconds] [NX | XX]

由于set默认情况下就是设置一个string,所以没有什么其它的特殊语法,此处介绍两个选项。

  • EX seconds:以秒为单位,设置超时时间
  • PX milliseconds:以毫秒为单位,设置超时时间
  • NX:如果key不存在才设置,如果存在返回nil
  • XX:如果key存在就更新,如果不存在返回nil

注意:通过XX更新后,原先的过期时间会失效,数据类型也有可能变化

示例:

在这里插入图片描述

该指令设置了一个字符串key1,内容为12345,过期时间为10 snx表示只有不存在才设置。

示例:

在这里插入图片描述

和刚才一样设置一个超时时间10 s的字符串,随后立刻通过xx选项进行更新操作。更新后发现,ttl的返回值变成了-1,这说明原先ex设置的过期时间被覆盖了。


GET
  • 获取key对应的value
get key

set一样,get的默认数据类型就是string如果value类型不是string,会发生报错


MSET
  • 一次设置多个key
mset key value [key value ...]

由于Redis基于网络通信,所以多条指令压缩为一条指令就是把多个网络请求压缩为一个,对效率提升非常明显。所以Redis提供了这样的一次设置多组键值对的指令。


MGET
  • 一次获取多个keyvalue
mget key [key ...]

示例:

在这里插入图片描述


数字操作

由于string内部还可以存储数字,所以Redis还提供了数字操作的命令。

INCR
  • 指定整数+1
incr key

返回值是字符串+1后的结果。

示例:

在这里插入图片描述

如图,设置了一个数字后,通过incr对其自增,返回了124,并且get num1的值也自增了。

在这里插入图片描述

当设置的数字值过大,此时就不会被解析为数组,而是解析为字符串。此时incr执行失败,检测到num2类型为embstrstring可以存储的最大整型为64位有符号整型,相当于C/C++中的long long

在这里插入图片描述

另外的,incr可以操作一个空值,并且将其视为数字0。此处通过get检测num3不存在,但是incr num3成功执行,结果为1


INCRBY
  • 指定整数,增加指定的值
incrby key increment

key对应的value的值就会增加increment,其余特性和incr相同。

示例:

在这里插入图片描述

注意:incrby可以增加一个负数,也就是做减法。但是不能操作浮点数,只能操作整型。


DECR
  • 指定整数-1
decr key

返回值是字符串-1后的结果。


DECRBY
  • 指定整数,减少指定的值
decrby key decrement

key对应的value的值就会减少decrement,其余特性和decr相同。

同样的,decrby也可以操作负数,此时相当于增加decrement的绝对值。


INCRBYFLOAT
  • 指定浮点数/整数,增加指定的值
incrbyfloat key increment

同样的,返回keyvalue自增后的值。

示例:

在这里插入图片描述

与整型不同,Redis没有提供DECRBYFLOAT指令,也就是说浮点数想要进行减法,只能让increment为负数。


字符串操作

回到string的本职工作,自然是要存储字符串,字符串也要提供相关的操作。

APPEND
  • value追加字符串的尾部
append key value

返回追加完成后,字符串的总长度。

在这里插入图片描述

如图完成了一个字符串的追加。

在这里插入图片描述

同样的,如果原先key不存在,则视为一个空串,直接追加


STRLEN
  • 获取字符串的长度
strlen key

返回字符串的长度,以字节为单位。

如果遇到中文:

在这里插入图片描述

此时根据UTF-8编码,一个中文占3 byte,所以两个中文的长度是6。如果再输出这个中文字符串,会得到一个乱码。此处\x是一个转义字符,表示一个十六进制数字。也就是说\xe4整体是一个十六进制的数字,占一个字节。

其实这个十六进制数字,就是汉字的编码,比如\xe4 \xdb \xa0就是汉字"你"。如果想要让Redis支持输出中文,在启动时要加入--raw选项:

在这里插入图片描述

这样就可以正常输出中文了,但是要注意,如果key不存在,原本是输出nil,但是会被转化为一个空行。


GETRANGE
  • 返回字符串指定范围的字串
getrange key start end

获取的字串是下标范围[start, end]的闭区间,下标从0开始。而且支持使用负数,最后一个字符串的负数编码为-1

示例:

在这里插入图片描述

第一次截取,区间为[0, 5],由于是闭区间,所以有6个字符。
第二次截取,区间为[0, -1]-1就是最后一个字符,又是闭区间,所以输出整个字符串。

在这里插入图片描述

如果存储汉字,此时依然以字节解析,而不是以字符为单位。

如果开启了--raw选项:

在这里插入图片描述

此时汉字"好"截取了一半,但是不输出,只有"你"被完整拆分下来,才能解析。


SETRANGE
  • 修改指定范围内的字符串
setrange key offset value

从下标offset位置开始覆盖,字符串替换为value,返回替换后的字符串长度。

示例:

在这里插入图片描述

此处从下标5,也就是字符w开始覆盖,往后三个字符替换为cpp,而ld不变。

在这里插入图片描述

如果字符串覆盖后超出原先的长度,此时字符串就会变长。

对于不存在的key

在这里插入图片描述

如果在空的key后面修改字符串,此时offset之前的所有字节自动初始化为\x00offset之后的内容正常覆盖。

总结:

命令执行效果
set key value[key value...]设置key的值为value
get key获取key的值
del key[key...]删除指定的key
mset key value[key value ...]批量设置指定的keyvalue
mget key[key...]批量获取key的值
incr key指定的整数的值+1
decr key指定的整数的值-1
incrby key n指定的整数的值+n
decrby key n指定的整数的值-n
incrbyfloat key n指定的整数/浮点数的值+n
append key value指定的字符串追加value
strlen key获取指定字符串的长度
setrange key offset value覆盖指定字符串offset开始的部分值
getrange key start end获取指定字符串startend的部分值

内部编码

Redis 中,string 数据类型的底层实现有三种编码方式:intembstrraw。每种编码方式有其特定的使用场景和实现细节,以优化内存使用和性能表现。

int

当一个字符串的值可以被解析为整数(有符号的 64 位整数范围内)时,Redis 会将其存储为整数

int 编码使用 8 byte 来存储整数值。这种方式的优势在于节省存储空间并提高处理速度,因为整数操作比字符串操作更高效。

embstr

用于存储长度小于或等于 39 byte 的字符串。

embstr 编码是为了优化小字符串的内存分配和管理而设计的。embstr 的实现将字符串对象的结构和实际字符串数据放在一起,这样在创建时只需要一次内存分配。其包含一个 SDSSimple Dynamic String)结构,用于管理字符串的长度等信息。

这种方式减少了内存碎片,提高了缓存的局部性,并使得创建和销毁字符串对象的速度更快。

raw

用于存储长度大于 39 byte 的字符串。

raw 编码是传统方式,分开存储字符串对象和字符串数据。与 embstr 不同,raw 编码需要两次内存分配:一次用于存储字符串对象的基本信息,比如长度,另一次用于实际的字符串数据。

这种方式允许更灵活的字符串管理,适合处理较大字符串的场景。在需要对字符串进行修改时,raw 编码也能更好地管理内存。


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

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

相关文章

ICPC-day1(NTT)

NTT经典例题 CCPC-Winter-Camp-day6-A——NTT经典例题 对于上面格式,如果想求出每个i的值可以使用卷积求出,因为阶乘j和阶乘i-j相乘的值为(i(i-j))i 补充一个二次剩余定理 P5491 【模板】二次剩余 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) //#in…

【MySQL】DML数据操作语句和基本的DQL语句

目录 一、Mysql对数据的增删改 1. 增加数据 2. 修改数据(UPDATE语句) 3. 删除 3.1 delete、truncate、drop区别 二、DQL语言(重点) 1. 单表查询 1.1 最简单的查询 1.2 从表中获取数据 1.3 字段名起别名 1.4 添加字段 1…

[20231103消息] 大模型商业化模式详解:烧钱之后如何挣钱?

距ChatGPT3.5发布已近一年,大模型狂热开始逐步降温:GPU禁运及长期烧钱的事实,让国内的大模型企业,不得不加速商业化考量。 目前,大模型的B端应用已经出现各种定价方法,包括按照时间段收费、按调用量收费以…

class 030 异或运算的骚操作

这篇文章是看了“左程云”老师在b站上的讲解之后写的, 自己感觉已经能理解了, 所以就将整个过程写下来了。 这个是“左程云”老师个人空间的b站的链接, 数据结构与算法讲的很好很好, 希望大家可以多多支持左程云老师, 真心推荐. https://space.bilibili.com/8888480?spm_id_f…

Java中Map和Set详细介绍,哈希桶的实现

大家好呀,前一节我们接触了二叉搜索树,那么紧接着,我们要学习一种十分重要而且也是我们在初阶数据结构中接触的最后一种数据结构—Map和Set,本篇博客将会详细介绍两种数据结构,并且针对哈希表底层实现一个哈希桶&#…

基于元神操作系统实现NTFS文件操作(三)

1. 背景 本文主要介绍DBR的读取和解析,并提供了基于元神操作系统的实现代码。由于解析DBR的目的是定位到NTFS磁盘分区的元文件$Root进行文件操作,所以只解析了少量的部分,其它部分可以参考相关文档进行理解。 DBR存在于磁盘分区的第一个扇区…

《数据结构》--链表【包含跳表概念】

不知道大家对链表熟悉还是陌生,我们秉着基础不牢,地动山摇的原则,会一点点的介绍链表的,毕竟链表涉及的链式存储也很重要的。在这之前,我们认识过顺序存储的顺序表,它其实就是一个特殊的数组。那链表到底是…

树莓派 AI 摄像头(Raspberry Pi AI Camera)教程

系列文章目录 前言 人们使用 Raspberry Pi 产品构建人工智能项目的时间几乎与我们生产 Raspberry Pi 的时间一样长。随着我们发布功能越来越强大的设备,我们能够支持的原生应用范围也在不断扩大;但无论哪一代产品,总会有一些工作负载需要外部…

SpringBoot介绍及整合Mybatis Plus

目录 SpringBoot背景及特点 SpringBoot整合Mybatis Plus SpringBoot背景及特点 SpringBoot的设计目是抛弃之前Spring、SpringMVC繁杂的配置过程,简化开发过程。之前的Spring框架需要大量的手动配置,包括XML配置文件或Java配置类,配置过程繁…

深入理解 Git 一个开发者的必备工具

深入理解 Git 一个开发者的必备工具 演示地址 演示地址 获取更多 获取更多 在现代软件开发中,版本控制系统扮演着至关重要的角色。其中,Git 是最流行的选择之一。无论你是新手还是有经验的开发者,了解 Git 的基本概念和使用方法都能大大提…

YOLO v11实时目标检测3:训练数据集格式说明

一、Yolov11简介 YOLOv11 是 YOLO 系列的最新版本,它不仅在目标检测方面表现出色,还引入了对象分割和多目标跟踪的功能。本文将介绍如何使用 YOLOv11 进行人流统计、车流统计以及跟踪的实际应用。 二、Yolo v11训练数据集格式说明 2.1 数据组织&#…

SAT分离轴定理的c++/python实现

分离轴定理的c/python实现 现在要对BEV模型检查出来的车辆做NMS,把3d框的平面属性获取到后,配合旋转角度投影到地面就是2D图形。 开始碰撞检测,判断是否重叠,保留置信度高的框就行。 原理 分离轴定理(Separating A…

(C语言贪吃蛇)11.贪吃蛇方向移动和刷新界面一起实现面临的问题

目录 前言 实现效果 支持方向变换 修改默认效果 如何修改 总结 前言 我们上节实现了不需要按下右键就可以是贪吃蛇自发的向右移动,本节我们主要来解决贪吃蛇方向移动和刷新界面所遇到的问题。 实现效果 上图是我们希望实现的效果,我们可以自发地控…

Go 进阶:Go + gin 极速搭建 EcommerceSys 电商系统

Go 进阶:Go + gin 极速搭建 EcommerceSys 电商系统 前言 本章节适合有一定基础的 Golang 初学者,通过简单的项目实践来加深对 Golang 的基本语法和 Web 开发的理解。 具体请联系作者 项目结构 项目流程图 技术栈 项目结构 项目路由 4. 项目模型 项目初始化 初始化项目文…

归并排序【C语言版-笔记】

目录 一、概念二、排序流程理解三、代码实现3.1主调函数3.2 merge函数 四、性能分析 一、概念 归并是一种算法思想,是将两个或两个一上的有序表合并成一个长度较大的有序表。若一开始无序表中有n个元素,可以把n个元素看作n个有序表,把它们两…

Java中数据转换以及字符串的“+”操作

隐式转换(自动类型转换) 较小范围的数据类型转成较大范围的数据类型 强制转换(显式转换) 将数据范围大的数据类型转换为数据范围小的数据类型 基本数据类型之间的转换 当需要将一个较大的数据类型(如float或double…

Linux:进程控制(一)

目录 一、写时拷贝 1.创建子进程 2.写时拷贝 二、进程终止 1.函数返回值 2.错误码 3.异常退出 4.exit 5._exit 一、写时拷贝 父子进程,代码共享,不作写入操作时,数据也是共享的,当任意一方试图写入,便通过写时拷…

影刀RPA实战:excel相关图片操作指令解

1.实战目标 excel是工作中必不缺少的工具,今天我们继续使用影刀RPA来实现excel操作的便利性,让影刀自动化来帮我们完成工作。 2.单元格填充图片 2.1 指令说明 功能:向 Excel 单元格插入本地图片或网络图片,支持Office和WPS&…

波阻抗,是电场矢量的模值/磁场矢量的模值

波阻抗是电场复振幅除以磁场复振幅,最后只与介质με有关 所以磁场可用电场强度表示(利用波阻抗) 问题,复振幅是矢量,波阻抗的定义是复振幅的比值?答案:不是,很明显,波阻…

Web3 游戏周报(9.22 - 9.28)

回顾上周的区块链游戏概况,查看 Footprint Analytics 与 ABGA 最新发布的数据报告。 【9.22-9.28】Web3 游戏行业动态: Axie Infinity 将 Fortune Slips 的冷却时间缩短至 24 小时,从而提高玩家的收入。 Web3 游戏开发商 Darkbright Studios…