跳至主要內容

String(字符串)

mozzie大约 3 分钟Redis分布式Redis分布式

String(字符串)

String 类型是(二进制安全的),可以包含任何数据,包括二进制图片、序列化对象等。

String 类型是 Redis 最基本的数据类型,一个 Redis 字符串的 value 最多可以是 512M

常用命令

set <key> <value> # 设置一个key,value
get <key> # 根据key获取value
append <key> <value> # 在对应key的value后面追加数据,返回总长度
strlen <key> # 获取值的长度
setnx <key> <value> # 设置值,当键存在时不进行设置,键不存在才进行设置

数值操作

incr <key> # 将key中存储的值+1,返回增加后的值,只能对数字值进行操作,如果为空,新增值为1
decr <key> # 将key中存储的值-1,返回减少后的值,只能对数字值进行操作,如果为空,新增值为-1
incrby/decrby <key> <步长> # 将key中的值进行增减,长度为步长

增减操作都是原子性操作:对 Redis 而言,命令的原子性指的是:一个操作不可以再分,操作要么执行,要么不执行。Redis 的操作之所以是原子性的,是因为 Redis 是单线程的。

批量操作

mset <key1> <value1> <key2> <value2> ... # 同时对多对k-v进行赋值
mget <key1> <key2> <key3> ... # 同时获取多个value
msetnx <key1> <value1> <key2> <value2> ... # 同时设置多对值,当值存在时不进行设置,值不存在才进行设置

msetnx 同时设置多对值时,原子性操作,要么都成功要么都不成功

范围操作

# 获取值的范围,类似Java中的substring,前后都为闭区间
getrange <key> <起始位置> <结束位置>
# 根据起始位置,将key中的值覆盖为value
setrange <key> <起始位置> <value>

过期与替换

setex <key> <过期时间> <value> # 设置k-v的同时设置过期时间,单位s
getset <key> <value> # 设置新值的同时,获取旧值

底层结构

String 的底层结构为简单动态字符串(SDS),内部结构类似于 Java 的 ArrayList,采用预分配冗余空间的方式来减少内存的频繁操作。

内部为当前字符串实际分配的空间 capacity 一般要高于实际字符串长度 len。当字符串长度小于 1M 时,扩容都是加倍现有的空间;如果超过 1M,扩容时一次只会多扩 1M 的空间。需要注意的是字符串最大长度为 512M

应用场景

  • 缓存:最常见的用途,缓存数据库查询结果、页面渲染结果
  • 计数器:基于 incr/decr 的原子性,实现文章浏览量、点赞数等
  • 分布式锁:基于 setnx 配合过期时间实现简易分布式锁
  • 限流:基于 increxpire 实现固定窗口限流
  • 共享 Session:分布式系统下集中存储用户会话
贡献者: mozzie