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