.NET 中 Redis Hash 操作学习指南
Redis Hash 是键值对的集合 (类似 C# 中的 Dictionary<string, string>),适合存储结构化对象(比如用户信息、商品详情),是 Redis 最常用的数据结构之一。
我会用最简单、最实用的方式,带你从零学会 .NET 操作 Redis Hash,包含完整代码、常用命令、实战场景。
一、前置准备
1. 安装依赖包
.NET 操作 Redis 最主流的库是 StackExchange.Redis,直接安装:
bash
运行
Install-Package StackExchange.Redis
# 或者
dotnet add package StackExchange.Redis
2. 基础连接配置
先写一个 Redis 连接助手类,全局复用:
csharp
运行
using StackExchange.Redis;
using System;
public static class RedisHelper
{
// 连接多路复用器(官方推荐单例)
private static readonly ConnectionMultiplexer _redis = ConnectionMultiplexer.Connect("localhost:6379");
// 获取 Redis 数据库
public static IDatabase GetDatabase()
{
return _redis.GetDatabase();
}
}
二、核心:Hash 常用操作(完整可运行代码)
Redis Hash 核心是:一个主 Key + 多个 Field-Value 结构:HashKey -> { Field1: Value1, Field2: Value2, ... }
1. 新增 / 修改 Hash 数据
csharp
运行
var db = RedisHelper.GetDatabase();
// 1. 单个字段赋值(存在则覆盖,不存在则新增)
db.HashSet("user:1001", "name", "张三");
db.HashSet("user:1001", "age", "20");
db.HashSet("user:1001", "gender", "男");
// 2. 批量赋值(推荐,效率更高)
HashEntry[] userFields = new HashEntry[]
{
new HashEntry("name", "李四"),
new HashEntry("age", "25"),
new HashEntry("phone", "13800138000")
};
db.HashSet("user:1002", userFields);
2. 查询 Hash 数据
csharp
运行
var db = RedisHelper.GetDatabase();
// 1. 获取单个字段的值
string name = db.HashGet("user:1001", "name"); // 张三
int age = (int)db.HashGet("user:1001", "age"); // 20
// 2. 获取多个字段的值
RedisValue[] values = db.HashGet("user:1001", new RedisValue[] { "name", "age" });
// 3. 获取 Hash 所有字段+值
HashEntry[] allFields = db.HashGetAll("user:1001");
foreach (var item in allFields)
{
Console.WriteLine($"{item.Name}: {item.Value}");
}
// 4. 获取所有字段名 / 所有值
RedisValue[] fields = db.HashKeys("user:1001"); // [name,age,gender]
RedisValue[] fieldValues = db.HashValues("user:1001"); // [张三,20,男]
3. 判断字段是否存在
csharp
运行
bool exists = db.HashExists("user:1001", "name"); // true
bool noExists = db.HashExists("user:1001", "email"); // false
4. 删除 Hash 字段
csharp
运行
// 删除单个字段
bool delSuccess = db.HashDelete("user:1001", "gender");
// 删除多个字段
long delCount = db.HashDelete("user:1001", new RedisValue[] { "age", "phone" });
5. 数字类型自增 / 自减(实用)
Hash 支持对数字字段做原子自增,适合统计、计数:
csharp
运行
// age 自增 1
long newAge = db.HashIncrement("user:1001", "age", 1);
// age 自减 1
long decAge = db.HashDecrement("user:1001", "age", 1);
6. 获取 Hash 字段数量
csharp
运行
long fieldCount = db.HashLength("user:1001");
三、进阶:实体对象直接转 Hash(开发必备)
实际开发中,我们不会手动一个个存字段,直接把 C# 对象转成 Hash:
1. 定义实体类
csharp
运行
public class UserInfo
{
public string Name { get; set; }
public int Age { get; set; }
public string Phone { get; set; }
}
2. 对象 ↔ Hash 互转(扩展方法)
csharp
运行
using StackExchange.Redis;
using System.Collections.Generic;
using System.Reflection;
public static class HashExtensions
{
/// <summary>
/// 对象转 Redis Hash
/// </summary>
public static HashEntry[] ToHashEntries(this object obj)
{
PropertyInfo[] properties = obj.GetType().GetProperties();
return properties.Select(p => new HashEntry(p.Name, p.GetValue(obj)?.ToString() ?? "")).ToArray();
}
/// <summary>
/// Redis Hash 转对象
/// </summary>
public static T ConvertFromHash<T>(this HashEntry[] hashEntries) where T : new()
{
T obj = new T();
PropertyInfo[] properties = typeof(T).GetProperties();
foreach (var entry in hashEntries)
{
PropertyInfo prop = properties.FirstOrDefault(p => p.Name.Equals(entry.Name));
if (prop != null)
{
prop.SetValue(obj, Convert.ChangeType(entry.Value, prop.PropertyType));
}
}
return obj;
}
}
3. 直接使用(极简)
csharp
运行
var db = RedisHelper.GetDatabase();
// 1. 对象存入 Hash
var user = new UserInfo { Name = "王五", Age = 28, Phone = "13900139000" };
db.HashSet("user:1003", user.ToHashEntries());
// 2. Hash 读取转回对象
HashEntry[] hashData = db.HashGetAll("user:1003");
UserInfo getUser = hashData.ConvertFromHash<UserInfo>();
四、Redis Hash 命令与 .NET 方法对照表
表格
| Redis 原命令 | .NET 方法 | 作用 |
|---|---|---|
| HSET | HashSet | 设置字段值 |
| HGET | HashGet | 获取单个字段值 |
| HMGET | HashGet (多字段) | 获取多个字段值 |
| HGETALL | HashGetAll | 获取所有字段和值 |
| HEXISTS | HashExists | 判断字段是否存在 |
| HDEL | HashDelete | 删除字段 |
| HINCRBY | HashIncrement | 数字自增 |
| HKEYS | HashKeys | 获取所有字段名 |
| HVALS | HashValues | 获取所有字段值 |
| HLEN | HashLength | 获取字段数量 |
五、最佳实践(必看)
-
适用场景
- 存储结构化数据:用户信息、商品信息、配置项
- 频繁更新的对象(只改单个字段,不用全量替换)
-
不适用场景
- 需要索引、排序的复杂数据(用 Redis 其他结构)
- 字段数量极多(上万),会影响性能
-
命名规范 HashKey 用
业务名:ID格式,例如:user:1001product:20001config:system
六、完整测试代码
直接复制运行,即可测试所有功能:
csharp
运行
class Program
{
static void Main(string[] args)
{
var db = RedisHelper.GetDatabase();
// 1. 新增
db.HashSet("student:1", "name", "小明");
db.HashSet("student:1", "score", "90");
// 2. 查询
Console.WriteLine("姓名:" + db.HashGet("student:1", "name"));
// 3. 自增
db.HashIncrement("student:1", "score", 5);
// 4. 转对象
var hash = db.HashGetAll("student:1");
// 输出结果
foreach (var item in hash) Console.WriteLine($"{item.Name}:{item.Value}");
}
}
总结
- 用 StackExchange.Redis 操作 Redis Hash,核心是
IDatabase接口 - Hash 结构 = 主 Key + 多个 Field-Value,对应 C# 字典
- 常用操作:增删改查、自增、判断存在、对象互转
- 实战优先用对象转 Hash,简洁高效、易维护