字符串类型概述
字符串是 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
性能优化建议
- 批量操作:使用 MSET/MGET 减少网络往返次数
- 合理过期:为缓存数据设置合适的过期时间
- 原子操作:利用 INCR/DECR 的原子性避免并发问题
- 内存优化:避免存储过大的字符串值
- 序列化:选择高效的序列化格式(如JSON、MessagePack)