Redis 字符串类型

285 阅读4分钟

字符串类型是 Redis 中最基本的数据类型,它能存储任何形式的字符串,包括二进制数据。一个字符串类型键允许存储的数据的最大容量是 512MB。字符串类型是其他5种数据类型的基础,例如列表类型是以列表的形式组织字符串,而集合类型是以集合的形式组织字符串。

SET

SET key value [NX|XX|EX|PX]

SET 命令可以为 key 设置值,若 key 已经存在,则会覆盖值。需要注意的是 SET 会忽略 key 的原始类型,即使 key 本身不是字符串类型,SET 命令依然会覆盖键值,而不是提示 key 的类型不匹配。

NX、XX、EX 和 PX 是可选参数,其中:

  • NX 表示只有在键不存在的时候执行,若键存在则放弃执行。
  • XX 表示只有在键存在的时候执行,若键不存在则放弃执行。
  • EX 设置键的过期时间,单位是秒。
  • PX 设置键的过期时间,单位是毫秒。

SETEX

效果等同于 SET key value EX

SETNX

效果等同于 SET key value NX,常常用 SETNX 命令实现分布式锁。

由于 SET 命令加上选项已经可以完全取代 SETNX, SETEX, PSETEX 的功能,所以在将来的版本中,Redis 可能会不推荐使用并且最终抛弃这几个命令。

GETSET

GETSET 首先获取字符串键当前的值,接着为键设置新值,最后把旧值返回给用户。

GETSET key new_value

GETSET 命令是原子的,若 key 不存在将返回 nil 作为 key 的旧值。

MSET

MSET 命令可以一次为多个字符串键设置值。

MSET key value [key value...]

执行多条 SET 命令需要客户端和服务器之间进行多次网络通信,并因此耗费大量的时间;而使用一条 MSET 命令去代替多条 SET 命令只需要一次网络通信,从而有效地减少程序执行多个设置操作时的时间,与其类似的还有 MGET 命令。

MGET

MGET 命令可以一次返回多个键值。

MGET key [key...]

redis> mset name1 a name3 b
OK
redis> mget name1 name2 name3
1) "a"
2) (nil)
3) "b"

MSETNX

MSETNX 只会在所有给定键都不存在的情况下对键进行设置。

MSETNX key value [key value...]

如果在给定键当中,即使有一个键已经有值了,那么 MSETNX 命令也会放弃对所有给定键的设置操作。MSETNX 命令在成功执行设置操作时返回 1,在放弃执行设置操作时则返回 0。

STRELEN

通过 STRLEN 命令可以取得字符串键存储的值的字节长度。

STRLEN key

若设置的中文是 UTF-8 编码,那么一个字符是3个字节。若 key 不存在返回 0。

字符串的索引

每个字符串都是由一系列连续的字节组成的,所以字符串中的每个字节实际上都拥有与之相对应的索引。Redis 为字符串键提供了一系列索引操作命令,这些命令允许用户通过正数索引或者负数索引,对字符串值的某个字节或者某个部分进行处理,如 GETRANGE、SETRANGE。

图片.png

SETRANGE

通过使用 SETRANGE 命令可以将字符串键的值从索引 offset 开始的部分替换为指定的新内容,被替换内容的长度取决于新内容的长度。当给定的新内容比被替换的内容更长时,此命令会自动扩展被修改的字符串值。

SETRANGE key offset value

此命令将返回修改后字符串的字节长度。

redis> GET message
"hello world"
redis> SETRANGE message 6 redis
(integer) 11
redis> GET message
"hello redis"

若 offset 超过了当前字符串的长度,字符串后面的二进制位就会用 0 补充。

redis> SET msg hello
OK
redis> SETRANGE msg 8 world
(integer) 13
redis> GET msg
"hello\x00\x00\x00world"

APPEND

APPEND命令可以将给定的内容追加到字符串键已有值的末尾,并返回修改后值的字节长度。

APPEDN key value

若 key 不存在,会首先初始化一个空字符串,然后执行追加操作。

INCRBY

当字符串键存储的值是整数时,就可以通过 INCRBY 命令对被存储的整数值执行加法操作。INCRBY 命令用于为整数值加上指定的整数增量,并返回键在执行加法操作之后的值。

INCRBY key increment

除了键值必须是整数外,增量也必须是整数,若 key 不存在,会为其设置为初始值 0 后再执行加法操作。

Redis 还提供了 DECRBY 命令用来实现减法操作。

INCR

INCR 命令类似于 INCRBY,但是每次只能累加 1。

INCR key

Redis 还提供了对应的 DECR 命令用来实现减法操作。

INCRBYFLOAT

和 INCRBY 的使用方式一样,INCRBYFLOAT 命令既可以处理整数,也可以处理浮点数。

INCRBYFLOAT key increment

但是 Redis 没有提供 DECRBYFLOAT 命令执行浮点数的减法操作,可以通过对 INCRBYFLOAT 命令设置增量为负数实现减法操作。

根据上述命令,字符串类型可以使用在如下业务场景:ID 生成器、计数器等。