Redis - String 字符串

news2025/1/13 2:39:46

前言

下表中包含本博客提到的所有命令

        字符串类型是 Redis 最基础的数据类型,关于字符串需要特别注意:

        1)⾸先 Redis 中所有的键(key)的类型都是字符串类型,⽽且其他⼏种数据结构也都是在字符串类似基础上构建的,例如列表和集合的元素类型是字符串类型,所以字符串类型能为其他数据结构的学习奠定基础。

        2)其次,如下图所示,字符串类型的值包含⼀般格式的字符串或者类似 JSON、XML 格式的字符串;数字,可以是整型或者浮点型;甚⾄是⼆进制流数据,例如图⽚、⾳频、视频等。不过⼀个字符串的最⼤值不能超过 512 MB。

        3)Redis 中的 String 类型,直接是按照二进制数据的格式存储的,没有涉及到任何的编码转换,存的是什么取出来的还是什么,所以 Redis 出现乱码的概率很小

常见命令

SET 设置键值对

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

语法:

SET key value [expiration EX seconds|PX milliseconds] [NX|XX]

时间复杂度:O(1)

选项:

SET 命令⽀持多种选项来影响它的⾏为:

EX seconds 使⽤秒作为单位设置 key 的过期时间

PX milliseconds 使⽤毫秒作为单位设置 key 的过期时间

• NX 只在 key 不存在时才进⾏设置,即如果 key 之前已经存在,设置不执⾏。可以理解为创建,只有不存在才能创建,原来存在就创建不了

• XX 只在 key 存在时才进⾏设置,即如果 key 之前不存在,设置不执⾏。可以理解为更新,只有存在才能更新,原来不存在就更新不了

结果:

如果设置成功,返回 OK。

如果 SET 指定了 NX 或者 XX 但条件不满⾜,SET 不会执⾏,并返回(nil)

GET 获取 value 值

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

语法:

GET key

时间复杂度:O(1)

返回值:key 对应的 value,或者 nil 当 key 不存在。

MSET ⼀次性设置多个 key 的值

        ⼀次性设置多个 key 的值。

语法:

MSET key value [key value ...]

时间复杂度:O(N) N 是 key 数量

返回值:永远是 OK

MGET ⼀次性获取多个 key 的值

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

语法:

MGET key [key ...]

时间复杂度:O(N) N 是 key 数量

多次 get vs 单次 mget 

        Redis 是客户端-服务器 结构的程序,所以在命令行输入的每条命令都会被 Redis 构造成 HTTP 请求发送给服务器,服务器接收到请求根据请求的内容,将要返回的数据构造成 HTTP 响应返回

        所以当我们要获取多个数据时,采用 get 命令多次获取,就会构造多个 HTTP 请求,接收多个 HTTP 响应,而采用 mget 命令一次获取所有的数据,就只会构造一个 HTTP 请求,返回一个 HTTP 响应

        很显然,使用 mget 命令批量获取数据的方式可以节省很多的网络资源

·        但也不能批量的获取太多的数据,要有节制,如果一次性批量获取太多的数据,就会导致该命令的执行时间过长,而 Redis 是单线程的程序,当前命令执行时间过长就会导致后面的命令没有时间执行,就会导致客户端迟迟得不到响应,造成客户端阻塞

SETNX,SETEX,PSETEX

        SETNX 等同于 SET KEY VALUE NX 只在 key 不存在时才进⾏设置,即如果 key 之前已经存在,设置不执⾏

        SETEX 等同于 SET KEY VALUE EX 在设置键值对的同时设置秒级过期时间

        PSETEX 等同于 SET KEY VALUE PX 在设置键值对的同时设置毫秒级过期时间

时间复杂度:O(1)

返回值:1 表⽰设置成功。0 表⽰没有设置。

计数命令

INCR 将数字加 1

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

        至于为什么 value 是 String 类型,但却能对保存的数字类型进行计算,是因为底层的编码存储数字用的是 int ,关于 Redis 各个类型底层编码的具体实现推荐看Redis 的数据结构和内部编码【雨林优选】【面试重点】

语法:

INCR key

时间复杂度:O(1) 

返回值:integer 类型的数据加完后的数值

INCRBY 将数字加指定的值

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

语法:

INCRBY key decrement

时间复杂度:O(1)

返回值:integer 类型的数据加完后的数值。

当然如果加的值是负数,就能得到减法的效果

DECR 将数字减 1

        将 key 对应的 value 表示的数字减⼀。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 value 不是⼀个整型或者范围超过了 64 位有符号整型,则报错。

语法:

DECR key

时间复杂度:O(1)

返回值:integer 类型的数据减完后的数值。

DECRBY 将数字减指定的值

        将 key 对应的 value 表⽰的数字减去对应的值。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 value 不是⼀个整型或者范围超过了 64 位有符号整型,则报错。

语法:

DECRBY key decrement

时间复杂度:O(1)

返回值:integer 类型的数据减完后的数值。

当然如果减的值是负数,就能得到加法的效果

INCRBYFLOAT 将浮点数加指定的值

        将 key 对应的 value 表⽰的浮点数加上对应的值。如果对应的值是负数,则视为减去对应的值。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的不是 string 类型,或者不是⼀个浮点数,则报错。允许采⽤科学计数法表⽰浮点数。

语法:

INCRBYFLOAT key increment

时间复杂度:O(1)

返回值:加/减完后的数值。

其他命令

APPEND 追加字符串

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

语法:

APPEND KEY VALUE

时间复杂度:O(1).

追加的字符串⼀般⻓度较短,可以视为 O(1).

返回值:追加完成之后 value 的⻓度。

GETRANGE 获取子串

        返回 key 对应的 value 的⼦串,由 start 和 end 确定(左闭右闭)。可以使⽤负数表⽰倒数。-1 代表倒数第⼀个字符,-2 代表倒数第⼆个,其他的与此类似。超过范围的偏移量会根据string 的⻓度调整成正确的值。

语法:

GETRANGE key start end

时间复杂度:O(N).N 为 [start, end] 区间的⻓度.由于 string 通常⽐较短, 可以视为是 O(1)

返回值:string 类型的⼦串

注意当键值对中存的数据是中文时,如果获取子串不当就会出现一定的问题

        解释:由于博主使用的 xshell 软件的编码方式是 utf8 ,所以一个中文字符由 3 个字节表示,而 GETRANGE 获取子串操作的单位是字节,所以上述的例子就截去了第一个和最后一个字节,因此导致第一个中文字符和最后一个中文字符无法正常表示

        

        当我们截去前三个字节和后三个字节就成功去除了‘你’ 和 ‘界’ 两个中文字符

        提醒:一个中文字符由多少个字节组成不是固定的,要看具体的编码方式

SETRANGE 覆盖字符串

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

语法:

SETRANGE key offset value

时间复杂度:O(N),N 为 value 的⻓度.由于⼀般给的 value ⽐较短, 通常视为 O(1). 

返回值:替换后的 string 的⻓度。

STRLEN 获取字符串长度

        获取 key 对应的 value 的⻓度。当 key 存放的类型不是 string 时,报错。

语法:

STRLEN key

 时间复杂度:O(1)

返回值:string 的⻓度。或者当 key 不存在时,返回 0。

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

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

相关文章

ffmpeg 滤镜实现不同采样率多音频混音

音频混音在音视频开发中是十分重要的一个环节,所谓音频混音就是将所有需要混音的数据相加得到混音数据,然后通过某个算法进行非法数据的处理;例如相加数值超过最大值,最小值等! 在实际的音频开发中,要实现混音的流程如下: 因此我们的编码实现就分为五部分:寻找…

中经评论:“人工智能+”不止是加法

以下文章来源:经济日报 今年,“人工智能”首次被写入《政府工作报告》,这个新提法为发展数字经济、推进数实融合指明了新路径。值得注意的是,“人工智能”不是简单相加,而是要通过新技术催生新质生产力,为经…

MyBatisPlus 之三:BaseMapper 详解和 CRUD 案例详解

BaseMapper详解 1. SQL 日志开启 为了更好更快学习 MyBatisPlus ,需要配置 SQL 日志,这样方便我们能随时看到执行过程中使用的 SQL 语句,有助于理解执行原理及方便 SQL 错误调试 mybatis-plus.configuration.log-implorg.apache.ibatis.logg…

Python 多线程大批量处理文件小程序

说明 平时偶尔需要进行重复性的对文件进行重命名、格式转化等。假设以文件复制功能作为目标,设计一个小程序使用多线程对文件进行批量复制。(其实以后主要目标是针对Realsense的raw文件进行批量的转化,并借助多线程加速) 代码 i…

深度学习 精选笔记(12)卷积神经网络-理论基础2

学习参考: 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增),以达到集多方教程的精华于一文的目的。 ③非常推荐上面(学习参考&#x…

修改yolov9的模型打印不出来Gflops的解决办法

正在修改yolov9的模块,发现修改后的模型没有GFlops这个参数 解决办法: 找到utils/torch_utils.py这个文件,有一个model_info函数 然后将其中的stride改为固定的640就可以打印了。 stride max(int(model.stride.max()), 32) if hasattr(mo…

扩展学习|网络问政的价值增量与实现条件:基于数据资源挖掘的视角

文献来源:[1]顾丹丹傅广宛.网络问政的价值增量与实现条件:基于数据资源挖掘的视角[J].中国行政管理, 2021, 000(004):76-82.DOI:10.19735/j.issn.1006-0863.2021.04.11. 一、技术赋能网络问政的机制生成 (一)技术赋能网络问政的流程&#xf…

关于IP-Adapter的十几个模型,到底是干啥用的?

🎠背景介绍 IP-Adapter的一系列模型在stable diffusion的实际应用中,越来越被频繁的使用到,用于“换脸”或者“保证角色的一致性”,但是很多朋友在安装或者使用别人的工作流的时候,经常会遇到各种各样的问题&#xff…

【JavaScript】JavaScript 运算符 ⑤ ( 赋值运算符 | 基础赋值运算符 与 复合赋值运算符 )

文章目录 一、JavaScript 赋值运算符1、赋值运算符 概念2、基础赋值运算符 与 复合赋值运算符3、复合赋值运算符4、完整代码示例 一、JavaScript 赋值运算符 JavaScript 赋值运算符种类 : 基础赋值运算符 : 等于 : ; 复合赋值运算符 : 加等 : 减等 : -乘等 : *除等 : /取模等…

开启Safari手势支持

在使用Safari 的时候,大家有没有觉得不支持手势使用起来不是很方便, 触摸板只支持少量简单的手势,如缩放,滚动等。如果使用鼠标的用户,则完全无法使用手势。经过折腾研究,使用CirMenu应用可以完美解决这个要…

RAID技术知识详解到RAID 10的linux实现过程

1.RAID技术简介 RAID(Redundant Array of Independent Disks)独立磁盘冗余阵列。通俗来说就是将多个硬盘通过软件或硬件结合成虚拟单台大容量的硬盘使用。 RAID技术的特点: 可以自动检测故障硬盘; 可以重建硬盘坏道的资料&…

VBA批量绘制动态化数据图表

对于大多数使用的VBA的人来说,处理excel工作簿中批量数据是日常工作中常见的情形,但与此同时,VBA在批量绘图方面同样有简洁快速的特点。 说起Excel画图表,考虑一个问题,excel图表的本质是什么?很多人会不假…

便利店小程序有哪些功能

​便利店小程序为附近的住户提供小程序在线购物的服务。用户只需要打开小程序,就可以购买需要的商品,可以选择自取或者配送。整个过程非常简单快速。下面具体介绍便利店小程序的功能。 1. **商品展示**:展示便利店的商品信息,包括…

【C++刷题】优选算法——动态规划第一辑

1.状态表示是什么?简答理解是dp表里的值所表示的含义怎么来的?题目要求经验题目要求分析问题的过程中,发现重复子问题 2.状态转移方程dp[i]......细节问题:3.初始化控制填表的时候不越界4.填表顺序控制在填写当前状态的时候&#…

windows下修改mysql的max_allowed_packet的值

1)C:\Program Files\MySQL\MySQL Server 5.7 在MySQL 的安装目录下添加my.ini文件,同时添加空的data文件 2)my.ini文件内容如下, [mysqld] port 3306 basedirC:\Program Files\MySQL\MySQL Server 5.7 datadirC:\Program Files\MySQL\MySQ…

软考78-上午题-【面向对象技术3-设计模式】-结构型设计模式01

一、适配器模式 1-1、意图 个类的接口转换成客户希望的另外一个接口。 Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 1-2、结构 适配器模式分为: 1、适配器类模式; 2、适配器对象模式 类适配器使用多重继承对一个接口与另…

java基础(6) IO[下] 线程(补充) XML Servlet

输出流 OutputStream OutputStream是Java标准库提供的最基本的输出流。 和InputStream类似,OutputStream也是抽象类,它是所有输出流的超类。这个抽象类定义的一个最重要的方法就是void write(int b) public abstract void write(int b) throws IOExcep…

html--宠物

文章目录 htmljscss html <!DOCTYPE html> <html lang"en" > <head><meta charset"UTF-8"><title>CodePen - Spaceworm</title><script> window.requestAnimFrame (function() {return (window.requestAnimat…

Javascript抓取京东、淘宝商品数据(商品采集商品详情图片抓取)

之前用的方法&#xff1a; let temp []var lists $(#J_goodsList li.gl-item)$.each(lists,function(idx,item){ temp.push({ id:$(item).data(sku), goods_img:$(item).find(img).attr(src), goods_name:$(item).find(.p-name em).text(), market_price:$(item).fi…

2024 年(第 12 届)“泰迪杯”数据挖掘挑战赛——B 题:基于多模态特征融合的图像文本检索完整思路与源代码分享

一、问题背景 随着近年来智能终端设备和多媒体社交网络平台的飞速发展&#xff0c;多媒体数据呈现海量增长 的趋势&#xff0c;使当今主流的社交网络平台充斥着海量的文本、图像等多模态媒体数据&#xff0c;也使得人 们对不同模态数据之间互相检索的需求不断增加。有效的信…