Redis:string类型

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.rhkb.cn/news/438690.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【HTML+CSS】留言板plus实现全过程

创建一个具有动态留言的简约风格留言板 在本教程中,我们将学习如何创建一个简约风格的留言板,它具备动态留言显示和一些基本动画效果。这个留言板将使用HTML和CSS构建,最终实现一个既美观又实用的界面。 准备工作 首先,确保你的…

面试速通宝典——7

150. 数据库连接池的作用 数据库连接池的作用包括以下几个方面: 资源重用:连接池允许多个客户端共享有限的数据库连接,减少频繁创建和销毁连接的开销,从而提高资源的利用率。 统一的连接管理:连接池集中管理数据库连…

Stream流的终结方法(一)

1.Stream流的终结方法 2.forEach 对于forEach方法,用来遍历stream流中的所有数据 package com.njau.d10_my_stream;import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.function.Consumer; import java.util…

Swagger配置且添加小锁(asp.net)(笔记)

此博客是基于 asp.net core web api(.net core3.1)框架进行操作的。 一、安装Swagger包 在 NuGet程序包管理中安装下面的两个包: swagger包:Swashbuckle.AspNetCore swagger包过滤器:Swashbuckle.AspNetCore.Filters 二、swagger注册 在…

戴尔PowerEdge R840服务器亮黄灯 不开机

最近接修到一台东莞用户的DELL PowerEdge R840 服务器因为意外断电后,无法正常开机的问题, 大概故障现象是 插上电源线 按卡机按钮无响应,无法开机,无显示输出,工程师到现场检修,经过idrac中日志分析&#…

K8S真正删除pod

假设k8s的某个命名空间如(default)有一个运行nginx 的pod,而这个pod是以kubectl run pod命令运行的 1.错误示范: kubectl delete pod nginx-2756690723-hllbp 结果显示这个pod 是删除了,但k8s很快自动创建新的pod,但是…

C(九)while循环 --- 军训匕首操情景

匕首操,oi~oi~oi~~~~~ 接下来的几篇推文,杰哥记录的是三大循环结构的运行流程及其变式。 本篇的主角是while循环。👉 目录: while循环 的组成、运行流程及其变式关键字break 和 continue 在while 循环中的作用while 循环的嵌套题目…

基于SSM的坚果金融投资管理系统、坚果金融投资管理平台的设计与开发、智慧金融投资管理系统的设计与实现、坚果金融投资管理系统的设计与应用研究(源码+定制+开发)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

我为什么决定关闭ChatGPT的记忆功能?

你好,我是三桥君 几个月前,ChatGPT宣布即将推出一项名为“记忆功能”的新特性,英文名叫memory。 这个功能听起来相当吸引人,宣传口号是让GPT更加了解用户,仿佛是要为我们每个人量身打造一个专属的AI助手。 在记忆功…

vue结合element-ui实现列表拖拽变化位置,点击拖动图标拖动整个列表元素,使用tsx格式编写

先来看下需要实现的效果 当鼠标放在左侧图标上时,可以拖动整个列表元素,调整顺序 思路介绍 使用draggable可以设置元素可拖动,然后分别设置三个事件处理函数,监听onDragstart、onDragover、onDragend三个事件 注意&#xff1a…

青少年科普教学系统小程序的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,基础数据管理,作品信息管理,通知公告管理,视频信息管理,系统管理 微信端账号功能包括:系统首页,视频信息&…

html+css+js实现Collapse 折叠面板

实现效果&#xff1a; HTML部分 <div class"collapse"><ul><li><div class"header"><h4>一致性 Consistency</h4><span class"iconfont icon-jiantou"></span></div><div class"…

【unity进阶知识6】Resources的使用,如何封装一个Resources资源管理器

文章目录 一、Unity资源加载的几种方式1、Inspector窗口拖拽2、Resources3、AssetBundle4、Addressables&#xff08;可寻址资源系统&#xff09;5、AssetDatabase 二、准备三、同步加载Resources资源1、Resources.Load同步加载单个资源1.1、基本加载1.2、加载指定类型的资源1.…

泛型编程--模板【C++提升】(特化、类属、参数包的展开、static、模板机制、重载......你想知道的全都有)

更多精彩内容..... &#x1f389;❤️播主の主页✨&#x1f618; Stark、-CSDN博客 本文所在专栏&#xff1a; C系列语法知识_Stark、的博客-CSDN博客 其它专栏&#xff1a; 数据结构与算法_Stark、的博客-CSDN博客 C系列项目实战_Stark、的博客-CSDN博客 座右铭&#xff1a;梦…

国外电商系统开发-运维系统批量添加服务器

您可以把您准备的txt文件&#xff0c;安装要求的格式&#xff0c;复制粘贴到里面就可以了。注意格式&#xff01; 如果是“#” 开头的&#xff0c;则表示注释&#xff01;

网盘能否作为FTP替代产品?企业该如何进行FTP国产化替代?

近年来&#xff0c;信创的概念引入和高效实践落地让更多的行业企业自发性地进行国产化替代&#xff0c;目前信创国产化替代还多发生在操作系统和应用层面&#xff0c;软件工具等目前还在下一阶段规划&#xff0c;但很多企业未雨绸缪&#xff0c;已经在做调研和尝试。 FTP作为世…

一些 Go Web 开发笔记

原文&#xff1a;Julia Evans - 2024.09.27 在过去的几周里&#xff0c;我花了很多时间在用 Go 开发一个网站&#xff0c;虽然不知道它最终会不会发布&#xff0c;但在这个过程中我学到了一些东西&#xff0c;想记录下来。以下是我的一些收获&#xff1a; Go 1.22 现在有了更…

github项目——gpt-pilot自动创建应用

今天扯一扯在github上看到的一个项目gpt-pilot&#xff0c;声称“首个AI程序员”。本来打算玩一下&#xff0c;结果需要配置大语言模型的API&#xff0c;并且只支持OpenAI和claude&#xff08;Qwen呢&#xff09;。有没有玩过的老哥说一下好不好用&#xff01;&#xff01;(对了…

【重学 MySQL】五十四、整型数据类型

【重学 MySQL】五十四、整型数据类型 整型类型TINYINTSMALLINTMEDIUMINTINT&#xff08;或INTEGER&#xff09;BIGINT 可选属性UNSIGNEDZEROFILL显示宽度&#xff08;M&#xff09;AUTO_INCREMENT注意事项 适合场景TINYINTSMALLINTMEDIUMINTINT&#xff08;或INTEGER&#xff0…

Django 后端数据传给前端

Step 1 创建一个数据库 Step 2 在Django中点击数据库连接 Step 3 连接成功 Step 4 settings中找DATABASES Step 5 将数据库挂上面 将数据库引擎和数据库名改成自己的 Step 6 在_init_.py中加上数据库的支持语句 import pymysql pymysql.install_as_MySQLdb() Step7 简单创建两…