8.1.3 String类型与常用命令

String类型概述#

String 是 Redis 最基础的数据类型,适合存储文本、数字计数、二进制数据等。单个 value 最大 512MB,常用于缓存对象、计数器、分布式锁、会话标识等场景。String 支持原子加减与过期控制,适合高并发访问。

原理草图(String读写与过期)#

文章图片

快速安装与启动(用于本节示例)#

# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y redis-server
sudo systemctl enable --now redis-server

# 验证
redis-cli ping
# 预期输出:PONG

常用命令与用法(含示例与解释)#

设值与取值#

# 设置与读取
redis-cli SET user:name "tom"
# 预期:OK
redis-cli GET user:name
# 预期:"tom"

# 批量设置与获取
redis-cli MSET k1 v1 k2 v2
redis-cli MGET k1 k2
# 预期:"v1" "v2"

# 仅当 key 不存在时设置(常用于互斥)
redis-cli SETNX lock:job 1
# 预期:1 (成功) 或 0 (已存在)

# 设置新值并返回旧值
redis-cli GETSET user:name "jerry"
# 预期:旧值 "tom"

过期与时效#

# 设置值并指定过期时间(秒)
redis-cli SETEX session:1001 60 "token-abc"
redis-cli TTL session:1001
# 预期:剩余秒数

# SET 中携带过期参数(推荐)
redis-cli SET cache:page "<html>...</html>" EX 120
redis-cli PTL cache:page
# 若命令拼写错误将返回 (error) ERR unknown command

数值操作(计数器场景)#

# 自增/自减
redis-cli SET page:view 0
redis-cli INCR page:view
redis-cli INCRBY page:view 10
redis-cli DECRBY page:view 3
redis-cli GET page:view
# 预期:数值字符串 "8"

位级操作(适合签到/特征标记)#

# 第3位设为1并读取
redis-cli SETBIT user:sign:1001 3 1
redis-cli GETBIT user:sign:1001 3
# 预期:1

# 统计为1的位数
redis-cli BITCOUNT user:sign:1001

实战示例(可直接执行)#

# 1) 缓存对象(JSON 字符串)
redis-cli SET user:1001 '{"name":"tom","age":18}' EX 600
redis-cli GET user:1001

# 2) 访问计数
redis-cli INCR page:view:home

# 3) 简单分布式锁(10秒过期)
redis-cli SET lock:job "host-01" NX EX 10
# 成功:OK;失败:nil

# 4) 限流标记(1分钟内只允许一次)
redis-cli SET req:ip:1.1.1.1 1 EX 60 NX

排错与注意事项#

  • (error) WRONGTYPE:对非 String 类型执行 String 命令。
    bash redis-cli TYPE keyname # 若返回 hash/list/set/zset,应使用对应命令或删除后重建
  • 数值操作失败INCR/DECR 只能用于可解析为数字的字符串。
    bash redis-cli SET counter "abc" redis-cli INCR counter # 预期:(error) ERR value is not an integer or out of range
  • 过期未生效:确认是否设置了 EX/PX 或 TTL。
    bash redis-cli TTL keyname # -1 表示无过期时间;-2 表示 key 不存在
  • 命令不存在:检查 redis-cli 是否连接到正确实例与版本。
    bash redis-cli INFO server | grep redis_version

练习#

  1. 使用 SETEX 实现 5 分钟的页面缓存,并验证 TTL 递减。
  2. INCRBY 实现库存扣减(从 100 扣到 0),观察是否出现负数并思考防护方案。
  3. 使用 SETNX 实现互斥锁,模拟两个终端同时加锁的效果。
  4. SETBIT 实现 7 天签到,统计已签到天数。