Redis中String类型的命令

news2024/11/27 4:18:27

目录

Redis中的内部编码

redis的数据结构和内部编码

Redis中的String类型

String类型的常见命令

set

get

mget

mset

String类型的计数命令

incr

incrby

decr

incrbyfloat

其他命令

append

getrange

setrange

strlen

String类型的内部编码


Redis中的内部编码

redis中value的数据类型有多种,最通用的数据结构有String,List,set,hash和sorted set.

redis底层在实现上述数据结构的时候,会在源码层面,针对上述各个数据结构实现特定的优化,来达到节省空间/节省时间的效果.

也就是说每个数据结构在redis内部具体是如何实现的,这是有变数的.一个数据结构可能对应多种编码方式,来应对不同场景下的业务.

通俗一点讲就是redis承诺这里有一个hash表,你进行查询,插入,删除操作,都保证时间复杂度是O(1),但是这个hash表背后的实现不一定就是标准的hash表,可能在特定的场景下会使用别的数据结构来实现,但是仍然保证时间复杂度是O(1).

redis的数据结构和内部编码

每种数据结构都至少有两种以上的内部编码实现,,同时有些内部编码可以做为多种数据结构的内部实现.

我们可以通过object encoding命令来查询其具体的内部编码.

redis这样设计的好处:

1.可以改进内部编码,而对外的数据结构和命令没有任何影响,这样一旦开发出来更优秀的内部编码,无需改动外部的数据结构和命令.

2.多种内部编码的实现可以在不同的场景下发挥各自的优势.例如 ziplist ⽐较节省内存,但是在列表元素⽐较多的情况下,性能会下降,这时候 Redis 会根据配置选项将列表类型的内部实现转换为 linkedlist,整个过程⽤⼾同样⽆感知。


Redis中的String类型

redis中所有的键的类型都是字符串类型,其他几种数据结构也都是在字符串类型的基础上构建的.

字符串类型实际的值,可以是字符串,包含一般格式的json,xml格式的字符串;也可以是数字,包含整数或者浮点数;也可以是二进制流数据,例如图片,音频等.但是一个字符串的最大值不能超过512MB.

由于 Redis 内部存储字符串完全是按照⼆进制流的形式保存的,所以 Redis 是不处理字符集
编码问题的,客⼾端传⼊的命令中使⽤的是什么字符集编码,就存储什么字符集编码。

String类型的常见命令

set

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

set命令支持多种选项来影响它的行为.

ex使用秒为单位设置key的过期时间.px使用毫秒作为单位设置key的过期时间.

nx表示如果key不存在才设置,key存在则不设置;xx表示如果key存在则设置,key不存在则不设置.

redis针对set的一些用法也延申出了一些命令.

setnx:key不存在才能设置,存在则设置失败.返回1表示设置成功,返回0表示没有设置.

setex:设置key的过期时间单位是秒.

psetex:设置key的过期时间单位是毫秒.

返回值:设置成功则返回ok,如果由于set指定了nx或者xx并且条件没有满足,set不会执行并返回nil.

get

获取key对应的value.如果key不存在,返回nil.如果value的类型不是string会报错.

mget

一次性获取多个key的值.如果对应的key不存在或者对应的数据类型不是string则返回nil.

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

mset

一次性设置多个key的值.返回ok.时间复杂度是O(N),其中n是key的数量.


String类型的计数命令

  • incr ,针对value+1
  • incrby,针对value+n
  • decr,针对value-1
  • decrby,针对value-n
  • incrbyfloat,针对value+/-小数
incr

将 key 对应的 string 表⽰的数字加⼀。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错。
返回的是加完之后的数值.
incrby

将 key 对应的 string 表⽰的数字加上对应的值。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错。
decr
将 key 对应的 string 表⽰的数字减⼀。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错。
incrbyfloat
将 key 对应的 string 表⽰的浮点数加上对应的值。如果对应的值是负数,则视为减去对应的值。如果key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的不是 string,则报错。允许采⽤科学计数法表⽰浮点数。

其他命令

append

如果 key 已经存在并且是⼀个 string,命令会将 value 追加到原有 string 的后边。如果 key 不存在,则效果等同于 SET 命令。

时间复杂度:O(1)

返回值:追加完成之后string的长度.此处的单位是字节.

redis的字符串不会对字符编码做任何处理,redis不认识字符只认识字节.

当前的xshell终端,是按照utf8的方式进行编码的,在终端输入汉字后,也是按照utf8进行编码的,一个汉字在utf8的字符集中,通常是3个字节的.

可以看到我们get key5得到的是你好的16进制的数据,对应的就是utf8中的你好.

如果不想得到数据而是汉字,可以在启动redis客户都安的时候加上--raw,此时redis客户端就能够自动的把二进制的数据尝试翻译.

getrange

返回 key 对应的 string 的⼦串,由 start 和 end 确定(左闭右闭)。可以使⽤负数表⽰倒数。-1 代表倒数第⼀个字符,-2 代表倒数第⼆个,其他的与此类似。超过范围的偏移量会根据 string 的长度调整成正确的值。
如果value是汉字,此时切分出来的是什么就不确定了.
setrange
覆盖字符串的一部分,从指定的偏移开始.
返回的替换之后的string长度.
针对汉字也可能会出现问题.
setrange针对不存在的key也可以操作,不过会把offset之前的内容填充为0x00.
strlen
获取key对应的string长度.当key存放的类型不是string时,会报错.
返回的字符串的长度,当key不存在的时候返回0.单位是字节.

String类型的内部编码

String类型的内部编码有3种:

  • int:8个字节的长整型
  • embstr:小于等于39字节的字符串
  • raw:大于39字节的字符串.

redis会根据当前值的类型和长度动态决定使用哪种内部编码实现.

redis在存储小数的时候,本是上还是当作字符串来存储.意味着每次进行算数运算都需要把字符串转为小数.进行运算.结果在转为字符串.


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

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

相关文章

并发编程 - PriorityQueue用法

一、PriorityQueue介绍 队列是遵循先进先出(First-In-First-Out)模式的,PriorityQueue类在Java1.5中引入并作为 Java Collections Framework 的一部分。 优先队列中的元素可以默认自然排序或者通过提供的Comparator(比较器&#x…

LLM之Prompt(一):5个Prompt高效方法在文心一言3.5的测试对比

在Effective Prompt: 编写高质量Prompt的14个有效方法文中我们了解了14个编写Prompt的方法(非常感谢原作者),那么这些Prompt在具体大模型中的效果如何呢?本文以百度文心一言3.5版本大模型在其中5个方法上做个测试对比。 第1条&am…

MySQL---搜索引擎

MySQL的存储引擎是什么 MySQL当中数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制,索引技巧 锁定水平,以及最终提供的不同的功能和能力,这些就是我们说的存储引擎。 MySQL存储引擎的功能 1.MySQL将数据存储在文…

Python蓝桥杯的一些数据输入输出格式

近期,准备Python组蓝桥杯比赛,对于数据的输入输出还是不熟悉,今天整理如下方便日后使用: 输入 对于这种一个表示个数一个表示长度的例子 n,m map(int,input().split())第一行是个数,下面是对应的条数 n,m map(int,i…

基于若依的ruoyi-nbcio流程管理系统增加仿钉钉流程设计(七)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 这一节主要讲增加延时节点的一些功能 1、首先配置文件增加延时配置 delay: {type: "delay",c…

【C++代码】编辑距离,最长递增子序列,最长连续递增序列,最长重复子数组,最长公共子序列,不相交的线,动态规划--代码随想录

题目:最长递增子序列 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,…

设数据为01101001,试采用4个校验位求其偶校验方式的海明码。

遇到一个题目,但是教材书上写的比较迷糊,看不懂,后来在网上搜了一下方法,发现还是比较简单的,现在分享一下我的解法 首先,套用公式:2k - 1 > n k 因为求得数字是8位数,n8&#x…

代码冲突解决

远程仓库修改 本地代码修改 接下来我们push一下 如果使用IDE 冲突内容如下: 我们可以使用自带的工具进行修改 我们选择接受自己改动的即可 如果使用git工具怎么去处理呢 远程分支是这样 本地是这样的 add和commit之后,再pull,最后pus…

el-form-item添加校验规则后取消前面的星号

0 效果 联系电话添加了rules校验,但前面的星号不需要 1 样式

AdvFaces: Adversarial Face Synthesis

AdvFaces: Adversarial Face Synthesis AdvFaces:对抗性人脸合成 摘要 我们提出了AdvFaces,一种自动对抗人脸合成方法,通过生成对抗网络学习在显著面部区域产生最小的扰动。一旦AdvFaces经过训练,它就可以自动产生难以察觉的扰动&#xff0…

基于Python+OpenCV+PyQt5鱼群密度和速度检测系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 基于PythonOpenCVPyQt5的鱼群密度和速度检测系统是一种利用计算机视觉技术和图像处理算法来实现对鱼群密度和速度的…

高阶数据结构学习——LRU Cache

文章目录 1、了解LRU Cache(Least Recently Used缩写)2、代码实现 1、了解LRU Cache(Least Recently Used缩写) Cache是缓存,在磁盘和内存之间,内存和寄存器之间都存在,CPU和内存之间存在三级缓…

Windows经常提示更新怎么办?一招暂停66年,绝对靠谱!

windows10/11的更新频率非常高,也经常会修复旧bug的同时带来一些新的bug。所以有些人不喜欢系统的自动更新,总想把它禁用掉。禁用系统更新的软件有很多,不过这些方法大多是强行禁止,有时候会引来一些其它的问题。 所以为了阻止Win…

“1-5-15”原则:中国联通数字化监控平台可观测稳定性保障实践

一分钟精华速览 “只知道系统有问题,但是找不到问题到底出在哪里”,这几乎是大家都面临过、或正在面临的问题。用户在投诉,但是我的指标都是正常的,到底是哪一环出问题了? 本文详细介绍了中国联通在智能运维领域的应用…

软考1-介绍

软考介绍: https://www.zhihu.com/question/530084452/answer/3230275708 软考作用: https://www.zhihu.com/question/29904891/answer/3181804961

(02)Mycat的安装与启动

1、 下载Mycat安装包 2、 解压缩文件拷贝到linux下 /usr/local/ 3、三个重要文件 1、schema.xml 定义逻辑库&#xff0c;表、分片节点等内容 2、rule.xml 定义分片规则 3、server.xml 定义用户以及系统相关变量&#xff0c;如端口等. 4、启动前先修改schema.xml <?x…

List 接口常用实现类底层分析

一、集合 1.1 简介 集合主要分为两组&#xff08;单列集合、双列集合&#xff09;&#xff0c;Collection 接口有两个重要的子接口 List 和Set&#xff0c;它们的实现子类都是单列集合。Map 接口的实现子类是双列集合&#xff0c;存放的是 K-V 1.2 关系图 二、Collection 接口…

听说你的爬虫被封了?

目录 前言 一、为什么会被封IP&#xff1f; 二、代理IP是什么&#xff1f; 三、代理IP的分类 1. 公共代理IP 2. 私人代理IP 四、使用代理IP的方法 1. 使用第三方库 2. 手动设置代理IP 五、常见问题及解决方法 1. 代理IP不稳定 2. 代理IP被封 六、代码实例 总结 前…

城市内涝怎么预警?万宾科技内涝积水监测仪

在城市运行过程中&#xff0c;城市内涝问题频繁出现&#xff0c;影响城市管理水平的提升&#xff0c;也会进一步减缓城市基础设施建设。尤其近几年来&#xff0c;城市内涝灾害频繁出现&#xff0c;在沿海地区内涝所带来的安全隐患成为城市应急管理部门的心头大患。城市内涝的背…

文本批量处理,一键转换HTML文件编码,释放您的繁琐工作!

亲爱的用户&#xff0c;您是否曾经为需要手动转换HTML文件编码而耗费大量时间和精力而感到困扰&#xff1f;现在&#xff0c;我们为您提供了一款强大的文本批量处理工具&#xff01;让您一键将HTML文件编码进行转换&#xff0c;轻松释放您的繁琐工作&#xff01; 首先&#xf…