2. Redis 核心数据结构与常用命令回顾

Redis 之所以能成为缓存与迁移场景的基石,核心在于其丰富的数据结构。每种结构都对应特定的业务模式与操作语义。在迁移冒烟测试中,必须验证每种结构的数据完整性、命令兼容性与边界行为。本节按结构逐一拆解其特性、常用命令及迁移验证要点。

2.1 String — 最基础的键值单元

String 是 Redis 最基础的数据类型,值可以是字符串、数字或二进制数据(最大 512 MB)。迁移时需重点验证大 Value 的序列化与反序列化正确性。

命令 功能 迁移验证关注点
SET key value 设置键值 TTL 是否保留
GET key 获取值 值内容完全一致
MSET / MGET 批量读写 批量操作原子性
INCR / DECR 原子增减 数值精度不丢失
GETSET 获取旧值并设置新值 并发场景下旧值正确
STRLEN 获取字符串长度 中文字节长度一致
迁移冒烟提示: 对于 String 类型,建议在迁移后执行 RANDOMKEY + DEBUG OBJECT 抽样检查编码类型(embstr / raw / int),确保编码未因迁移而改变。

2.2 Hash — 结构化字段映射

Hash 适合存储对象(如用户信息、商品详情),内部使用压缩列表或哈希表实现。迁移时需验证字段数量、字段顺序及空字段行为。

# 常用命令示例
HSET user:1001 name "Alice" age 30
HGET user:1001 name
HGETALL user:1001
HLEN user:1001
HDEL user:1001 age
HSCAN user:1001 0 MATCH * COUNT 10
命令 迁移验证要点
HGETALL 字段与值顺序一致
HVALS 值列表完整
HEXISTS 存在性判断正确
HSTRLEN 字段值长度一致
常见迁移陷阱: 当 Hash 字段数较少时,Redis 使用 ziplist 编码;迁移后若目标版本编码策略不同,可能导致内存占用变化。冒烟测试应对比 MEMORY USAGE key。

2.3 List — 有序可重复队列

List 基于双向链表或 quicklist 实现,支持头尾操作。迁移时需重点验证元素顺序与索引位置。

# 常用命令
LPUSH queue task1 task2 task3
RPUSH queue task4
LPOP queue
LRANGE queue 0 -1
LLEN queue
LINDEX queue 0
LTRIM queue 0 100
命令 迁移验证要点
LRANGE 0 -1 全量元素顺序一致
LINDEX 随机索引位置正确
LINSERT 插入后顺序不变
LTRIM 裁剪后剩余元素正确

2.4 Set — 无序唯一集合

Set 使用哈希表实现,支持交、并、差运算。迁移时需验证成员唯一性与集合运算结果。

SADD tags:redis "database" "cache" "nosql"
SMEMBERS tags:redis
SISMEMBER tags:redis "cache"
SCARD tags:redis
SINTER set1 set2
SUNION set1 set2
SDIFF set1 set2
迁移验证策略: 对 Set 类型,建议使用 SSCAN 游标遍历全量成员,与源端 SMEMBERS 结果做集合比对,确保无成员丢失或多余。

2.5 Sorted Set — 有序唯一集合

Sorted Set 每个成员关联一个 double 类型分数,按分数排序。迁移时需验证分数精度与排名一致性。

ZADD leaderboard 100 "player1" 200 "player2"
ZRANGE leaderboard 0 -1 WITHSCORES
ZREVRANGE leaderboard 0 -1
ZSCORE leaderboard "player1"
ZRANK leaderboard "player1"
ZINCRBY leaderboard 50 "player1"
ZCARD leaderboard
命令 迁移验证要点
ZRANGE / ZREVRANGE 排序顺序一致
ZSCORE 分数精度(尤其浮点数)
ZRANK / ZREVRANK 排名索引正确
ZCOUNT 分数区间计数一致
ZINTERSTORE 交集结果正确
浮点数陷阱: Redis 的 ZSCORE 使用 IEEE 754 double 存储。迁移过程中若序列化/反序列化丢失精度(如 0.1 + 0.2 ≠ 0.3),会导致排序错乱。冒烟测试应针对边界值(如 INF、-INF、极小正数)做专项验证。

2.6 数据结构选择与迁移影响矩阵

下表总结了五种核心结构在迁移冒烟测试中的关键差异,帮助测试人员快速定位验证重点。

结构 内部编码 顺序敏感 唯一性 迁移验证重点
String embstr / raw / int — — 大 Value 完整性、TTL
Hash ziplist / hashtable 否 字段名唯一 字段数、编码变化
List quicklist 是 否 元素顺序、索引位置
Set hashtable / intset 否 是 成员完整性、交并差运算
Sorted Set ziplist / skiplist 是(按分数) 是 分数精度、排名一致性

2.7 数据结构关系总览

下图展示了五种核心数据结构在 Redis 中的定位、内部编码及迁移验证的关键维度,帮助建立全局认知。

Redis 核心数据结构与迁移验证维度 String embstr / raw / int Hash ziplist / hashtable List quicklist Set hashtable / intset Sorted Set ziplist / skiplist 迁移验证核心维度 数据完整性 · 编码一致性 · 顺序/排名 · 分数精度 · TTL · 批量操作原子性 全量数据比对 RANDOMKEY + DUMP/RESTORE 编码一致性 DEBUG OBJECT / OBJECT ENCODING 边界值验证 空结构 / 大 Value / 浮点精度 命令兼容性 版本差异命令回归 迁移冒烟测试核心原则 1. 每种数据结构至少执行 3 种以上命令验证 | 2. 包含空结构、单元素、多元素三种规模 3. 对比源端与目标端的 MEMORY USAGE | 4. 验证 TTL 与过期行为一致

2.8 通用命令与迁移验证

除了各结构的专用命令,Redis 提供一组通用命令,在迁移冒烟测试中同样关键:

  • EXISTS / TYPE — 验证键是否存在及类型是否匹配
  • TTL / PTTL — 验证过期时间是否精确迁移
  • DUMP / RESTORE — 序列化迁移的核心命令,需验证 RDB 版本兼容性
  • RENAME / COPY — 验证键名迁移后的可达性
  • MEMORY USAGE — 对比内存占用,发现编码变化
  • SCAN — 游标遍历全量键,用于抽样验证
# 通用命令迁移验证示例
# 源端
> TYPE user:1001
hash
> TTL user:1001
3600
> MEMORY USAGE user:1001
(integer) 128

# 目标端(迁移后)
> TYPE user:1001
hash
> TTL user:1001
3600
> MEMORY USAGE user:1001
(integer) 128  # 内存偏差应 < 5%
冒烟测试清单: 针对五种数据结构,建议每种至少选取 100 个键执行 DUMP + RESTORE 双向验证,并对比 MEMORY USAGE 与 TTL。对于 Sorted Set,额外验证 ZSCORE 浮点精度在迁移前后完全一致。