redis—String字符串

目录

前言

1.字符串数据类型

2.常见命令

3.典型应用场景


前言

字符串类型是Redis最基础的数据类型,关于字符串需要特别注意: 1)首先Redis中所有的键的类型都是字符串类型,而且其他几种数据结构也都是在字符串类似基础.上构建的,例如列表和集合的
元素类型是字符串类型,所以字符串类型能为其他4种数据结构的学习奠定基础。2) 其次,如图2-7所示,字符串类型的值实际可以是字符串,包含-般格式的字符串或者类似JSON、XML 格式的字符串;数字,可以是整型或者浮点型;甚至是二进制流数据,例如图片、音频、视频等。不过一个字符串的最大值不能超过512 MB。

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

1.字符串数据类型

2.常见命令

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

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

命令有效版本: 1.0.0之后
时间复杂度: 0(1)
选项:
SET命令支持多种选项来影响它的行为:
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"
redis> GET mykey # 10秒之后
(nil)

GET
获取key对应的value。如果key不存在,返回nilo如果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,返回nilo
语法:

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"

图2-8多次get vs单次mget:

如图2-8所示,使用mget / mset由于可以有效地减少了网络时间,所以性能相较更高。假设网络耗
时1毫秒,命令执行时间耗时0.1毫秒,则执行时间如表2-2所示。

表2-21000次get和1次mget对比:

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

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

SETNX key value 

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

redis> SETNX mykey "Hello"
(integer) 1
redis> SETNX mykey "World"
(integer) 0
redis> GET mykey
"Hello"

SET、SET NX和SET XX的执行流程如图2-9所示。
图2-9SET、SET NX、SET XX执行流程

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 "234293482390480948029348230948"
"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) ERR value is not an integer or out of range
redis> SET mykey "234293482390480948029348230948"
"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 "234293482390480948029348230948"
"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

DECYBY
将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) ERR value is not an integer or out of range
redis> SET mykey "234293482390480948029348230948"
"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比较短,通常视为0(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" 1
"OK"
redis> STRLEN mykey
(integer) 11
redis> STRLEN nonexisting
(integer) 0

命令小结
表2-3是字符串类型命令的效果、时间复杂度,开发人员可以参考此表,结合自身业务需求和数
据大小选择合适的命令。

字符串类型命令小结:

内部编码
字符串类型的内部编码有3种:
●int: 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"

3.典型应用场景

缓存功能:

redis作为缓冲层,MySQL作为存储层,绝大部分的请求数据都是从redis中获取,由于redis支持高并发的特性,所以缓存能够起到加速读写降低后端压力的作用。

redis和MySQL组成的缓存存储结构

计数(Counter) 功能
许多应用都会使用Redis作为计数的基础工具,它可以实现快速计数、查询缓存的功能,同时数
据可以异步处理或者落地到其他数据源。如图2-11所示,例如视频网站的视频播放次数可以使用
Redis来完成:用户每播放- -次视频,相应的视频播放数就会自增1。
图2-11记录视频播放次数

共享会话(Session)
如图2-12所示,一个分布式Web服务将用户的Session信息(例如用户登录信息)保存在各自的服务器中,但这样会造成一个问题:出于负载均衡的考虑,分布式服务会将用户的访问请求均衡到不同的服务器上,并且通常无法保证用户每次请求都会被均衡到同一台服务器上,这样当用户刷新一
次访问是可能会发现需要重新登录,这个问题是用户无法容忍的。
图2-12 Session分散存储

为了解决这个问题,可以使用Redis将用户的Session信息进行集中管理,如图2-13所示,在这种模
式下,只要保证Redis是高可用和可扩展性的,无论用户被均衡到哪台Web服务器上,都集中Redis中查询、更新Session信息。
图2-13 Redis集中管理Session

手机验证码
很多应用出于安全考虑,会在每次进行登录时,让用户输入手机号并且配合给手机发送验证码,然后让用户再次输入收到的验证码并进行验证,从而确定是否是用户本人。为了短信接口不会频繁访
问,会限制用户每分钟获取验证码的频率,例如一分钟不能超过5次,如图2-14所示。
图2-14短信验证码

此功能可以使用以下伪代码说明基本实现思路:

String 发送验证码(phoneNumber) {key = "shortMsg:limit:" + phoneNumber;// 设置过期时间为 1 分钟(60 秒)// 使⽤ NX,只在不存在 key 时才能设置成功bool r = Redis 执⾏命令:set key 1 ex 60 nxif (r == false) {// 说明之前设置过该⼿机的验证码了long c = Redis 执⾏命令:incr keyif (c > 5) {// 说明超过了⼀分钟 5 次的限制了// 限制发送return null;}}// 说明要么之前没有设置过⼿机的验证码;要么次数没有超过 5 次String validationCode = ⽣成随机的 6 位数的验证码();validationKey = "validation:" + phoneNumber;// 验证码 5 分钟(300 秒)内有效Redis 执⾏命令:set validationKey validationCode ex 300;// 返回验证码,随后通过⼿机短信发送给⽤⼾return validationCode ;
}
// 验证用户输⼊的验证码是否正确
bool 验证验证码(phoneNumber, validationCode) {validationKey = "validation:" + phoneNumber;String value = Redis 执⾏命令:get validationKey;if (value == null) {// 说明没有这个⼿机的验证码记录,验证失败return false;}if (value == validationCode) {return true;} else {return false;}
}

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

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

相关文章

【2024 行人重识别最新进展】ReID3D:首个关注激光雷达行人 ReID 的工作!

【2024 行人重识别最新进展】ReID3D:首个关注激光雷达行人 ReID 的工作! 摘要:数据集:方法模型:多任务预训练:ReID Network: 实验结果:结论: 来源:Arxiv 2023…

图像分割算法

(车载)毫米波雷达的静止“目标”滤除问题 https://blog.csdn.net/xhblair/article/details/130849777 车载与体征/手势检测 毫米波雷达信号处理流程 csdn链接 专利-一种基于FPGA的步进频高分辨近程雷达探测系统和方法与流程 https://www.xjishu.com/zhuanli/52/2022114681…

drf知识--05

两个视图基类 # APIView:之前一直在用---》drf提供的最顶层的父类---》以后所有视图类,都继承自它 # GenericAPIView:继承自APIView--》封装 继承APIView序列化类Response写接口 # urls.py--总路由 from django.contrib import admin from dj…

ElasticSearch 使用映射定义索引结构

动态映射 dynamic 可选值解释true默认值,启用动态映射,新增的字段会添加到映射中runtime查询时动态添加到映射中false禁用动态映射,忽略未知字段strict发现未知字段,抛出异常 显示映射 创建映射 PUT user {"mappings&qu…

Elasticsearch可视化平台Kibana [ES系列] - 第498篇

历史文章(文章累计490) 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 全…

three.js后处理(发光描边OutlinePass描边样式

效果&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div class"box-right"></div>&…

圆通速递查询,圆通速递单号查询,对需要的单号记录进行标记

随着网购的普及&#xff0c;快递服务已经深入到我们生活的方方面面,我们每天都需要处理大量的快递信息,为了更高效地管理这些信息&#xff0c;【快递批量查询高手】应运而生。 所需工具&#xff1a; 一个【快递批量查询高手】软件 圆通速递单号若干 操作步骤&#xff1a; …

不同参数规模大语言模型在不同微调方法下所需要的显存总结

原文来自DataLearnerAI官方网站&#xff1a; 不同参数规模大语言模型在不同微调方法下所需要的显存总结 | 数据学习者官方网站(Datalearner)https://www.datalearner.com/blog/1051703254378255 大模型的微调是当前很多人都在做的事情。微调可以让大语言模型适应特定领域的任…

【Qt-发布】

Qt编程指南 ■ Qt版本发布■■■ ■ Qt版本发布 生成Release版本。LordCard.exe.查看windeployqt.exe所在目录。 E:\install\Qt\Qt5.14.2\5.14.2\mingw73_64\bin\windeployqt.exe 如果已经将这个路径设置到环境变量中了&#xff0c;那么在当前操作系统的任意目录下都可以访问 …

【华为OD题库-105】滑动窗口最大值-java

题目 题目描述: 有一个N个整数的数组&#xff0c;和一个长度为M的窗口&#xff0c;窗口从数组内的第一个数开始滑动直到窗口不能滑动为止&#xff0c;每次窗口滑动产生一个窗口和&#xff08;窗口内所有数的和)&#xff0c;求窗口滑动产生的所有窗口和的最大值。 输入描述: 第一…

口算练习题(字符串处理)#洛谷

题目描述 王老师正在教简单算术运算。细心的王老师收集了i道学生经常做错的口算题&#xff0c;并且想整理编写成一份练习。 编排这些题目是一件繁琐的事情&#xff0c;为此他想用计算机程序来提高工作效率。王老师希望尽量减少输入的工作量&#xff0c;比如 58 \texttt{58} 5…

IntelliJ IDEA快捷键及调试

文章目录 一、IntelliJ IDEA 常用快捷键一览表1-IDEA的日常快捷键第1组&#xff1a;通用型第2组&#xff1a;提高编写速度&#xff08;上&#xff09;第3组&#xff1a;提高编写速度&#xff08;下&#xff09;第4组&#xff1a;类结构、查找和查看源码第5组&#xff1a;查找、…

05|提示工程(下):用思维链和思维树提升模型思考质量 ## 什么是 Chain of Thought

05&#xff5c;提示工程&#xff08;下&#xff09;&#xff1a;用思维链和思维树提升模型思考质量 什么是 Chain of Thought CoT 这个概念来源于学术界&#xff0c;是谷歌大脑的 Jason Wei 等人于 2022 年在论文《Chain-of-Thought Prompting Elicits Reasoning in Large La…

R-列表、矩阵、数组转化为向量

目录 一、c()函数 二、unlist()函数 一、c()函数 c()&#xff1a;对应的英文是combine. 当你使用c()函数时&#xff0c;它会将输入的对象连接成一个向量。因此&#xff0c;无论输入是矩阵、数组还是列表&#xff0c;c()函数都会将它们连接成一个简单的向量。因此&#xff…

Linux操作系统—磁盘和文件系统管理实用

1. 硬盘和分区基础&#xff1a; - Linux使用设备文件&#xff08;例如 /dev/sda&#xff09;来表示硬盘。 - 使用fdisk或parted等工具对硬盘进行分区。 # 示例&#xff1a;使用fdisk进行分区 sudo fdisk /dev/sda 2. 查看磁盘信息&#xff1a; - 使用lsblk或fdisk查看系统…

k8s修改/etc/resolve.conf导致容器域名解析失败

问题&#xff1a; 因为用户原因&#xff0c;修改了k8s主机中/etc/resolve.conf的dns地址&#xff0c;产生的现象就是主机可以解析域名&#xff0c;但是pod不能解析域名; 原因&#xff1a; CoreDNS 是 Kubernetes 集群中的默认 DNS 服务器&#xff0c;负责处理集群内的 DNS 解…

使用代码生成工具快速开发应用-结合后端Web API提供接口和前端页面快速生成,实现通用的业务编码规则管理

1、通用的业务编码规则的管理功能 在前面随笔我们介绍了一个通用的业务编码规则的管理功能&#xff0c;通过代码生成工具Database2Sharp一步步的生成相关的后端和Winform、WPF的界面&#xff0c;进行了整合&#xff0c;通过利用代码生成工具Database2sharp生成节省了常规功能的…

DreamTuner :通过单张图片实现主题驱动的图像生成

该项目由字节跳动开发&#xff0c;你只需要提供一张图片&#xff0c;DreamTuner就能帮你生成与这张图片在主题和风格上一致的新图像。比如你有一张可乐照片&#xff0c;它可以根据你的要求将可乐放在任何场景中或添加其他元素形成一张完美海报&#xff01; 这个工具特别适用于需…

PyAV 使用浅谈

背景&#xff1a; PyAV是一个用于音频和视频处理的Python库&#xff0c;它提供了一个简单而强大的接口&#xff0c;用于解码、编码、处理和分析各种音频和视频格式。PyAV基于FFmpeg多媒体框架&#xff0c;它本质上是FFmpeg 的Python绑定&#xff0c;因此可以利用FFmpeg的功能来…

【MySQL】数据库之事务

目录 一、什么是事务 二、事务的ACID是什么&#xff1f; 三、有哪些典型的不一致性问题&#xff1f; 第一种&#xff1a;脏读 第二种&#xff1a;不可重复读 第三种&#xff1a;幻读 第四种&#xff1a;丢失更新 四、隔离级别有哪些&#xff1f; &#xff08;1&#xf…