详解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中取出对应的验证码进行比对。如果验证通过,则删除该验证码;如果验证失败或验证码已过期,则进行相应的处理。

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

相关推荐
huaseven07037 小时前
bs4基本运用
数据库·redis·缓存
ThisIsClark8 小时前
【后端面试总结】Redis的三种模式原理介绍及优缺点
redis·面试·职场和发展
无奈ieq13 小时前
Redis基本语法集合(示例+语法格式)
数据库·redis·缓存
loop lee14 小时前
Redis - 集合 Set 及代码实战
java·数据库·redis·mysql·算法
一位资深码农14 小时前
redis问题解决方法
数据库·redis·缓存
东阳马生架构18 小时前
Redis应用—7.大Value处理方案
redis
nbplus_0071 天前
Redis Set操作
数据库·redis·bootstrap
weisian1511 天前
Redis篇-11--数据结构篇3--字符串内存模型(简单动态字符串SDS)
数据结构·数据库·redis