Redis - String 字符串

前言

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

        字符串类型是 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.mzph.cn/news/751531.shtml

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

相关文章

Figure 01掀起了具身智能的崭新篇章

在人工智能的发展历程中,OpenAI始终扮演着创新的先锋角色。最近,他们与Figure公司的合作成果尤为引人注目,这一合作将多模态大模型技术成功应用于Figure 01机器人的开发中,为人类与机器的互动开辟了全新的时代。该机器人不仅能够与…

Matlab|【免费】基于半不变量的概率潮流计算

目录 主要内容 部分代码 结果一览 下载链接 主要内容 该程序主要内容是基于半不变量法的概率潮流,包含蒙特卡洛模拟法、半不变量法+Gram-Charlier级数展开以及半不变量法Cornish-Fisher级数展开三种方法以及效果对比,模型考虑了…

Python 查找并高亮PDF中的指定文本

在处理大量PDF文档时,有时我们需要快速找到特定的文本信息。本文将提供以下三个Python示例来帮助你在PDF文件中快速查找并高亮指定的文本。 查找并高亮PDF中所有的指定文本查找并高亮PDF某个区域内的指定文本使用正则表达式搜索指定文本并高亮 本文将用到国产第三方…

cesium.js加载模型后,重新设置旋转角度属性值

// 加载模型var position Cesium.Cartesian3.fromDegrees(longitude, latitude, height);// 计算矩阵var rollAngleDegrees 15; // 设置翻滚角度var rollAngleRadians Cesium.Math.toRadians(rollAngleDegrees); // 将角度转换为弧度var orientation Cesium.Transforms.eas…

安装Pytorch——CPU版本

安装Pytorch——CPU版本 1. 打开pytorch官网2. 选择pip安装pytorch-cpu3.复制安装命令4. 在cmd命令窗口,进入你的虚拟环境4.1 创建虚拟环境4.2 进行安装 5. 安装成功6. 进行测试——如下面步骤,如图6.1 输入 python6.2 输入 import torch6.2 输入 print …

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Web)中篇

onBeforeUnload onBeforeUnload(callback: (event?: { url: string; message: string; result: JsResult }) > boolean) 刷新或关闭场景下,在即将离开当前页面时触发此回调。刷新或关闭当前页面应先通过点击等方式获取焦点,才会触发此回调。 参数…

微信小程序-微信支付

微信支付介绍 梳理一下流程: 1、用户点击下单,小程序向商户系统(我们的服务器)发起请求,服务器生成一个唯一订单号给小程序。 2、小程序向服务器发起微信支付请求,服务器调用微信下单接口,微信…

【教学类-34-10】20240313 春天拼图(Midjounery生成线描图,4*4格拼图块)(AI对话大师)

作品展示: 背景需求: 利用华文彩云空心字(粗胖字体。凑满9个拼图)制作了3*3的拼图块 【教学类-34-09】20240310华文彩云学号拼图(3*3格子浅灰底图 深灰拼图块)(AI对话大师)-CSDN博…

Android14之报错:error:add its name to the whitelist(一百九十四)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

juc(3)

进程 程序由指令和数据组成,到哪有些指令需要执行,有些要读写,句必须将指令加载到cpu,数据加载到内存,再指令运行过程中还要用到磁盘,网络等设备.进程就是用来加载指令.管理内存,管理io的 当一个程序被运行,从磁盘加载这个程序的代码到内存,这时就开启了一个进程 进程可以视…

Elasticsearch 索引库操作 文档操作

索引库就类似数据库表,mapping映射就类似表的结构。要向es中存储数据,必须先创建“库”和“表”。 mapping映射属性 mapping是对索引库中文档的约束,常见的mapping属性包括: type: 字段数据类型,常见的简…

MySQL语法分类 DQL(2)条件查询

为了更好的学习这里给出基本表数据用于查询操作 create table student (id int, name varchar(20), age int, sex varchar(5),address varchar(100),math int,english int );insert into student (id,name,age,sex,address,math,english) values (1,马云,55,男,杭州,66,78),…

python绘制双列堆积柱形图

python绘制单列堆积柱形图 : python绘制单列堆积柱形图-CSDN博客 一、代码 import numpy as np import matplotlib.pyplot as pltN 10 menMeans np.array([[20, 35], [15, 25], [15, 25], [15, 25], [15, 25], [15, 25], [15, 25], [15, 25], [15, 25], [15, 25]…

HAProxy高性能负载均衡器

一、HAProxy基础知识 (一)HAProxy概述 HAProxy是一款基于事件驱动、单进程模型设计的四层与七层负载均衡器,它能够在TCP/UDP层面以及HTTP(S)等应用层协议上实现高效的流量分发。HAProxy不仅适用于Web服务器负载均衡,还能应用于数据…

【matlab】如何批量修改图片命名

【matlab】如何批量修改图片命名 (●’◡’●)先赞后看养成习惯😊 假如我的图片如下,分别是1、2、3、4、5的命名 需求一:假如现在我需要在其后面统一加上_behind字符串,并且保留原命名,同时替换掉原先的图片,也就是不copy新的一份,直接在原文件夹中处理,我们可以进行…

基于springboot+vue的大学生兼职系统的设计与实现(源码+论文)

作者主页:Java程序员老张 主要内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】:Java 【框架】:…

Java零基础入门-LinkedHashMap集合

一、本期教学目标 学习LinkedHashMap集合的概念及特点。学习LinkedHashMap存储结构。学习LinkedHashMap集合常用方法及示例代码演示。 二、正文 1、概述 我们学习了map接口之HashMap集合,今天我们要来学习map接口的另一个实现类-LinkedHashMap,不知道…

算法思想总结:滑动窗口算法

创作不易&#xff0c;感谢三连 一.长度最小的数组 . - 力扣&#xff08;LeetCode&#xff09;长度最小的数组 class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {int lenINT_MAX,nnums.size(),sum0;//len必须要给一个很大的数&#xf…

go rabbitmq 操作

go rabbitmq 操作 go 依赖包github.com/streadway/amqp docker快速部署 docker pull rabbitmq:management docker run -d rabbitmq:management # 先跑一个看看监听了哪些端口 docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq #5672 go 程序连接&#x…

Java-并发编程--ThreadLocal、InheritableThreadLocal

1.ThreadLocal 作用 作用&#xff1a;为变量在线程中都创建副本&#xff0c;线程可访问自己内部的副本变量。该类提供了线程局部 (thread-local) 变量&#xff0c;访问这个变量&#xff08;通过其 get 或 set 方法&#xff09;的每个线程都有自己的局部变量&#xff0c;它独立…