Redis作为高性能内存数据库,其String类型是最基础也最常用的数据结构。无论你使用Python、Java还是Go开发,掌握String类型的操作指令都能显著提升缓存和计数器等场景的开发效率。本文将深入讲解15个核心指令,助你快速上手。

1. String类型基础介绍

String是Redis中最简单的数据类型,但它的重要性不容小觑。所有Redis键本身就是字符串,而List、Set、Hash等复杂类型底层也依赖String存储元素。类似于C++或Java中的String类,Redis的String可以存储文本、数字甚至二进制数据(如图片序列化结果)。其核心优势在于灵活性与极致性能——单指令操作通常在微秒级完成,适合高并发场景。

2. 核心设置与获取指令

2.1 SET指令

SET用于设置键值对,产生的值类型为String。语法如下:

set key value

执行示例:

注意:SET是基础指令,所有后续扩展指令都基于它。

2.2 SET + NX/XX(防覆盖)

实际开发中,避免数据覆盖至关重要。NX和XX选项提供了原子性控制:

  • NX:仅在键不存在时设置,防止覆盖已有数据。语法:
    set key value nx
    。示例:

✅ 从图中可见,key2已存在时再次SET返回nil。

  • XX:仅在键存在时设置,用于更新已有数据。语法:
    set key value xx
    。示例:

⚠️ 若键不存在,XX选项会忽略操作,避免误创建。

2.3 SET + EX/PX(设置过期时间)

Redis支持在设置键值对时直接指定过期时间,无需额外调用EXPIRE:

  • EX seconds:以秒为单位。语法:
    set key value ex 要设置的秒数
    。示例:
  • PX milliseconds:以毫秒为单位。语法:
    set key value px 要设置的毫秒数
    。示例:

这对缓存场景非常实用,例如设置验证码5分钟过期。

3. 批量操作与数字运算

3.1 MGET/MSET(批量操作)

MGET一次性获取多个键的值,MSET一次性设置多个键值对:

语法(MGET):

mget 要查询的key值
。示例:

语法(MSET):

mset 键值对 键值对......
。示例:

⚠️ 重要提示:Redis是单线程模型,批量操作上万键值对会阻塞其他请求,需谨慎控制数量。

3.2 INCR/DECR(原子自增自减)

INCR将键对应的数字加1,DECR减1。若键不存在,则视为0:

语法(INCR):

incr key
。示例:

但若值为非整数(如浮点数或字符串),会报错:

语法(DECR):

decr key
。示例:

同样,大数值或非整数会失败:

3.3 INCRBY/DECRBY(指定步长)

INCRBY和DECRBY允许自定义增减值:

语法(INCRBY):

incrby key 要增加的值
。示例:

⚠️ 超出64位有符号整型范围会报错:

✅ 当键不存在时,INCRBY会创建并初始化为0:

语法(DECRBY):

decrby key 要减去的值
。示例:

3.4 INCRBYFLOAT(浮点数运算)

专门用于浮点数增减,支持整数和浮点数:

语法:

incrbyfloat key 要加的数字
。示例:

尽管存储为String,Redis内部会解析为数值进行运算。

[AFFILIATE_SLOT_1]

4. 字符串操作与元数据

4.1 APPEND(追加内容)

将值追加到现有字符串末尾,若键不存在则等同于SET:

语法:

append key 要添加的子串
。示例:

✅ 注意:即使是大数值也可以追加,不会触发数值越界错误:

4.2 GETRANGE(获取子串)

返回字符串的子串,支持负数索引(-1表示最后一个字符),左闭右闭区间:

语法:

getrange key 要访问的开头 要访问的结尾
。示例:

⚠️ 若start大于end,返回空字符串。

4.3 SETRANGE(覆盖子串)

从指定偏移开始覆盖字符串:

语法:

setrange key 要覆盖的起始位置 value
。示例:

若覆盖长度超过原字符串,Redis会自动扩容:

若键不存在,会创建新键并用\x00填充偏移前的空白:

4.4 STRLEN(获取长度)

返回字符串的字节长度(注意:中文在UTF-8下占3字节):

语法:

strlen key
。示例:

若键类型非String,会报错。

[AFFILIATE_SLOT_2]

5. 总结与实践建议

本文覆盖了Redis String类型的15个核心指令,从基础SET到高级的INCRBYFLOAT和SETRANGE。在实际开发中:

  • 使用NX/XX避免并发覆盖;
  • 利用EX/PX自动管理缓存过期;
  • 在Python/Java/Go等语言中,批量操作需控制数量以防阻塞;
  • 浮点数运算优先使用INCRBYFLOAT而非INCR。

掌握这些指令,你将能高效构建计数器、缓存和分布式锁等应用。希望本文对你有帮助!