Redis -- String 字符串, 计数命令,字符串操作

news2024/11/17 13:34:57

"学如逆水行舟,不进则退。"


目录

Redis的String字符串

常见命令 

set

get

mget

mset 

setnx

setex

psetex

计数命令 

incr

incrby

decr

decrby

incrbyfloat

字符串操作

append

getrange

setrange

strlen

小结

string内部编码


Redis的String字符串

        redis中所有的key都是字符串的,但是value是存在各种差异的。Redis中的字符串直接就是按照二进制的方式进行存储的,不会做任何编码转换,存的是啥取得就是啥。对于value来说,不仅仅可以存储文本数据,还可以存储整数,普通文本,Json,xml,还有一些二进制文件,例如图片音频等,但是redis对string类型限制了大小,最高位512MB。

        下面是字符串类型的value的不同形式:

 

        区别于MySQL,MySQL有一个默认的字符集,为拉丁文的字符集,插入中文机会检测插入失败。但是redis是直接存储的二进制,因此redis遇到乱码的概率就小的多。

常见命令 

set

        将 string 类型的 value 设置到 key 中。如果 key 之前存在,则覆盖,无论原来的数据类型是什么。之前关于此 key 的 TTL 也全部失效。

         除了最常见的set key value之外,我们还可以在set的时候设置存活时间,类似于expire的操作。

语法set key value [expiration EX seconds | PX milliseconds] [NX|XX]

        相当于set key value和expire key 10这两步的操作。EX设置的相当于秒级,PX设置的表示毫秒级。NX表示如果key不存在才设置,XX表示key存在,则不设置,并且返回nil(相当于更新操作

        [ ]表示一个独立的单元,相当于一个可有可无的选项,[ ]中的|表示或者的意思,即使是多个|也只能选择其中的一个。[ ]和[ ]之间是可以同时存在的。

        还有一个小技巧就是在redis-cli输入flushAll,这个操作就相当于mysql里面的drop database。

演示 :

         -2表示当前key已经被删除了

        设置NX参数:

        nil表明key1已经存在无法设置

        设置XX参数:

        OK表示覆盖key1成功

get

        get key来获取对应key的value,但是只能获取对应value为字符串类型的key。

        例如 :

        创建一个列表类型的value,然后尝试使用get去获取,发现报错。 

mget

        一次性get多个key 的value。对比与get操作,mget可以减少网络传输的次数,可以节省网络资源。

        时间复杂度为O (N),n是key的数量

         下面是一个简单的时间消耗对比:

        但是由于其是单一线程模型,同一个请求的任务的执行时间不宜过长。学会使用批量操作,可以有效提高业务处理效率,但是要注意,每次批量操作所发送的键的数量也不是无节制的,否则可能造成单一命令执行时间过长,导致 Redis 阻塞。

语法:mget key [key1 key2 key3 ... ]

        多个key之间使用空格间隔开

演示:

        设置三个key-value 

        使用mget获取三个key-value

mset 

        一次性可以设置多个key-value,其用法和mget类型。

        时间复杂度O(N)

 语法:mset key value [ key2 value2 key3 value3 ... ]

         多个key-value之间使用空格间隔

        返回值为ok。

演示

setnx

        set if not exists

        功能类似于set key value ex,也就是说,设置的这个key已经存在,那么就会设置失败并且返回一个integer0。

语法:setnx key value 

演示

setex

        设置一个key-value,并且向此key value增加一个存活时间

语法:setex  key value seconds value

        解释:second表示秒级,代表你要输入的秒数

演示:

        设置一个存活时间为10秒的key value

           -2表示这个key已经不存在了


        既然有秒级,那么必然有毫秒级,毫秒级别的指令为psetex


psetex

        设置一个key-value,并且向此key value增加一个存活时间(毫秒级别)

语法:psetex key value milliseconds value

        解释:second表示毫秒级,代表你要输入的毫秒数

演示

        设置一个存活时间为1000ms的key value.


计数命令 

  • incr:针对数字字符串的value 进行 +1 操作
  • incrby:针对数字字符串的value进行 +n操作
  • decr:针对数字字符串的value进行 -1操作
  • decrby:针对数字字符串的value进行 -n操作 
  • incrbyfloat:针对浮点数进行处理

        这些命令的对象的value必须是数字类型的字符串例如 "111",但是不能是"111好" 

incr

        设置一个value为10的key,然后对其进行incr操作:

        如果设置一个非整数字符串,然后对其进行incr操作:

        此时就会发生错误:ERR value is not an integer or out of range

        说明,这个value为非数字字符串,或者超出了范围(64位),上述例子为超出了范围。

        这里的范围可以理解为java中的long类型

注意

        如果对一个不存在的key进行incr操作会有什么效果?

        ? 咦?这说明什么?incr操作的key如果不存在,就会把这个key当作0来处理

        

incrby

        针对一个数字类型的value来进行+n操作。

语法:incrby key num

        解释:对key的value进行+num操作。这里的key的value必须是一个整数的字符串形式。

        返回值为+num后的结果

演示

        同理如果针对一个不存在的key,那么效果如incr一样,key都会被当作0来进行+num操作。

        当然你也可以使用incrby key -20来让它进行一个-n的操作。

decr

语法:decr key

        返回值为计算之后的值,例如key的value为10,那么decr的返回值就为9

演示:

        同理如果decr的key不存在,那么这个key就会被当作0,然后进行-1操作:

decrby

        -n操作

 语法:decrby key num

        返回值为计算之后的结果

演示:

incrbyfloat

        针对浮点数进行加减操作

语法:incrbyfloat key float

        返回值仍然为计算之后的结果。

演示

        如果incrbyfloat一个不存在的key?

        同样会把这个key2当作0来进行处理。


        很遗憾没有decrbyfloat操作,但是你可以使用incrbyfloat 负数的形式实现减法:


        上述这几个计数命令的时间复杂度都是O(1)

        很多存储系统和编程语言内部使用 CAS 机制实现计数功能,会有一定的 CPU 开销,但在 Redis 中完全不存在这个问题,因为 Redis 是单线程架构,任何命令到了 Redis 服务端都要顺序执行,因此多个客户端对同一个value进行计数操作是不会引起'线程安全'的问题的。


        除了对数字类型的字符串进行incr等操作,还有一些更多更常见的场景也需要使用到一些非常常用的命令,例如对一个字符串进行拼接操作等,字符串拼接操作在java中可以说是非常常见了。Redis中也存在对字符串形式的value进行拼接等一系列操作的命令。

字符串操作

append

        如果这个key已经存在,并且是一个string,append命令会将会将要添加的内容追加到原有的value后边,如果key不存在,则等同于set命令。

语法:append key otherString

        返回值值的单位为字节,如果使用的是xshell的终端,默认的字符集编码是utf8,在终端输入汉字之后,也是按照utf8编码,一个汉字在utf8编码通常是3个字节。

演示

        可以看到返回值为integer10,正好为字母数量。

        如果append的key不存在,那么就相当于set:

        汉字的返回值根据它的字符集来计算:

        然后我们通过get来获取这个中文value的key:

        这个汉字被转化为16进制去了。

        可以去字符编码查看网站。

        那么如何将其设置为可以识别中文?

        只需要在启动redis客户端的时候,加上--raw这样的选项,redis就会尝试翻译二进制数据。

getrange

        返回 key 对应的 string 的子串,由 start 和 end 确定(左闭右闭:[start, end])。可以使用负数表示倒数。-1 代表倒数第一个字符,-2 代表倒数第二个,其他的与此类似。超过范围的偏移量会根据 string 的长度调整成正确的值。

语法getrange  key  start   end

         时间复杂度:O(N)

演示:

        我们以helloworld为例:

        对helloworld进行各种getrange操作:

        最后发现,发现getrange操作是不会改变原有的key的value的。

        需要注意的是,这里的0 -1,0 -2都是指的字符,但是如果是中文也可以如此吗,例如:

        就会出现各种乱码问题这是为嘛?所以为汉字的时候就尽量不要使用getrange,很可能切出来就不是完整的汉字,上述的代码是强行切除了几个自己,所以在utf8中查出不知道是什么字符。

setrange

        覆盖字符串的一部分,从指定的偏移开始。

语法setrange  key offset value

        其中offset是从第几个字节开始进行替换。举个例子:

        set key hellowrold

        setrange key  1 aaa

        get key 输出 haaaoworld

        时间复杂度:O(N), N 为 value 的长度. 由于一般给的 value 比较短, 通常视为 O(1).
        返回值:替换后的 string 的长度。

演示

        如果offset为1,那么就是从第一个字节开始,如果为0就是从第一个字节的前面开始:

        假设要替换的字节比较靠后,进行替换的字符串也比较长,那么:

        同样的,尽量不要对中文字符串进行setrange操作

strlen

        获取 key 对应的 string 的长度,单位是字节。当 key 存放的类似不是 string 时,报错。 

语法:strlen key

        输出key的vaue 的字节数。

案例

小结

string内部编码

字符串类型的内部编码有 3 种:
• int:8 个字节的长整型。
• embstr:小于等于 39 个字节的字符串。
• raw:大于 39 个字节的字符串。
Redis 会根据当前值的类型和长度动态决定使用哪种内部编码实现。 

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

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

相关文章

全方面解析msvcp110.dll文件的修复教程,六个修复msvcp110.dll文件丢失问题的详细方法

msvcp110.dll是一个动态链接库文件,它是Microsoft Visual C 2012 Redistributable Package(微软视觉C 2012重新分配包)的一部分。这个文件主要包含了C标准库中的一些函数,特别是与内存管理、异常处理、字符串处理和数学计算相关的…

部署YUM仓库服务

一、yum仓库 1. yum简介 yum是一个基于RPM包(是Red-Hat Package Manager红帽软件包管理器的缩写)构建的软件更新机制,能够自动解决软件包之间的依赖关系。 为什么会有依赖关系的发生 因为linux本身就是以系统简洁为自身优势,所以…

动态gif制作方法是什么?一个网站在线制作

一般我们说的gif动图就是动态图片是一种图片格式。Gif动图就是由一帧一帧的静态画面合成一张有动态效果的图片。接下来。给大家讲一讲gif生成(https://www.gif.cn/)的方法吧!很简单不需要下载软件,手机、pc均可操作,只…

Unity触发检测Trigger踩坑合集

正常状态 绿色方块:刚体碰撞盒检测触发碰撞脚本 蓝色方块:碰撞盒 检测脚本: 正常进出: 踩坑1 绿色方块:刚体碰撞盒检测触发碰撞脚本 蓝色方块:碰撞盒 保持绿色和蓝色方块的接触 对蓝色方块&#xff1a…

87.网游逆向分析与插件开发-物品使用-物品交换的逆向分析与C++封装

内容参考于:易道云信息技术研究院VIP课 上一个内容:物品丢弃的逆向分析与C代码的封装-CSDN博客 码云地址(ui显示角色数据 分支):https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号:5222a6b1e5…

程序员的新风口,来了?

过去几年逐渐沉寂的程序员培训行业,现在重新热闹了起来。 作为一家IT培训机构的课程顾问,小娜发现,最近一段时间,咨询鸿蒙开发课程的人越来越多了,为了能够及时回复,我整理了一份话术,以便快速摸…

Qt Excel读写 - QXlsx的安装配置以及测试

Qt Excel读写 - QXlsx的安装配置以及测试 引言一、安装配置二、简单测试 引言 Qt无自带的库处理Excel 文件,但可通过QAxObject 借助COM接口进行Excel的读写1。亦可使用免费的开源第三方库:QXlsx,一个基于Qt库开发的用于读写Microsoft Excel文…

存储监控工具:监控存储区域网络(SAN)

从托管应用程序到提供大型多媒体服务,组织都依靠其 IT 基础架构来提供无与伦比的最终用户体验。为了提供这种卓越的体验,必须大大提高应用程序的可用性和性能。在许多其他挑战中,存储区域网络 (SAN) 正好用于应对这些挑…

Fiddler-02使用

文章目录 一、Fiddler的作用二、Fiddler抓取https请求三、Fiddler过滤请求1、案例一2、案例二3、过滤页面介绍4、总结 四、Fiddler删除数据五、Fiddler接口基础概述六、Fiddler请求响应报文详解1、请求2、响应 七、Fiddler定位前后端的问题八、Fiddler弱网测试方式一&#xff1…

(十六)串口UART

文章目录 UART简介传输数据帧和波特率定时器1作为串口1波特率发生器串口部分相关寄存器TMODAUXRPCONSCONSBUF 串口1工作模式1:8位UART,波特率可变总体工作原理如何简单接收一个字符和发送数据一步之遥的设置现象演示 UART简介 通用异步收发传输器(Unive…

程序员每天会阅读哪些技术网站来提升自己?

我有一个很特别的习惯……每周会固定一天去看一下接单网站上的高薪单子,不完全是为了接单,而是看现在稀缺的岗位是什么…… 其实很多程序员对外包接单都有误解,觉得外包接单平台上的项目都是一些边缘的、没人愿意干的项目,虽然这类…

好用的制造业项目管理工具推荐:提升生产效率与项目成功的关键利器

有什么好用的制造业项目管理工具?制造业作为传统行业,经常会采用项目制管理模式,项目管理对制造业的重要性不言而喻。2024年制造业企业面对国内依然激烈的竞争,想要进一步发展,不仅要对外谋取,也要对内优化…

【LLM多模态】Cogview3、DALL-E3、CogVLM、CogVideo模型

note 文章目录 noteVisualGLM-6B模型图生文:CogVLM-17B模型1. 模型架构2. 模型效果 文生图:CogView3模型DALL-E3模型CogVideo模型网易伏羲-丹青模型Reference VisualGLM-6B模型 VisualGLM 是一个依赖于具体语言模型的多模态模型,而CogVLM则是…

2024年【中级消防设施操作员(考前冲刺)】考试题及中级消防设施操作员(考前冲刺)考试报名

题库来源:安全生产模拟考试一点通公众号小程序 中级消防设施操作员(考前冲刺)考试题参考答案及中级消防设施操作员(考前冲刺)考试试题解析是安全生产模拟考试一点通题库老师及中级消防设施操作员(考前冲刺…

[PHP]严格类型

PHP: 类型声明 - Manual

如何有效获取 Go 变量类型?探索多种方法

嗨,大家好!本文是系列文章 Go 小技巧第九篇,系列文章查看:Go 语言小技巧。 文章目录 Go 的类型系统类型获取使用 fmt.Printf类型选择类型选择反射 reflect.TypeOf 其他注意点错误处理性能考量 总结 在 Python 中,可以使…

SpringBoot项目logback日志配置

Session 认证和 Token 认证 过滤器和拦截器 SpringBoot统一返回和统一异常处理 SpringBoot项目logback日志配置 程序运行出现错误时,第一时间想到的是甩锅还是日志?通过查看日志定位出问题的位置,才能更好的甩锅,今天就来学习…

Mastercam 2024 下载安装教程,流程简单,小白也能轻松搞定,附安装包和工具

前言 Mastercam是一款高效专业的实用型CAD/CAM设计辅助工具,集二维绘图、三维实体造型、曲面设计、体素拼合、数控编程、刀具路径模拟及真实感模拟等多种功能于一身,能够帮助用户轻松设计各种复杂的曲线、曲面零件、刀具路径等。 准备工作 1、Win10及…

Python爬虫:数据获取requests

1. 基本用法 1.1. 安装requests库 pip3 install requests 1.2. 发送HTTP请求 requests.request(method, url, **kwargs) 1.3. 发送GET请求 requests.get(url, paramsNone, **kwargs) 1.4. 发送POST请求 requests.post(url, dataNone, jsonNone, **kwargs) 1.5. 发送PU…

传感器类总结(一)MPU9250 3-2程序关于IIC的底层程序

关于IIC的逻辑和底层协议可以看之前总结的 #IIC 通信协议 1、读写数据 1.1、写数据 发送N个字节程序的流程: 1、发送起始信号 2、发送从机地址和写 3、等待从机发回应答信号 4、发送第一字节数据 等待应答 5、发送下一字节数据 等带应答或非应答信号 6、发送停止信号停止发送…