Redis中String类型的基本命令

news2024/9/20 20:26:07

文章目录

  • 一、String字符串简介
  • 二、常见命令
    • set
    • get
    • mget
    • mset
    • setnx
    • incr
    • incrby
    • decr
    • decrby
    • incrbyfloat
    • append
    • getrange
    • setrange
    • strlen
  • 三、命令小结
  • 四、字符串内部编码
  • 五、String典型使用场景
    • 1. 缓存(Cache)功能
    • 2. 计数功能
    • 3. 共享会话(Session)
    • 4. 手机验证码


一、String字符串简介

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

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

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

在这里插入图片描述

二、常见命令

set

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)。
  • 示例:

在这里插入图片描述

get

GET

  • 获取 key 对应的 value。如果 key 不存在,返回nil。如果value的数据类型不是string,会报错。
  • 语法:
get key
  • 时间复杂度:O(1)
  • 返回值:key对应的value,或者nil当key不存在。
  • 示例:
    在这里插入图片描述

mget

MGET

  • 一次性获取多个 key 的值。如果对应的 key不存在或者对应的数据类型不是 string,返回 nil。
  • 语法:
MGET key [key ...]
  • 命令有效版本:1.0.0 之后

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

  • 返回值: 对应 value 的列表

  • 示例:

在这里插入图片描述

mset

MSET

  • 一次性设置多个 key 的值。
  • 语法:
MSET key value [key value ...]
  • 命令有效版本:1.0.1之后
  • 时间复杂度: O(N)N 是 key 数量
  • 返回值: 永远是 OK
  • 示例:

在这里插入图片描述

多次get对比单次mget

在这里插入图片描述
在这里插入图片描述
如图2-8 所示,使用 mget / mset 由于可以有效减少网络时间,所以性能相较更高。假设网络耗时1毫秒,命令执行时间耗时0.1毫秒,则执行时间如表 2-2 所示。
以下是将您提供的信息整理成表格的形式:

操作次数耗时(毫秒)计算方式
get100011001000 * 1 + 1000 * 0.1
mget11011 * 1 + 1000 * 0.1

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

setnx

SETNX

  • 设置 key-value 但只允许在 key 之前不存在的情况下。
  • 语法:
SETNX key value
  • 命令有效版本:1.0.0 之后
  • 时间复杂度: O(1)
  • 返回值: 1表示设置成功。0 表示没有设置。
  • 示例:

在这里插入图片描述
SET、SET NX、SET XX 执行流程

在这里插入图片描述

incr

INCR

  • 将 key 对应的 string表示的数字加一。如果 key不存在,则视为 key对应的 value 是 0。如果 key对应的 string 不是一个整型或者范围超过了 64 位有符号整型,则报错。
  • 语法:
INCR key
  • 命令有效版本: 1.0.0 之后
  • 时间复杂度:0(1)
  • 返回值: integer类型的加完后的数值。
  • 示例:

在这里插入图片描述

incrby

INCRBY

  • 将 key 对应的 string表示的数字加上对应的值。如果 key不存在,则视为 key 对应的 value是 0。如果 key 对应的 string 不是一个整型或者范围超过了 64 位有符号整型,则报错。
  • 语法:
INCRBY key decrement
  • 命令有效版本:1.0.0 之后
  • 时间复杂度: 0(1)
  • 返回值: integer类型的加完后的数值。
  • 示例:

在这里插入图片描述

decr

DECR

  • 将 key 对应的 string表示的数字减一。如果 key 不存在,则视为 key对应的 value 是 0。如果 key对应的 string 不是一个整型或者范围超过了 64 位有符号整型,则报错。
  • 语法:
DECR key
  • 命令有效版本:1.0.0 之后
  • 时间复杂度: 0(1)
  • 返回值: integer类型的减完后的数值
  • 示例:

在这里插入图片描述

decrby

DECYBY

  • 将 key 对应的 string表示的数字减去对应的值。如果 key不存在,则视为 key 对应的 value是0。如果 key 对应的 string 不是一个整型或者范围超过了 64 位有符号整型,则报错。
  • 语法:
DECRBY key decrement
  • 命令有效版本:1.0.0之后
  • 时间复杂度: 0(1)
  • 返回值: integer 类型的减完后的数值。
  • 示例:
    在这里插入图片描述

incrbyfloat

INCRBYFLOAT

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

在这里插入图片描述
在这里插入图片描述

append

APPEND

  • 如果 key 已经存在并且是一个 string,命令会将 value 追加到原有 string 的后边。如果 key 不存在则效果等同于 SET 命令。
  • 语法:
APPEND KEY VALUE
  • 命令有效版本:2.0.0 之后
  • 时间复杂度: 0(1).追加的字符串一般长度较短,可以视为 O(1)
  • 返回值: 追加完成之后 string 的长度。
  • 示例:

在这里插入图片描述

getrange

GETRANGE

  • 返回 key对应的 string的子串,由 start和 end确定(左闭右闭)。可以使用负数表示倒数。-1代表倒数第一个字符,-2 代表倒数第二个,其他的与此类似。超过范围的偏移量会根据 string的长度调整成正确的值,字符串下标从0开始。
  • 语法:
GETRANGE key start end
  • 命令有效版本:2.4.0 之后
  • 时间复杂度: O(N).N 为[start,end]区间的长度.由于 string 通常比较短,可以视为是 O(1)
  • 返回值: string类型的子串
  • 示例:

在这里插入图片描述

setrange

SETRANGE

  • 覆盖字符串的一部分,从指定的偏移开始。偏移量超过字符个数,填充的时候以\00填充
  • 语法:
SETRANGE key offset value
  • 命令有效版本:2.2.0 之后
  • 时间复杂度: O(N),N 为 value 的长度,由于一般给的 value 比较短,通常视为 O(1).
  • 返回值: 替换后的 string 的长度。
  • 示例:

在这里插入图片描述

strlen

STRLEN

  • 获取 key 对应的 string 的长度。当 key 存放的类似不是 string 时,报错。
  • 语法:
STRLEN key
  • 命令有效版本:2.2.0 之后
  • 时间复杂度: 0(1)
  • 返回值: string的长度。或者当 key不存在时,返回 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种:

  • int:8个字节的长整型。
  • embstr:小于等于 39 个字节的字符串。
  • raw:大于 39 个字节的字符串。

Redis 会根据当前值的类型和长度动态决定使用哪种内部编码实现。
整型类型示例如下:

短字符串示例如下:

长字符串示例如下:

五、String典型使用场景

1. 缓存(Cache)功能

图 2-10 是比较典型的缓存使用场景,其中 Redis 作为缓冲层,MySQL作为存储层,绝大部分请求的数据都是从 Redis 中获取。由于 Redis 具有支撑高并发的特性,所以缓存通常能起到加速读写和降低后端压力的作用。

图 2-10 Redis+MySQL 组成的缓存存储架构

在这里插入图片描述
下面的伪代码模拟了上图业务数据访问过程:

  1. 业务是根据用户 uid 获取用户信息
UserInfo getUserInfo(long uid) {
 ...
}
  1. 首先从 Redis 获取用户信息,我们假设用户信息保存在 “user:info:” 对应的键中:
// 根据 uid 得到 Redis 的键
String key = "user:info:" + uid;
// 尝试从 Redis 中获取对应的值
String value = Redis 执⾏命令:get key;
// 如果缓存命中(hit)
if (value != null) {
// 假设我们的⽤⼾信息按照 JSON 格式存储
UserInfo userInfo = JSON 反序列化(value);
return userInfo;
}
  1. 如果没有从 Redis 中得到用户信息,及缓存 miss,则进⼀步从 MySQL 中获取对应的信息,随后写入缓存并返回:
// 如果缓存未命中(miss)
if (value == null) {
// 从数据库中,根据 uid 获取⽤⼾信息
UserInfo userInfo = MySQL 执⾏ SQL:select * from user_info where uid = <uid>
 
// 如果表中没有 uid 对应的⽤⼾信息
if (userInfo == null) {
//响应 404
return null;
}
 
// 将⽤⼾信息序列化成 JSON 格式
String value = JSON 序列化(userInfo);
 
// 写⼊缓存,为了防⽌数据腐烂(rot),设置过期时间为 1 ⼩时(3600 秒)
Redis 执⾏命令:set key value ex 3600
 
// 返回⽤⼾信息
return userInfo;
}

通过增加缓存功能,在理想情况下,每个用户信息,一个小时期间只会有一次 MySQL查询,极大地提升了查询效率,也降低了 MySOL的访问数。

与 MVSOL等关系型数据库不同的是,Redis
没有表、字段这种命名空间,而且也没有对键名有强制要求(除了不能使用一些特殊字符)。但设计合理的键名,有利于防止键冲突和项目的可维护性,比较推荐的方式是使用"业务名:对象名:唯一标识:属性"作为键名。例如MySOL的数据库名为
vs,用户表名为 user
info,那么对应的键可以使用"'vs:user_info:6379"、“vs:user_info:6379:name"来表示,如果当前
Redis 只会被一个业务使用,可以省略业务名"vs:”。如果键名过程,则可以使用团队内部都认同的缩写替代,例如
"user:6379:friends:messages:5217"可以被"u:6379🇫🇷m:5217"代替。毕竟键名过长,还是会导致
Redis 的性能明显下降的。

2. 计数功能

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

// 在 Redis 中统计某视频的播放次数
long incrVideoCounter(long vid) {
 key = "video:" + vid;
 long count = Redis 执⾏命令:incr key
 return counter;
}

实际中要开发⼀个成熟、稳定的真实计数系统,要⾯临的挑战远不止如此简单:防作弊、按照不同维度计数、避免单点问题、数据持久化到底层数据源等。

3. 共享会话(Session)

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

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

4. 手机验证码

很多应用出于安全考虑,会在每次进行登录时,让用户输入手机号并且配合给手机发送验证码,然后让用户再次输入收到的验证码并进行验证,从而确定是否是用户本人。为了短信接口不会频繁访问,会限制用户每分钟获取验证码的频率,例如一分钟不能超过5次,如图2-14所示。
在这里插入图片描述
此功能可以用以下伪代码说明基本实现思路:

String 发送验证码(phoneNumber) {
	key = "shortMsg:limit:" + phoneNumber;
	// 设置过期时间为 1 分钟(60 秒)
	// 使⽤ NX,只在不存在 key 时才能设置成功
	bool r = Redis 执⾏命令:set key 1 ex 60 nx
		if (r == false) {
			// 说明之前设置过该⼿机的验证码了
			long c = Redis 执⾏命令:incr key
				if (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.coloradmin.cn/o/2108572.html

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

相关文章

软件测试学习笔记丨Pytest+Allure测试计算器

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/31954 项目要求 3.1 项目简介 计算器是近代人发明的可以进行数字运算的机器。 计算器通过对加法、减法、乘法、除法等功能的运算&#xff0c;将正确的结果展示在屏幕上。 可帮助人们更方便的…

FLTRNN:基于大型语言模型的机器人复杂长时任务规划

目录 一、引言二、FLTRNN框架2.1 任务分解2.2 基于语言的递归神经网络&#xff08;Language-Based RNNs&#xff09;长期记忆&#xff08;Long-Term Memory, Ct&#xff09;&#xff1a;短期记忆&#xff08;Short-Term Memory, Ht&#xff09;&#xff1a; 2.3 增强推理能力的…

GAMES104:12 游戏引擎中的粒子和声效系统-学习笔记

文章目录 一&#xff0c;粒子基础Particle System二&#xff0c;粒子渲染三&#xff0c;GPU粒子及生命周期控制四&#xff0c;粒子应用五&#xff0c;声音基础5.1 Sound System5.2 Digital Sound5.3 Audio Rendering QA 一&#xff0c;粒子基础Particle System 网游里你的付费…

[数据结构]红黑树之插入操作(RBTree)

这里只着重介绍插入操作的实现&#xff1a;) 一、红黑树的概念和性质 红黑树&#xff08;Red Black Tree&#xff09;是一种自平衡的二叉搜索树。红黑树最初在1972年由Rudolf Bayer发明&#xff0c;当时被称为平衡二叉B树&#xff08;symmetric binary B-trees&#xff09;。随…

2024 年高教社杯全国大学生数学建模竞赛B题解题思路(第一版)

原文链接&#xff1a;https://www.cnblogs.com/qimoxuan/articles/18399372 赛题&#xff1a; 问题 1&#xff1a;抽样检测方案设计 分析&#xff1a; 抽样检测方案需要在保证决策准确性的同时&#xff0c;尽量减少检测成本。需要考虑抽样误差对决策的影响&#xff0c;以及如…

OCR经典神经网络(一)文本识别算法CRNN算法原理及其在icdar15数据集上的应用

OCR经典神经网络(一)文本识别算法CRNN算法原理及其在icdar15数据集上的应用 文本识别是OCR&#xff08;Optical Character Recognition&#xff09;的一个子任务&#xff0c;其任务为&#xff1a;识别一个固定区域的的文本内容。 在OCR的两阶段方法里&#xff0c;文本识别模型接…

若依框架登录鉴权详解(动态路由)

若依框架登录鉴权&#xff1a;1.获取token&#xff08;过期在响应拦截器中实现&#xff09;,2.基于RBAC模型获取用户、角色和权限信息&#xff08;在路由前置守卫&#xff09;&#xff0c;3.根据用户权限动态生成&#xff08;从字符串->组件&#xff0c;根据permission添加动…

linux搭建深度学习平台

linux搭建深度学习平台&#xff08;Ubuntu&#xff09; /home/guangyao/anaconda3 我服务器的anaconda地址 ~/anaconda3 1 首先就是打开浏览器&#xff0c;我实验室的是火狐&#xff0c;搜索anaconda下载&#xff0c;找到下载目录&#xff0c;cd进去&#xff0c; 2安装 bas…

【佳学基因检测】在bagisto中,grouped products(同组产品)和bundled products(打包产品)有什么不同?

【佳学基因检测】在bagisto中&#xff0c;grouped products&#xff08;同组产品&#xff09;和bundled products&#xff08;打包产品&#xff09;有什么不同&#xff1f; 在Bagisto电商平台中&#xff0c;**grouped products&#xff08;同组产品&#xff09;和bundled prod…

iceberg存储结构详解

iceberg底层组织方式 下图是Iceberg中表格式&#xff0c;s0、s1代表的是表Snapshot信息&#xff0c;每个表示当前操作的一个快照&#xff0c;每次commit都会生成一个快照Snapshot&#xff0c;每个Snapshot快照对应一个manifest list 元数据文件&#xff0c;每个manifest list …

2024国赛数学建模预测算法-BP神经网络模型的预测精度分析(MATLAB 实现)

人工神经网络 第一节 人工神经网络概述 在您阅读这本书的时候&#xff0c;大约有个相互连接的神经元在帮助您阅读、呼吸、思考&#xff0c;以及完成各种各样的动作。这些神经元中&#xff0c;有些有着与生俱来的功能&#xff0c;比如呼吸、吮吸&#xff0c;有些则是由后天训练…

动态规划DP--背包问题

文章目录 0-1背包问题 -- 问题定义动态规划解法代码题目&#xff1a;分割等和子集题解 0-1背包问题 – 问题定义 在 0-1 背包问题中&#xff0c;给定一个背包的最大容量 W&#xff0c;以及 n 个物品&#xff0c;每个物品有两个属性&#xff1a; 重量&#xff1a;第 i 个物品的…

[数据集][目标检测]电动车入梯进电梯电单车入梯检测数据集VOC+YOLO格式7106张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;7106 标注数量(xml文件个数)&#xff1a;7106 标注数量(txt文件个数)&#xff1a;7106 标注…

广义回归神经网络(GRNN)

一、简介 广义回归神经网络 (General Regression Neural Network &#xff0c; GRNN) 的概念是由德 国科学家多纳德提出的&#xff0c;是径向基网络的其中一种 。因为其是以数理统计为基 础的&#xff0c;因此 GRNN 可以依据样本数据逼近其中包含的非线性映射关系。即使样本 数…

家里有猫用宠物空气净化器有用吗?希喂、米家、有哈哪款更好

在快节奏的现代生活中&#xff0c;越来越多的人选择宠物作为心灵的慰藉与生活的伴侣。起初&#xff0c;这份陪伴的需求简单而纯粹&#xff0c;但随着日子一天天过去&#xff0c;那份简单的情感逐渐生根发芽&#xff0c;成长为深厚的责任与爱。我在前两年养了两只猫&#xff0c;…

一款云笔记支持在线协同文档,脑图,白板演示的工具,多个设备同步,让灵感与你同行(附源码)

前言 在快节奏的工作环境中&#xff0c;如何高-效地记录、整理并分享工作笔记已经成为了一项重要的技能。传统的笔记方式往往难以满足跨设备、即时同步以及团队协作的需求&#xff0c;导致信息孤岛和工作效率低下。面对这样的挑战&#xff0c;我们迫切需要一种全新的工具来改变…

【ArcGIS Pro原理第一期】各种空间插值原理:GPI、LPI、IDW等

ArcGIS Pro原理第一期&#xff1a;空间插值原理 空间插值方法概述1.1 全局多项式&#xff08;global polynomial interpolation, GPI&#xff09;方法原理使用范围 1.2 局部多项式&#xff08;local polynomial interpolation, LPI&#xff09;方法原理精度测量&#xff08;Mea…

echarts进度

echarts图表集 let numdata["I级",II级,III级,IV级,V级,劣V级] let pricedata40 option {backgroundColor: #0f375f,title: {show: false,text: ,left: center,top: 30%,textStyle: {color: #00D5FF,fontSize: 16,},},tooltip: {show: false},grid: {// show: true,…

鸿蒙界面开发——组件(5):菜单Menu 绑定菜单

菜单组件Menu Menu组件需和bindMenu或bindContextMenu方法配合使用&#xff0c;不支持作为普通组件单独使用。 Menu 以垂直列表形式显示的菜单。包含MenuItem、MenuItemGroup子组件。 Menu()作为菜单的固定容器&#xff0c;无参数。 MenuItem(value?: MenuItemOptions| Cust…

DC-DC开关稳压电路

前面所讲的线性稳压电路具有结构简单、调节方便、输出电压稳定性强、纹波电压小等优点。但是&#xff0c;由于调整管始终工作在放大状态&#xff0c;自身功耗较大&#xff0c;故效率较低&#xff0c;甚至仅为30%~40%。而且&#xff0c;为了解决调整管散热问题&#xff0c;必须安…