String 型 Value 操作命令

11/26/2023 缓存Redis

Redis 存储数据的 Value 可以是一个 String 类型数据。String 类型的Value 是 Redis 中最基本,最常见的类型。String 类型的 Value 中可以存放任意数据,包括数值型,甚至是二进制的图片、音频、视频、序列化对象等。一个 String 类型的 Value 最大是 512M 大小。

# 一、set

● 格式:SET key value [EX seconds | PX milliseconds] [NX|XX]
● 功能:SET 除了可以直接将 key 的值设为 value 外,还可以指定一些参数。
 ◆ EX seconds:为当前 key 设置过期时间,单位秒。等价于 SETEX 命令。
 ◆ PX milliseconds:为当前 key 设置过期时间,单位毫秒。等价于 PSETEX 命令。
 ◆ NX:指定的 key 不存在才会设置成功,用于添加指定的 key。等价于 SETNX 命令。
 ◆ XX:指定的 key 必须存在才会设置成功,用于更新指定key 的value。
● 说明:如果value 字符串中带有空格,则该字符串需要使用双引号或单引号引起来,否则会认为 set 命令的参数数量不正确,报错。

# 二、setex 与 psetex

● 格式:SETEX/PSETEX key seconds value
● 功能:set expire,其不仅为 key 指定了value,还为其设置了生存时间。setex 的单位为秒,psetex 的单位为毫秒。
● 说明:如果 key 已经存在, 则覆写旧值。该命令类似于以下两个命令,不同之处是, SETEX 是一个原子性操作,关联值和设置生存时间两个动作会在同一时间内完成,该命令在 Redis 用作缓存时,非常实用。

# 三、setnx

● 格式:SETNX key value
● 功能:SET if Not eXists,将 key 的值设为 value ,当且仅当 key 不存在。若给定的 key
已经存在,则 SETNX 不做任何动作。成功,返回 1,否则,返回 0。
● 说明:该命令等价于 set key value nx

# 四、getset

● 格式:GETSET key value
● 功能:将给定 key 的值设为 value ,并返回 key 的旧值。
● 说明:当 key 存在但不是字符串类型时,返回一个错误;当 key 不存在时,返回 nil。

# 五、mset 与 msetnx

● 格式:MSET/MSETNX key value [key value ...]
● 功能:同时设置一个或多个 key-value 对。
● 说明:如果某个给定 key 已经存在,那么 MSET 会用新值覆盖原来的旧值,如果这不 是你所希望的效果,请考虑使用 MSETNX 命令:它只会在所有给定 key 都不存在的情 况下进行设置操作。MSET/MSETNX 是一个原子性(atomic)操作,所有给定 key 都会在同 一时间内被设置,某些给定 key 被更新而另一些给定 key 没有改变的情况不可能发生。该命令永不失败。

# 六、mget

● 格式:MGET key [key ...]
● 功能:返回所有(一个或多个)给定 key 的值。
● 说明:如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil。因此,该命令永不失败。

# 七、append

● 格式:APPEND key value
● 功能:如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。如果 key 不存在, APPEND 就简单地将给定 key 设为 value ,就像执行 SET key value 一样。
● 说明:追加 value 之后,key 中字符串的长度。

# 八、incr 与 decr

● 格式:INCR key 或 DECR key
● 功能:increment,自动递增。将 key 中存储的数字值增一。decrement,自动递减。将 key 中存储的数字值减一。
● 说明:如果 key 不存在,那么 key 的值会先被初始化为 0,然后再执行增一/减一操作。如果值不能表示为数字,那么返回一个错误提示。如果执行正确,则返回增一/减一后的值。

# 九、incrby 与 decrby

● 格式:INCRBY key increment 或 DECRBY key decrement
● 功能:将 key 中存储的数字值增加/减少指定的数值,这个数值只能是整数,可以是负数,但不能是小数。
● 说明:如果 key 不存在,那么 key 的值会先被初始化为 0,然后再执行增/减操作。如果值不能表示为数字,那么返回一个错误提示。如果执行正确,则返回增/减后的值。

# 十、incrbyfloat

● 格式:INCRBYFLOAT key increment
● 功能:为 key 中所储存的值加上浮点数增量 increment 。
● 说明:与之前的说明相同。没有 decrbyfloat 命令,但 increment 为负数可以实现减操作效果。

# 十一、strlen

● 格式:STRLEN key
● 功能:返回 key 所储存的字符串值的长度。
● 说明:当 key 储存的不是字符串值时,返回一个错误;当 key 不存在时,返回 0 。

# 十二、getrange

● 格式:GETRANGE key start end
● 功能:返回 key 中字符串值的子字符串,字符串的截取范围由 start 和 end 两个偏移量决定,包括 start 和 end 在内。
● 说明:end 必须要比 start 大。支持负数偏移量,表示从字符串最后开始计数,-1 表示最后一个字符,-2 表示倒数第二个,以此类推。

# 十三、setrange

● 格式:SETRANGE key offset value
● 功能:用 value 参数替换给定 key 所储存的字符串值 str,从偏移量 offset 开始。
● 说明:当 offset 值大于 str 长度时,中间使用零字节\x00 填充,即 0000 0000 字节填充;对于不存在的 key 当作空串处理。

# 十四、位操作命令

名称中包含 BIT 的命令,都是对二进制位的操作命令,例如,setbit、getbit、bitcount、bittop、bitfield,这些命令不常用。

# 十五、典型应用场景

Value 为 String 类型的应用场景很多,这里仅举这种典型应用场景的例子:

# 1、数据缓存

Redis 作为数据缓存层,MySQL 作为数据存储层。应用服务器首先从 Redis 中获取数据,如果缓存层中没有,则从MySQL 中获取后先存入缓存层再返回给应用服务器。

# 2、计数器

在 Redis 中写入一个 value 为数值型的 key 作为平台计数器、视频播放计数器等。每个有效客户端访问一次,或视频每播放一次,都是直接修改 Redis 中的计数器,然后再以异步方式持久化到其它数据源中,例如持久化到 MySQL。

# 3、共享Session

image.png
对于一个分布式应用系统,如果将类似用户登录信息这样的 Session 数据保存在提供登录服务的服务器中,那么如果用户再次提交像收藏、支付等请求时可能会出现问题:在提供收藏、支付等服务的服务器中并没有该用户的 Session 数据,从而导致该用户需要重新登录。对于用户来说,这是不能接受的。
此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从Redis 中查找相应的Session 数据,如果存在,则再进行相关操作,否则跳转到登录页面。这样就不会引发“重新登录”问题。

# 4、限速器

现在很多平台为了防止 DoS(Denial of Service,拒绝服务)攻击,一般都会限制一个 IP不能在一秒内访问超过 n 次。而 Redis 可以可以结合 key 的过期时间与 incr 命令来完成限速功能,充当限速器。
注意,其无法防止 DDoS(Distributed Denial of Service,分布式拒绝服务)攻击。

//客户端每提交一次请求,都会执行下面的代码
//等价于 set 192.168.192.55 1 ex 60 nx
//指定新 ip 作为 key 的缓存过期时间为 60 秒
Boolean isExists = redis.set(ip, 1, "EX 60", "NX");
if(isExists != null || redis.incr(ip) <= 5) {
	// 通过
} else {
    // 限流限流
}
1
2
3
4
5
6
7
8
9