Redis Hash 是什么?
在现代开发中,我们常需要存储用户信息、商品详情这类结构化数据。如果直接把对象序列化成 JSON 字符串存进 Redis,每次修改单个属性都得读全量、反序列化、改完再序列化,不仅麻烦,高并发下还容易覆盖数据。
Redis Hash 就是为了解决这个问题而生的。它本质上是一个'二级键值对':外部 Key 是对象标识,内部是一组 Field-Value 对。这就像文件柜里的一个抽屉,里面又分了多个小格子,每个格子存一个字段。
这种结构有几个明显优势:
- 内存更省:字段少时 Redis 会用 ziplist 紧凑编码。
- 操作更细:直接改某个字段,不用动整个对象。
- 原子性:单字段操作天然保证一致性。
下面用 C++(基于 redis-plus-plus 库)看看具体怎么落地。
核心操作:增删改查
读写单个字段
HSET 和 HGET 是最基础的操作。注意,Redis 4.0 之后 HSET 支持批量设置,不再需要单独的 HMSET。
void test1(sw::redis::Redis& redis) {
// 警告:测试环境慎用 flushall,生产环境请指定 key
redis.flushall();
// 方式一:基础设置
redis.hset("user:1001", "name", "Alice");
// 方式二:批量设置(推荐)
redis.hset("user:1001", {
std::make_pair("age", "25"),
std::make_pair("city", "Beijing")
});
// 读取字段
auto result = redis.hget("user:1001", "name");
if (result) {
cout << "Name: " << result.value() << endl;
} else {
cout << "Field not found" << endl;
}
}
这里有个细节:hget 返回的是 Optional<std::string>。如果字段不存在,它会返回空,而不是抛异常。这样写代码更安全,不用额外判空指针。


