Redis中String类型的基本命令

2024-09-06 11:20

本文主要是介绍Redis中String类型的基本命令,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、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 keyreturn 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 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;}
}

这篇关于Redis中String类型的基本命令的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1141866

相关文章

基本知识点

1、c++的输入加上ios::sync_with_stdio(false);  等价于 c的输入,读取速度会加快(但是在字符串的题里面和容易出现问题) 2、lower_bound()和upper_bound() iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。 iterator upper_bou

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

30常用 Maven 命令

Maven 是一个强大的项目管理和构建工具,它广泛用于 Java 项目的依赖管理、构建流程和插件集成。Maven 的命令行工具提供了大量的命令来帮助开发人员管理项目的生命周期、依赖和插件。以下是 常用 Maven 命令的使用场景及其详细解释。 1. mvn clean 使用场景:清理项目的生成目录,通常用于删除项目中自动生成的文件(如 target/ 目录)。共性规律:清理操作

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

Mysql BLOB类型介绍

BLOB类型的字段用于存储二进制数据 在MySQL中,BLOB类型,包括:TinyBlob、Blob、MediumBlob、LongBlob,这几个类型之间的唯一区别是在存储的大小不同。 TinyBlob 最大 255 Blob 最大 65K MediumBlob 最大 16M LongBlob 最大 4G

C 语言的基本数据类型

C 语言的基本数据类型 注:本文面向 C 语言初学者,如果你是熟手,那就不用看了。 有人问我,char、short、int、long、float、double 等这些关键字到底是什么意思,如果说他们是数据类型的话,那么为啥有这么多数据类型呢? 如果写了一句: int a; 那么执行的时候在内存中会有什么变化呢? 橡皮泥大家都玩过吧,一般你买橡皮泥的时候,店家会赠送一些模板。 上