01.String相关命令


APPEND key
STRLEN key
LCS key1 key2 [LEN] [IDX] [MINMATCHLEN len] [WITHMATCHLEN]

# 设置
SET key value [EX seconds|PX milliseconds|EXAT timestamp|PXAT milliseconds-timestamp|KEEPTTL] [NX|XX] [GET]
SETNX key value
SETEX key seconds value
PSETEX key milliseconds value
SETRANGE key offset value

# 获取
GET key
GETSET key value
GETRANGE key start end
GETDEL key
GETEX key [EX seconds|PX milliseconds|EXAT timestamp|PXAT milliseconds-timestamp|PERSIST]

MGET key [key ...]
MSET key value [key value ...]
MSETNE key value [key value ...]


# 自减
DECR key
DECRBY key value

# 自增
INCR key
INCRBY key value
INCRBYFLOAT key increment

LCS指令

LCS指令用于求两个字符串的最大公共子序列,目前在开发中用的比较少,所以暂时不进行研究。

SET指令

SET key value [EX seconds|PX milliseconds|EXAT timestamp|PXAT milliseconds-timestamp|KEEPTTL] [NX|XX] [GET]

EX 过期秒数
PX 过期毫秒数
EXAT 期待在某个时间戳(秒)过期
PXAT 期待在某个时间戳(毫秒)过期
KEEPTTL 保留与键关联的生存时间(如果原来的键设置了ttl,set的默认行为是取消这些ttl的关联)

NX 只有key不存在时,才进行设置
XX 只有key存在时,才进行设置

GET 返回旧的字符串,如果旧字符串不存在则返回nil。

SET命令选项可以替代SETNX、SETEX、PSETEX、GETSET,因此在未来,这些指令可能被弃用,最终被删除。

MSETNE

MSETNE key value [key value …]

同时设置一个或多个key-value对,当且仅当所有给定key都不存在时。

数据结构

String的数据结构为简单动态字符串(SDS)。是可以修改的字符串,内部结构实现上类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。

2021-12-11-11-32-36

如图所示为字符串实际分配的空间。其中capacity一般要高于实际字符串长度len。当字符串长度小于1M时,扩容都是加倍现有的空间,如果超过了1M,扩容时只会多扩1M的空间。字符串最大长度为512M。

参考资料

  1. Redis#String
  2. Redis STRALGO LCS命令与实现