详解Redis的String类型及相关命令


目录

SET

GET

MGET

MSET

SETNX

SET和SETNX和SETXX对比

INCR

INCRBY

DECR

DECRBY

INCRBYFLOAT

APPEND

GETRANGE

SETRANGE

STRLEN

内部编码



SET

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

返回值:
如果设置成功,返回 OK。
如果由于 SET 指定了 NX 或者 XX 但条件不满⾜,SET 不会执⾏,并返回 (nil)。

语法

EX seconds⸺使⽤秒作为单位设置 key 的过期时间。

PX milliseconds⸺使⽤毫秒作为单位设置 key 的过期时间。

NX ⸺只在 key 不存在时才进⾏设置,即如果 key 之前已经存在,设置不执⾏。

XX ⸺只在 key 存在时才进⾏设置,即如果 key 之前不存在,设置不执⾏。

举例

GET

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

语法

举例

MGET

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

语法

举例

MSET

⼀次性设置多个 key 的值。

返回值:永远是 OK。

语法

举例

使⽤ mget / mset 由于可以有效地减少了⽹络时间,所以性能相较更⾼。

SETNX

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

语法

SETNX key value

时间复杂度:O(1)

返回值:1 表⽰设置成功。0表示没有设置。

举例

复制代码
redis> MSET key1 "Hello" key2 "World"
"OK"
redis> GET key1
"Hello"
redis> GET key2
"World"
SET和SETNX和SETXX对比
INCR

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

语法

INCR key

时间复杂度:O(1)

返回值:integer 类型的加完后的数值。

举例

复制代码
redis> SET mykey "10"
"OK"
redis> INCR mykey
(integer) 11
redis> GET mykey
"11"
INCRBY

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

语法

INCRBY key decrement

举例

复制代码
redis> SET mykey "10"
"OK"
redis> INCRBY mykey 5
(integer) 15

时间复杂度:O(1)
返回值:integer 类型的加完后的数值。

DECR

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

语法

DECR key

时间复杂度:O(1)

返回值:integer 类型的减完后的数值。

举例

复制代码
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
DECRBY

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

语法

DECRBY key decrement

时间复杂度:O(1)

返回值:integer 类型的减完后的数值。

举例

复制代码
redis> SET mykey "10"
"OK"
redis> DECRBY mykey 3
(integer) 7
INCRBYFLOAT

将 key 对应的 string 表⽰的浮点数加上对应的值。如果对应的值是负数,则视为减去对应的值。如果key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的不是 string,或者不是⼀个浮点数,则报错。允许采⽤科学计数法表⽰浮点数。

语法

INCRBYFLOAT key increment

时间复杂度: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"
APPEND

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

语法

APPEND KEY VALUE

时间复杂度:O(1). 追加的字符串⼀般⻓度较短, 可以视为 O(1).

返回值:追加完成之后 string 的⻓度。

举例

复制代码
redis> EXISTS mykey
(integer) 0
redis> APPEND mykey "Hello"
(integer) 5
redis> APPEND mykey " World"
(integer) 11
redis> GET mykey
"Hello World"
GETRANGE

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

语法

GETRANGE key start end

时间复杂度: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

时间复杂度: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

时间复杂度:O(1)

返回值:string 的⻓度。或者当 key 不存在时,返回 0。

举例

复制代码
redis> SET mykey "Hello world"
"OK"
redis> STRLEN mykey
(integer) 11
redis> STRLEN nonexisting
(integer) 0
内部编码

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

应用场景

1.缓存功能:

String类型常用于缓存经常访问的数据,如数据库查询结果、网页内容等,以提高访问速度和降低数据库的压力。

在商品系统中,商品的详细信息如描述、价格、库存等数据通常不会频繁变动,但会被频繁查询。每次用户访问商品详情时,都直接从数据库查询这些信息会导致不必要的数据库负载。而Redis作为内存数据库,提供极速的读写能力,可以大幅降低数据访问延迟,提升用户体验。

当商品信息更新时,相应的缓存可以更新或失效,以保证数据的实时性和一致性。

2.计数器:

利用INCR和DECR命令,String类型可以作为计数器使用,适用于统计如网页访问量、商品库存数量等。

对于文章的浏览量的统计,每篇博客文章都有一个唯一的标识符(例如文章ID)。每次文章被访问时,文章ID对应的浏览次数在Redis中递增。这样可以实时更新和获取文章的浏览次数,并且Redis的原子操作保证了高并发场景下的计数准确性。

3.分布式锁:

通过SETNX命令(仅当键不存在时设置值),String类型可以实现分布式锁,保证在分布式系统中的互斥访问。

在分布式系统中,如电商的秒杀活动或库存管理,需要确保同一时间只有一个进程或线程可以修改共享资源,以避免数据不一致的问题。使用Redis的SETNX命令可以实现分布式锁的获取和释放,通过Lua脚本确保释放锁时的原子性。

4.分布式Session:

在使用nginx做负载均衡的场景中,如果每个从服务器上都各自存储自己的session,那么当切换了服务器后,session信息会由于不共享而丢失。此时可以考虑使用Redis等非关系型数据库来存储session。

Redis的读写性能远高于关系型数据库,因此更适合用于存储session信息。

5.全局唯一值生成:

有时候需要生成一个全局唯一值,可以通过Redis的INCRBY等命令来实现。例如,可以设置一个初始值,然后每次需要生成唯一值时都对该值进行自增操作。

6.存储对象:

虽然String类型也可以存储对象(通常是将对象序列化为JSON字符串),但更推荐的做法是使用Hash类型来存储对象。不过,在一些简单场景下,或者当对象属性不经常变化时,仍然可以使用String类型来存储对象。

7.验证码存储与验证:

在一些需要验证码验证的场景中(如登录、注册、找回密码等),可以将验证码存储在Redis中,并设置一个过期时间。当用户提交验证码进行验证时,从Redis中取出对应的验证码进行比对。如果验证通过,则删除该验证码;如果验证失败或验证码已过期,则进行相应的处理。

欢迎大家访问我的主页!!!

相关推荐
爱的叹息3 小时前
Spring Boot 集成Redis 的Lua脚本详解
spring boot·redis·lua
morris13110 小时前
【redis】redis实现分布式锁
数据库·redis·缓存·分布式锁
爱的叹息12 小时前
spring boot集成reids的 RedisTemplate 序列化器详细对比(官方及非官方)
redis
weitinting13 小时前
Ali linux 通过yum安装redis
linux·redis
纪元A梦14 小时前
Redis最佳实践——首页推荐与商品列表缓存详解
数据库·redis·缓存
爱的叹息21 小时前
Java 连接 Redis 的驱动(Jedis、Lettuce、Redisson、Spring Data Redis)分类及对比
java·redis·spring
松韬1 天前
Spring + Redisson:从 0 到 1 搭建高可用分布式缓存系统
java·redis·分布式·spring·缓存
天上掉下来个程小白1 天前
Redis-14.在Java中操作Redis-Spring Data Redis使用方式-操作列表类型的数据
java·redis·spring·springboot·苍穹外卖
·云扬·1 天前
深度剖析 MySQL 与 Redis 缓存一致性:理论、方案与实战
redis·mysql·缓存
汤姆大聪明1 天前
Redisson 操作 Redis Stream 消息队列详解及实战案例
redis·spring·缓存·maven