【Redis】string

article/2025/8/21 15:46:37

String 字符串

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

  • 首先 Redis 中所有的键的类型都是字符串类型,而且其他几种数据结构也都是在字符串的基础上构建的。
  • 字符串类型的值实际可以是字符串,包含一般格式的字符串或者类似 JSON、XML 格式的字符串;数字,可以是整型或者浮点型;甚至是二进制流数据,例如图片、音频、视频等。不过一个字符串的最大值不能超过 512 MB。

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

在这里插入图片描述

常见命令

SET

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

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

命令有效版本:1.0.0 之后
时间复杂度:O(1)
选项:

  • EX seconds —— 使用秒作为单位设置 key 的过期时间。
  • PX milliseconds —— 使用毫秒作为单位设置 key 的过期时间。
  • NX —— 只在 key 不存在时才进行设置,即如果 key 之前已经存在,设置不执行。
  • XX —— 只在 key 存在时才进行设置,即如果 key 之前不存在,设置不执行。
    注意:由于带选项的 SET 命令可以被 SETNX、SETEX、PSETEX 等命令代替,所以之后的版本中,Redis 可能进行合并。
    返回值:
  • 如果设置成功,返回 OK。
  • 如果由于 SET 指定了 NX 或者 XX 但条件不满足,SET 不会执行,并返回 (nil)。
    示例:
redis> EXISTS mykey
(integer) 0
redis> SET mykey "Hello"
OK
redis> GET mykey
"Hello"
redis> SET mykey "World" NX
(nil)
redis> DEL mykey
(integer) 1
redis> EXISTS mykey
(integer) 0
redis> SET mykey "World" XX
(nil)
redis> GET mykey
(nil)
redis> SET mykey "World" NX
OK
redis> GET mykey
"World"
redis> SET mykey "Will expire in 10s" EX 10
OK
redis> GET mykey
"Will expire in 10s"
# 10秒之后
redis> GET mykey
(nil)

GET

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

GET key

命令有效版本:1.0.0 之后
时间复杂度:O(1)
返回值:key 对应的 value,或者 nil 当 key 不存在。
示例:

redis> GET nonexisting
(nil)
redis> SET mykey "Hello"
"OK"
redis> GET mykey
"Hello"
redis> DEL mykey
(integer) 1
redis> EXISTS mykey
(integer) 0
redis> HSET mykey name Bob
(integer) 1
redis> GET mykey
(error) WRONGTYPE Operation against a key holding the wrong kind of value

MGET

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

MGET key [key ...]

命令有效版本:1.0.0 之后
时间复杂度:O(N) N 是 key 数量
返回值:对应 value 的列表
示例:

redis> SET key1 "Hello"
OK
redis> SET key2 "World"
OK
redis> MGET key1 key2 nonexisting
1) "Hello"
2) "World"
3) (nil)

MSET

一次性设置多个 key 的值。
语法:

MSET key value [key value ...]

命令有效版本:1.0.1 之后
时间复杂度:O(N) N 是 key 数量
返回值:永远是 OK
示例:

redis> MSET key1 "Hello" key2 "World"
OK
redis> GET key1
"Hello"
redis> GET key2
"World"

在这里插入图片描述

如上图所示,使用 mget 由于可以有效地减少网络时间,所以性能相对更高。假设网络耗时 1 毫秒,命令执行 1 毫秒,那么执行时间如下表所示。

100 次 get 和 1 次 mget 100 个键对比

操作时间
100 次 get100 x 1 + 100 x 0.1 = 110 毫秒
1 次 mget 100 个键1 x 1 + 100 x 0.1 = 101 毫秒

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

SETNX

设置 key-value 但只允许在 key 之前不存在的情况下。
语法:

SETNX key value

命令有效版本:1.0.0 之后
时间复杂度:O(1)
返回值:1 表示设置成功。0 表示没有设置。
示例:

redis> SETNX mykey "Hello"
(integer) 1
redis> SETNX mykey "World"
(integer) 0
redis> GET mykey
"Hello"
  • set key value :判断 key 是否存在,存在或不存在均设置成功。
  • set key value xx :判断 key 是否存在,存在则设置成功,不存在则设置失败。
  • set key value nx 或者 setnx key value :判断 key 是否存在,存在则设置失败,不存在则设置成功。

计数命令

INCR

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

INCR key

命令有效版本:1.0.0 之后
时间复杂度:O(1)
返回值:integer 类型的加完后的数值。
示例:

redis> EXISTS mykey
(integer) 0
redis> INCR mykey
(integer) 1
redis> SET mykey "10"
OK
redis> INCR mykey
(integer) 11
redis> SET mykey "2342934823904890489209348230948"
OK
redis> INCR mykey
(error) value is not an integer or out of range
redis> SET mykey 'not a number'
OK
redis> INCR mykey
(error) value is not an integer or out of range

INCRBY

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

INCRBY key decrement

命令有效版本:1.0.0 之后
时间复杂度:O(1)
返回值:integer 类型的加完后的数值。
示例:

redis> EXISTS mykey
(integer) 0
redis> INCRBY mykey 3
(integer) 3
redis> SET mykey "10"
OK
redis> INCRBY mykey 3
(integer) 13
redis> INCRBY mykey "not a number"
(error) value is not an integer or out of range
redis> SET mykey "2342934823904890489209348230948"
OK
redis> INCRBY mykey 3
(error) value is not an integer or out of range
redis> SET mykey 'not a number'
OK
redis> INCRBY mykey 3
(error) value is not an integer or out of range

DECR

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

DECR key

命令有效版本:1.0.0 之后
时间复杂度:O(1)
返回值:integer 类型的减完后的数值。
示例:

redis> EXISTS mykey
(integer) 0
redis> DECR mykey
(integer) -1
redis> SET mykey "10"
OK
redis> DECR mykey
(integer) 9
redis> SET mykey "2342934823904890489209348230948"
OK
redis> DECR mykey
(error) value is not an integer or out of range
redis> SET mykey 'not a number'
OK
redis> DECR mykey
(error) value is not an integer or out of range

DECRBY

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

DECRBY key decrement

命令有效版本:1.0.0 之后
时间复杂度:O(1)
返回值:integer 类型的减完后的数值。
示例:

redis> EXISTS mykey
(integer) 0
redis> DECRBY mykey 3
(integer) -3
redis> SET mykey "10"
OK
redis> DECRBY mykey 3
(integer) 7
redis> DECRBY mykey "not a number"
(error) value is not an integer or out of range
redis> SET mykey "2342934823904890489209348230948"
OK
redis> DECRBY mykey 3
(error) value is not an integer or out of range
redis> SET mykey 'not a number'
OK
redis> DECRBY mykey 3
(error) value is not an integer or out of range

INCRBYFLOAT

将 key 对应的 string 表示的浮点数加上对应的值。如果对应的值是负数,则视为减去对应的值。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的不是 string,或者不是一个浮点数,则报错。允许采用科学计数法表示浮点数。
语法:
INCRBYFLOAT key increment
命令有效版本:2.6.0 之后
时间复杂度:O(1)
返回值:加/减完后的数值。
示例:

redis> SET mykey 10.50
OK
redis> INCRBYFLOAT mykey 0.1
"10.6"
redis> INCRBYFLOAT mykey -5
"5.6"
redis> SET mykey 5.0e3
OK
redis> INCRBYFLOAT mykey 2.0e2
"5200"

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

其他命令

APPEND

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

  • 语法:APPEND KEY VALUE
  • 命令有效版本:2.0.0 之后
  • 时间复杂度:O(1),追加的字符串一般长度较短,可视为 O(1)
  • 返回值:追加完成之后 string 的长度
  • 示例
redis> EXISTS mykey
(integer) 0
redis> APPEND mykey "Hello"
(integer) 5
redis> GET mykey
"Hello"
redis> APPEND mykey " World"
(integer) 11
redis> GET mykey
"Hello World"

GETRANGE

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

  • 语法:GETRANGE key start end
  • 命令有效版本:2.4.0 之后
  • 时间复杂度:O(N),N 为 [start, end] 区间的长度,由于 string 通常较短,可视为 O(1)
  • 返回值:string 类型的子串
  • 示例
redis> SET mykey "This is a string"
OK
redis> GETRANGE mykey 0 3
"This"
redis> GETRANGE mykey -3 -1
"ing"
redis> GETRANGE mykey 0 -1
"This is a string"
redis> GETRANGE mykey 10 100
"string"

SETRANGE

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

  • 语法:SETRANGE key offset value
  • 命令有效版本:2.2.0 之后
  • 时间复杂度:O(N),N 为 value 的长度,由于一般给的 value 较短,通常视为 O(1)
  • 返回值:替换后的 string 的长度
  • 示例
redis> SET key1 "Hello World"
OK
redis> SETRANGE key1 6 "Redis"
(integer) 11
redis> GET key1
"Hello Redis"

STRLEN

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

  • 语法:STRLEN key
  • 命令有效版本:2.2.0 之后
  • 时间复杂度:O(1)
  • 返回值:string 的长度。或者当 key 不存在时,返回 0
  • 示例
redis> SET mykey "Hello world"
OK
redis> STRLEN mykey
(integer) 11
redis> STRLEN nonexisting
(integer) 0

命令小结

命令执行效果时间复杂度
set key value [key value…]设置 key 的值是 valueO(k),k 是键个数
get key获取 key 的值O(1)
del key [key …]删除指定的 keyO(k),k 是键个数
mset key value [key value …]批量设置指定的 key 和 valueO(k),k 是键个数
mget key [key …]批量获取 key 的值O(k),k 是键个数
incr key指定的 key 的值 +1O(1)
decr key指定的 key 的值 -1O(1)
incrby key n指定的 key 的值 +nO(1)
decrby key n指定的 key 的值 -nO(1)
incrbyfloat key n指定的 key 的值 +n(浮点数运算)O(1)
append key value指定的 key 的值追加 valueO(1)
strlen key获取指定 key 的值的长度O(1)
setrange key offset value覆盖指定 key 的从 offset 开始的部分值O(n),n 是字符串长度,通常视为 O(1)
getrange key start end获取指定 key 的从 start 到 end 的部分值O(n),n 是字符串长度,通常视为 O(1)

内部编码

字符串类型的内部编码有 3 种:

  • emb:8 个字节的长整型。
  • embstr:小于等于 39 个字节的字符串。
  • raw:大于 39 个字节的字符串。
    Redis 会根据当前值的类型和长度动态决定使用哪种内部编码实现。
  • 整型示例
127.0.0.1:6379> set key 6379
OK
127.0.0.1:6379> object encoding key
"int"
  • 短字符串示例
# 小于等于 39 个字节的字符串
127.0.0.1:6379> set key "hello"
OK
127.0.0.1:6379> object encoding key
"embstr"
  • 长字符串示例
# 大于 39 个字节的字符串
127.0.0.1:6379> set key "one string greater than 39 bytes ......."
OK
127.0.0.1:6379> object encoding key
"raw"

典型使用场景

  • 缓存(Cache)功能
  • 计数(Counter)功能
  • 共享会话(Session)
  • ⼿机验证码

http://www.hkcw.cn/article/AmtqXmKfSU.shtml

相关文章

Java 文件操作 和 IO(3)-- Java文件内容操作(1)-- 字节流操作

Java 文件操作 和 IO(3)-- Java文件内容操作(1)-- 字节流操作 文章目录 Java 文件操作 和 IO(3)-- Java文件内容操作(1)-- 字节流操作观前提醒:1. Java中操作文件的简单介…

MySQL进阶篇(存储引擎、索引、视图、SQL性能优化、存储过程、触发器、锁)

MySQL进阶篇 存储引擎篇MySQL体系结构存储引擎简介常用存储引擎简介存储引擎的选择 索引篇索引简介索引结构(1)BTree索引(2)hash索引 索引分类索引语法SQL性能分析指标(1)SQL执行频率(2)慢查询日志(3)profile详情(4)explain或desc执行计划 索引使用引起索引的失效行为SQL提示覆…

造血干细胞移植中,选择合适供者需综合多因素考量

KIR 单体型即杀伤细胞免疫球蛋白样受体(KIR)单体型,是指 KIR 基因在染色体上特定的组合形式 。主要内容如下: 分类 着丝粒单体型(C 型):含有较多的抑制性 KIR 基因,这些基因编码的…

四.MySQL数据类型

数据类型分类 一.数值类型 1.tinyint类型 MySQL 整数类型范围(有符号 / 无符号) 类型字节最小值(有符号/无符号)最大值(有符号/无符号)TINYINT1-128 / 0127 / 255SMALLINT2-32,768 / 032,767 / 65,535ME…

深度解构:Profinet转Profibus网关如何重塑产品分离装置的控制逻辑

PROFINET是一种基于以太网的工业以太网通讯协议,而PROFIBUS则是一种国际化的现场总线标准。在很多工业生产环境中,这两种通讯方式都有其各自的应用场合和优势。当产品分离装置需要同时使用PROFINET和PROFIBUS进行通信时,无锡耐特森PROFINET转…

EasyVoice:开源的文本转语音工具,让文字“开口说话“

名人说:博观而约取,厚积而薄发。——苏轼《稼说送张琥》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、EasyVoice是什么?1. 核心特性一览2. 技术架构概览 二、安装部署指南…

外航飞机疑盲降国内在建跑道 机组认错跑道复飞

5月28日,有网友发帖称,一架外国航空公司的飞机在降落西安咸阳国际机场时发生意外状况,疑似盲降正在建设中的跑道,接地后复飞。该事件引发网友关注。据网友所述,该飞机在准备降落时,地面指令让落23L(南一跑道),结果落向24L(正在建的南二跑道),然后指挥复飞了,最后落…

[Redis] Redis:高性能内存数据库与分布式架构设计

标题:[Redis] 浅谈分布式系统 水墨不写bug 文章目录 一、什么是Redis?一、核心定位二、核心优势三、典型应用场景四、Redis vs 传统数据库 二、架构选择与设计1、单机架构(应用程序 数据库服务器)2、应用程序和数据库服务器分离3…

论坛项目测试报告

一、项目背景 1.1 测试目标 验证论坛功能完整性,确保用户个人中心、发布/删除管理、模块分类控制、搜索功能等核心模块 符合需求。 1.2 项目技术栈 后端:Spring Boot/Spring MVC 数据库:MySQL 前端:原生 HTML/CSS/AJAX 二、…

(LeetCode 每日一题)3373. 连接两棵树后最大目标节点数目 II(贪心+深度优先搜索dfs)

题目:3373. 连接两棵树后最大目标节点数目 II 思路:贪心深度优先搜索dfs,时间复杂度0(nm)。 第二棵树:对每个节点进行分类,0或1,相邻的节点肯定不同啦,这样就可以统计出0和1 各自的节点个数。 …

开疆智能Profinet转Profibus网关连接EC-CM-P1 PROFIBUS DP从站通讯模块配置案例

本案例是通过开疆智能Profibus转Profinet网关将正弦研发的Profibus从站模块连接的EM600变频器接入到西门子1200PLC的配置案例。 配置过程 1. 打开网关配置软件“”新建项目并添加模块PN2DPM并设置参数 2. 设置网关的Profibus参数。如站地址,波特率等。(…

【计算机常识】--环境变量

在 Linux/Unix 系统中,​​环境变量(Environment Variables)​​是操作系统或用户设置的全局参数,用于存储系统或程序的配置信息。其中,​​PATH​​ 是最重要的环境变量之一,它决定了系统在哪些目录中查找…

孙颖莎含泪感谢邱贻可 坚定追求大满贯梦想

孙颖莎含泪感谢邱贻可 坚定追求大满贯梦想!5月29日,在多哈世乒赛上,孙颖莎实现了混双三连冠并卫冕女单冠军。她坦言为自己感到骄傲与感动。当被问及是否还怀揣着实现大满贯的梦想时,孙颖莎坚定回答:“必须的!”采访中,她眼含热泪向邱贻可指导表示感谢,并表示希望未来能…

行为型:观察者模式

目录 1、核心思想 2、实现方式 2.1 模式结构 2.2 实现案例 3、优缺点分析 4、适用场景 5、注意事项 1、核心思想 目的:针对被观察对象与观察者对象之间一对多的依赖关系建立起一种行为自动触发机制,当被观察对象状态发生变化时主动对外发起广播&…

中国已不是美留学生第一大来源国 印度反超夺魁

中国已不是美留学生第一大来源国 印度反超夺魁!赴美留学的国际学生中,中国已不再是最多的。根据最新数据,印度已成为美国高校留学生的第一大来源国,占比29.4%(约33.1万人),而中国排在第二位,占比24.6%(约27.7万人)。两国留学生人数合计已经超过一半。过去,中国长期占…

Unity-QFramework框架学习-MVC、Command、Event、Utility、System、BindableProperty

QFramework QFramework简介 QFramework是一套渐进式、快速开发框架,适用于任何类型的游戏及应用项目,它包含一套开发架构和大量的工具集 QFramework的特性 简洁性:QFramework 强调代码的简洁性和易用性,让开发者能够快速上手&a…

【代码训练营Day02】数组part2

文章目录 长度最小的子数组螺旋矩阵II数组总结 长度最小的子数组 题目链接:209. 长度最小的子数组 滑动窗口法的解题思路: 首先初始化双指针,都指向数组头部end指针依次向后滑,每向后滑一项就加一项,直到满足要求达到…

千年后中国人又在举国之力挖运河 新运河时代来临

千年后中国人又在举国之力挖运河 新运河时代来临!近日,浙江《关于高水平建设“航运浙江”的实施意见》正式实施,明确提出“谋划推进浙赣运河”。这一消息再次引起热议。作为浙赣粤运河的一部分,浙赣运河途经浙江杭州、衢州和江西上饶、鹰潭、南昌等城市,规划全长约760公里…

网关Gateway

目录 Gateway作用 Gateway使用 Gateway作用 在微服务项目中,没有引入网关时,项目架构如下: 引入网关后,架构如下: 引入网关后,有如下优势: 1、客户端请求经过网关向后台统一分发请求&#xff0c…

Python打卡训练营-Day15-复习日

浙大疏锦行 作业: 尝试找到一个kaggle或者其他地方的结构化数据集,用之前的内容完成一个全新的项目,这样你也是独立完成了一个专属于自己的项目。 要求: 有数据地址的提供数据地址,没有地址的上传网盘贴出地址即可。尽…