Redis基础语法 #
一、键(Key)命名规范 #
1.1 键命名规则 #
text
Redis键命名最佳实践:
1. 使用冒号分隔,形成命名空间
user:1001
user:1001:profile
user:1001:orders
2. 保持简洁但有意义
✓ user:1001:email
✗ the_user_with_id_1001_email_address
3. 使用小写字母和数字
✓ order:2024:01
✗ Order:2024:01
4. 避免特殊字符
✗ user:1001:name@email
✓ user:1001:email
1.2 常见命名模式 #
text
业务对象命名:
用户相关:
user:{id} # 用户基本信息
user:{id}:profile # 用户详细资料
user:{id}:sessions # 用户会话列表
user:{id}:settings # 用户设置
订单相关:
order:{id} # 订单信息
order:{id}:items # 订单商品列表
order:{id}:status # 订单状态
商品相关:
product:{id} # 商品信息
product:{id}:stock # 商品库存
product:{id}:reviews # 商品评论
计数器:
counter:page:views # 页面访问量
counter:article:{id}:likes # 文章点赞数
缓存:
cache:user:{id} # 用户缓存
cache:api:{endpoint} # API缓存
1.3 键的长度建议 #
text
键长度建议:
✓ 合适长度:1-100字符
✗ 过长:影响内存和性能
✗ 过短:影响可读性
示例:
✓ u:1001 # 太短,不推荐
✓ user:1001 # 合适
✓ user:1001:profile:basic:info # 可接受
✗ user:with:id:1001:and:profile:basic:information # 太长
二、数据类型概述 #
2.1 五种基础数据类型 #
text
Redis五种基础数据类型:
┌─────────────────────────────────────────────────────────┐
│ String(字符串) │
│ ┌─────────────────────────────────────────────────┐ │
│ │ key → "Hello World" │ │
│ └─────────────────────────────────────────────────┘ │
│ 用途:缓存、计数器、分布式锁 │
├─────────────────────────────────────────────────────────┤
│ List(列表) │
│ ┌─────────────────────────────────────────────────┐ │
│ │ key → ["a", "b", "c", "d"] │ │
│ └─────────────────────────────────────────────────┘ │
│ 用途:消息队列、最新列表、时间线 │
├─────────────────────────────────────────────────────────┤
│ Set(集合) │
│ ┌─────────────────────────────────────────────────┐ │
│ │ key → {"a", "b", "c"} │ │
│ └─────────────────────────────────────────────────┘ │
│ 用途:标签、社交关系、去重 │
├─────────────────────────────────────────────────────────┤
│ Hash(哈希) │
│ ┌─────────────────────────────────────────────────┐ │
│ │ key → {field1: "value1", field2: "value2"} │ │
│ └─────────────────────────────────────────────────┘ │
│ 用途:对象存储、购物车 │
├─────────────────────────────────────────────────────────┤
│ ZSet(有序集合) │
│ ┌─────────────────────────────────────────────────┐ │
│ │ key → {member1: score1, member2: score2} │ │
│ └─────────────────────────────────────────────────┘ │
│ 用途:排行榜、延时队列、范围查询 │
└─────────────────────────────────────────────────────────┘
2.2 高级数据类型 #
text
Redis高级数据类型:
Stream(流)
┌─────────────────────────────────────────────────────┐
│ 消息队列,支持消费者组 │
│ 适用于:事件溯源、消息通知 │
└─────────────────────────────────────────────────────┘
Geo(地理位置)
┌─────────────────────────────────────────────────────┐
│ 存储地理坐标,支持距离计算 │
│ 适用于:附近的人、打车应用 │
└─────────────────────────────────────────────────────┘
HyperLogLog
┌─────────────────────────────────────────────────────┐
│ 基数统计,占用内存极小(12KB) │
│ 适用于:UV统计、独立访客数 │
└─────────────────────────────────────────────────────┘
Bitmap(位图)
┌─────────────────────────────────────────────────────┐
│ 位级操作,节省空间 │
│ 适用于:签到、在线状态、布隆过滤器 │
└─────────────────────────────────────────────────────┘
三、命令规范 #
3.1 命令语法 #
text
Redis命令基本语法:
COMMAND [key] [arguments]
示例:
SET user:1001 "John"
GET user:1001
MSET key1 "value1" key2 "value2"
3.2 命令命名规则 #
text
命令命名规则:
1. 全大写(约定俗成)
✓ SET, GET, HSET
✗ set, get, hset
2. 简洁明了
SET - 设置值
GET - 获取值
DEL - 删除
INCR - 自增
3. 类型前缀
String: SET, GET, APPEND
List: LPUSH, RPUSH, LPOP, RPOP
Set: SADD, SREM, SMEMBERS
Hash: HSET, HGET, HGETALL
ZSet: ZADD, ZREM, ZRANGE
3.3 命令返回值 #
text
Redis命令返回值类型:
1. 状态回复(Status Reply)
OK
PONG
2. 错误回复(Error Reply)
(error) ERR wrong number of arguments
(error) WRONGTYPE Operation against a key
3. 整数回复(Integer Reply)
(integer) 1
(integer) 0
4. 批量字符串回复(Bulk Reply)
"Hello World"
(nil) # 空值
5. 多批量回复(Multi Bulk Reply)
1) "one"
2) "two"
3) "three"
四、通用命令 #
4.1 键操作命令 #
bash
# 设置键值
SET user:1001 "John"
# 获取值
GET user:1001
# "John"
# 删除键
DEL user:1001
# (integer) 1
# 检查键是否存在
EXISTS user:1001
# (integer) 1 存在
# (integer) 0 不存在
# 设置过期时间(秒)
EXPIRE user:1001 60
# 设置过期时间(毫秒)
PEXPIRE user:1001 60000
# 设置过期时间戳
EXPIREAT user:1001 1700000000
# 查看剩余过期时间
TTL user:1001
# (integer) 58 剩余秒数
# (integer) -1 永不过期
# (integer) -2 键不存在
# 移除过期时间
PERSIST user:1001
4.2 键查询命令 #
bash
# 查找所有匹配的键(慎用,生产环境禁止)
KEYS user:*
# 1) "user:1001"
# 2) "user:1002"
# 扫描键(推荐)
SCAN 0 MATCH user:* COUNT 10
# 1) "10" # 下一个游标
# 2) 1) "user:1001" # 匹配的键
# 2) "user:1002"
# 继续扫描
SCAN 10 MATCH user:* COUNT 10
# 查看键的类型
TYPE user:1001
# string
# 查看键的编码类型
OBJECT ENCODING user:1001
# embstr
4.3 键重命名 #
bash
# 重命名键
RENAME user:1001 user:2001
# 仅当新键不存在时重命名
RENAMENX user:1001 user:2001
# (integer) 1 成功
# (integer) 0 新键已存在
4.4 排序 #
bash
# 对列表、集合、有序集合排序
SORT mylist
SORT mylist DESC
SORT mylist LIMIT 0 10
SORT mylist ALPHA # 按字母排序
五、过期时间详解 #
5.1 设置过期时间 #
bash
# 方式1:SET命令中设置
SET user:1001 "John" EX 60 # 60秒后过期
SET user:1001 "John" PX 60000 # 60000毫秒后过期
SET user:1001 "John" EXAT 1700000000 # 指定时间戳过期
# 方式2:EXPIRE命令
SET user:1001 "John"
EXPIRE user:1001 60 # 60秒后过期
# 方式3:SETEX命令
SETEX user:1001 60 "John" # 60秒后过期
5.2 过期策略 #
text
Redis过期策略:
1. 定期删除
┌─────────────────────────────────────────────┐
│ 每隔一段时间随机检查部分键 │
│ 发现过期则删除 │
│ 默认每秒10次 │
└─────────────────────────────────────────────┘
2. 惰性删除
┌─────────────────────────────────────────────┐
│ 访问键时检查是否过期 │
│ 过期则删除 │
└─────────────────────────────────────────────┘
3. 内存淘汰
┌─────────────────────────────────────────────┐
│ 内存不足时触发淘汰策略 │
│ 根据maxmemory-policy配置 │
└─────────────────────────────────────────────┘
六、数据编码 #
6.1 字符串编码 #
text
字符串的三种编码:
1. int
┌─────────────────────────────────────────────┐
│ 整数值,范围在long范围内 │
│ SET counter 100 │
│ OBJECT ENCODING counter → "int" │
└─────────────────────────────────────────────┘
2. embstr
┌─────────────────────────────────────────────┐
│ 短字符串,长度≤44字节 │
│ SET name "John" │
│ OBJECT ENCODING name → "embstr" │
└─────────────────────────────────────────────┘
3. raw
┌─────────────────────────────────────────────┐
│ 长字符串,长度>44字节 │
│ SET text "很长的字符串..." │
│ OBJECT ENCODING text → "raw" │
└─────────────────────────────────────────────┘
6.2 其他类型编码 #
text
List编码:
- listpack(元素少时)
- quicklist(元素多时)
Set编码:
- intset(全是整数且数量少)
- hashtable(元素多或有非整数)
Hash编码:
- listpack(元素少时)
- hashtable(元素多时)
ZSet编码:
- listpack(元素少时)
- skiplist + hashtable(元素多时)
七、内存优化 #
7.1 键命名优化 #
bash
# 使用简短的键名
✗ user_information_with_id_1001
✓ u:1001
# 但要保持可读性
✓ user:1001
7.2 数据结构选择 #
text
根据场景选择合适的数据结构:
存储对象:
✗ 使用多个String
SET user:1001:name "John"
SET user:1001:age 25
✓ 使用Hash
HSET user:1001 name "John" age 25
存储列表:
✗ 使用Set(如果需要有序)
✓ 使用List
存储唯一值:
✗ 使用List(需要去重)
✓ 使用Set
八、总结 #
键命名规范:
| 规则 | 示例 |
|---|---|
| 使用冒号分隔 | user:1001:profile |
| 保持简洁 | user:1001 |
| 使用小写 | user:1001 |
| 有意义 | order:2024:01 |
数据类型选择:
| 类型 | 适用场景 |
|---|---|
| String | 简单值、计数器 |
| List | 列表、队列 |
| Set | 唯一值、标签 |
| Hash | 对象、映射 |
| ZSet | 排行榜、有序集合 |
下一步,让我们学习Redis CLI的使用!
最后更新:2026-03-27