【Redis】string

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.pswp.cn/bicheng/82972.shtml

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

相关文章

基于ELK的分布式日志实时分析与可视化系统设计

目录 一、ELK平台介绍 1.ELK概述 2.Elasticsearch 3.Logstash 4.Kibana 二、部署ES群集 1.资源清单 2.基本配置 3.安装Elasticsearch(elk1上、elk2上、elk3上) 4.安装logstash(elk1上) 5.Filebeat 6.安装Kibana&#x…

电机控制选 STM32 还是 DSP?技术选型背后的现实博弈

现在搞电机控制,圈里人都门儿清 —— 主流方案早就被 STM32 这些 Cortex-M 单片机给拿捏了。可要是撞上系统里的老甲方,技术认知还停留在诺基亚砸核桃的年代,非揪着 DSP 不放,咱也只能赔笑脸:“您老说的对,…

【案例分享】蓝牙红外线影音遥控键盘:瑞昱RTL8752CJF

蓝牙红外线影音遥控键盘 Remotec的无线控制键盘采用瑞昱蓝牙RTL8752CJF解决方案,透过蓝牙5.0与手机配对后,连线至 Remotec 红外 code server 取得对应影音视觉设备的红外 code后,即可控制多达2个以上的影音视觉设备,像是智能电视…

PostgreSQL如何更新和删除表数据

这节说下怎样更新和删除表数据,当然认识命令了,可以问AI帮忙写。 接上节先看下天气表weather的数据,增加了杭州和西安的数据: 一.UPDATE更新命令 用UPDATE命令更新现有的行。 假设所有 杭州 5月12日的温度低了两度,用…

简单三步FastAdmin 开源框架的安装

简单三步FastAdmin 开源框架的安装 第一步:新建站点1,在宝塔面板中,创建一个新的站点,并填写项目域名。 第二步:上传框架1,框架下载2,上传解压缩 第三步:配置并安装1,进入…

使用 pytesseract 构建一个简单 OCR demo

简介 pytesseract 库是 Google Tesseract OCR (光学字符识别)引擎的一个 Python 封装库,使用广泛且功能强大。 构建 使用 pytesseract 构建一个简单 OCR demo。 步骤一:安装必要的库 您需要在您的 Python 环境中安装 pytessera…

十三: 神经网络的学习

这里所说的“学习”是指从训练数据中自动获取最优权重参数的过程。为了使神经网络能进行学习,将导入损失函数这一指标。而学习的目的就是以该损失函数为基准,找出能使它的值达到最小的权重参数。为了找出尽可能小的损失函数的值,我们将介绍利…

AWS 创建VPC 并且添加权限控制

AWS 创建VPC 并且添加权限控制 以下是完整的从0到1在AWS中创建VPC并配置权限的步骤(包含网络配置、安全组权限和实例访问): 1. 创建VPC 步骤: 登录AWS控制台 访问 AWS VPC控制台,点击 创建VPC。 配置基础信息 名称…

ICASSP2025丨融合语音停顿信息与语言模型的阿尔兹海默病检测

阿尔兹海默病(Alzheimers Disease, AD)是一种以认知能力下降和记忆丧失为特征的渐进性神经退行性疾病,及早发现对于其干预和治疗至关重要。近期,清华大学语音与音频技术实验室(SATLab)提出了一种将停顿信息…

C# 导出word 插入公式问题

最近遇到了一个问题,下载一个文档时需要下载word可编辑的公式。找了很久终于找到了一种解决办法。下面是以C#代码来实现在Word中插入公式的功能。 目录 一、引入dll程序集文件1、通过 NuGet 引入dll(2种方法)的方法:2、手动添加d…

智汇云舟携最新无人机2D地图快速重建技术亮相广西国际矿业展览会

5月22至25日,广西国际矿业展览会(以下简称 “矿业展”)在南宁国际会展中心成功举办。智汇云舟与合作伙伴广西空驭数智信息技术有限公司携无人机 2D地图快速重建技术,以及视频孪生智慧矿山解决方案参会,为矿山行业数字化…

OpenSSL 签名验证详解:PKCS7* p7、cafile 与 RSA 验签实现

OpenSSL 签名验证详解:PKCS7* p7、cafile 与 RSA 验签实现 摘要 本文深入剖析 OpenSSL 中 PKCS7* p7 数据结构和 cafile 的作用及相互关系,详细讲解基于 OpenSSL 的 RSA 验签字符串的 C 语言实现,涵盖签名解析、证书加载、验证流程及关键要…

9:OpenCV—模板匹配

模版匹配 1、模板匹配概念 模板匹配是一项在一副图像中寻找与另一幅模板图像最匹配(相似)部分的技术。模板匹配不是基于直方图的,而是通过在输入图像上滑动图像块(模板)同时对比相似度,来对模板和输入图像…

Composer 常规操作说明与问题处理

目录 一、 Composer 简介,安装二、全局配置三、项目配置(composer.json)3.1 composer.json 文件1. 基础字段信息2. **require(生产环境依赖)**3. **require-dev(开发环境依赖)** 3.2 composer.l…

Spring Boot 3.0与Java 17:企业级应用开发的新范式

引言 随着Spring Boot 3.0和Java 17的正式发布,企业级应用开发迎来了新的技术范式。这两项技术的结合不仅带来了性能提升,还引入了众多现代化的编程特性,为开发者提供了更强大、更高效的开发体验。本文将深入探讨Spring Boot 3.0与Java 17的…

Vue 组件 - 指令

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue指令 目录 指令写法 自定义指令 简单封装指令 指令传递字符串 update事件 指令应用 指令实现轮播 指令函数简写 指令函数列表 bind inserted update componentUpdated unbind Vue3指令轮播 nextick 总结 指…

5.28 后端面经

为什么golang在并发环境下更有优势 Go语言(Golang)在并发环境下的优势主要源自其设计哲学和内置的并发机制,这些机制在语言层面提供了高效、简洁且安全的并发编程工具。以下是其核心优势的详细分析: 1. Goroutine:轻量…

Linux线程入门

目录 Linux线程概念 什么是线程 重新理解进程 线程的优点 线程的缺点 线程的异常 线程用途 Linux线程概念 什么是线程 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”。一切进程至…

通信应用高速模数转换器ADC

在5G通信、医疗成像、航空航天及工业自动化等关键领域,高速ADC模数转换器作为信号链的“心脏”,其性能直接决定了系统的精度与效率。然而,如何精确测试高速ADC的动态参数、优化设计验证流程、应对复杂应用场景的挑战,始终是工程师…

PostgreSQL 中 JSONB 数据类型的深度解析以及如何使用

一、JSONB 核心特性解析 1. 存储结构与优势 ​​二进制存储​​:将 JSON 数据解析为二进制格式(分解键值对,去除空格和重复键)​​高效查询​​:支持 GIN/GiST 索引,查询速度比 JSON 类型快 10 倍​​数据…