1340 字
约 4 分钟
7
设置和获取字符串
字符串类型概述
字符串是 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: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\": \"[email protected]\"}" 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)
评论
0 条
还没有评论,先写一条吧。