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 中的定位、内部编码及迁移验证的关键维度,帮助建立全局认知。
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 浮点精度在迁移前后完全一致。