🔤 Redis 字符串(String)

Redis 最基础也是最常用的数据类型

字符串类型概述

字符串是 Redis 最基本的数据类型,也是最常用的类型。Redis 的字符串是二进制安全的,可以存储任何数据,包括图片、序列化对象等。一个字符串值最大可以是 512MB。

📝 基本操作命令

字符串类型的基础读写操作:

命令 描述 示例
SET key value 设置字符串值 SET name "Redis"
GET key 获取字符串值 GET name
GETSET key value 设置新值并返回旧值 GETSET name "NewRedis"
STRLEN key 获取字符串长度 STRLEN name
APPEND key value 追加字符串到末尾 APPEND name " Database"
GETRANGE key start end 获取字符串子串 GETRANGE name 0 4
SETRANGE key offset value 从指定位置开始覆写字符串 SETRANGE name 0 "MySQL"

基本操作示例:

# 设置和获取字符串
SET greeting "Hello World"
GET greeting

# 追加字符串
APPEND greeting " from Redis"
GET greeting

# 获取字符串长度
STRLEN greeting

# 获取子串
GETRANGE greeting 0 4    # 返回 "Hello"
GETRANGE greeting -5 -1  # 返回 "Redis"

🔢 数值操作命令

当字符串存储的是数字时,Redis 提供了原子性的数值操作:

命令 描述 示例
INCR key 将数值递增1 INCR counter
INCRBY key increment 将数值增加指定值 INCRBY counter 10
INCRBYFLOAT key increment 将数值增加指定浮点数 INCRBYFLOAT price 0.5
DECR key 将数值递减1 DECR counter
DECRBY key decrement 将数值减少指定值 DECRBY counter 5

数值操作示例:

# 初始化计数器
SET page_views 0

# 递增操作
INCR page_views        # 结果: 1
INCR page_views        # 结果: 2
INCRBY page_views 10   # 结果: 12

# 递减操作
DECR page_views        # 结果: 11
DECRBY page_views 5    # 结果: 6

# 浮点数操作
SET price 10.5
INCRBYFLOAT price 2.3  # 结果: 12.8

⚡ 批量操作命令

Redis 支持批量操作多个字符串,提高操作效率:

命令 描述 示例
MSET key value [key value ...] 批量设置多个键值对 MSET k1 v1 k2 v2 k3 v3
MGET key [key ...] 批量获取多个键的值 MGET k1 k2 k3
MSETNX key value [key value ...] 批量设置(仅当所有键都不存在时) MSETNX k4 v4 k5 v5

批量操作示例:

# 批量设置用户信息
MSET user:1001:name "张三" user:1001:age "25" user:1001:city "北京"

# 批量获取用户信息
MGET user:1001:name user:1001:age user:1001:city

# 批量设置(仅当键不存在时)
MSETNX user:1002:name "李四" user:1002:age "30"

🔒 条件设置命令

Redis 提供了带条件的设置命令,常用于实现分布式锁:

命令 描述 示例
SETNX key value 仅当键不存在时设置 SETNX lock:order:1001 "locked"
SETEX key seconds value 设置值并指定过期时间 SETEX session:abc123 3600 "user_data"
PSETEX key milliseconds value 设置值并指定过期时间(毫秒) PSETEX cache:key 60000 "data"
SET key value [EX seconds] [PX milliseconds] [NX|XX] 设置值(支持多种选项) SET lock:key "value" EX 30 NX

条件设置示例:

# 分布式锁实现
SET lock:order:1001 "locked" EX 30 NX
# 如果返回OK,表示获取锁成功
# 如果返回nil,表示锁已被其他进程持有

# 会话管理
SETEX session:user123 3600 "{\"user_id\": 123, \"role\": \"admin\"}"

# 缓存设置
SET cache:article:1001 "article_content" EX 1800  # 30分钟过期

实际应用场景

🔢 计数器应用

利用 INCR/DECR 命令实现各种计数功能:

# 页面访问计数
INCR page:home:views
INCR page:about:views

# 用户积分系统
INCRBY user:1001:points 100  # 增加100积分
DECRBY user:1001:points 50   # 扣除50积分

# API调用限流
SET api:user:1001:calls 0 EX 3600  # 每小时重置
INCR api:user:1001:calls
GET api:user:1001:calls  # 检查调用次数

💾 缓存应用

使用字符串存储序列化的对象数据:

# 用户信息缓存
SET user:1001 "{\"id\": 1001, \"name\": \"张三\", \"email\": \"zhang@example.com\"}" EX 3600
GET user:1001

# 文章内容缓存
SET article:1001 "文章内容..." EX 1800
GET article:1001

# 配置信息缓存
SET config:app:version "1.2.3"
GET config:app:version

🔐 分布式锁

使用 SETNX 和过期时间实现分布式锁:

# 获取锁
SET lock:resource:1001 "process_id_123" EX 30 NX

# 检查锁状态
GET lock:resource:1001

# 释放锁(使用Lua脚本确保原子性)
# if redis.call("get", KEYS[1]) == ARGV[1] then
#     return redis.call("del", KEYS[1])
# else
#     return 0
# end

📊 会话存储

存储用户会话信息:

# 创建会话
SET session:abc123def456 "{\"user_id\": 1001, \"login_time\": 1609459200, \"permissions\": [\"read\", \"write\"]}" EX 7200

# 获取会话信息
GET session:abc123def456

# 延长会话
EXPIRE session:abc123def456 7200

# 删除会话(登出)
DEL session:abc123def456

性能优化建议