net针对redis的Hash操作

.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 获取字段数量

五、最佳实践(必看)

  1. 适用场景

    • 存储结构化数据:用户信息、商品信息、配置项
    • 频繁更新的对象(只改单个字段,不用全量替换)
  2. 不适用场景

    • 需要索引、排序的复杂数据(用 Redis 其他结构)
    • 字段数量极多(上万),会影响性能
  3. 命名规范 HashKey 用 业务名:ID 格式,例如:

    • user:1001
    • product:20001
    • config: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}");
    }
}

总结

  1. 用 StackExchange.Redis 操作 Redis Hash,核心是 IDatabase 接口
  2. Hash 结构 = 主 Key + 多个 Field-Value,对应 C# 字典
  3. 常用操作:增删改查、自增、判断存在、对象互转
  4. 实战优先用对象转 Hash,简洁高效、易维护
相关推荐
Flynt15 小时前
我把微信运动的排行榜和定点推送复刻了一遍:100万次步数更新只要4秒,坑在别处
redis·后端·性能优化
Song_RsHt20 小时前
Redis 与微服务,什么场景下无可替代
java·redis·后端·学习·微服务
GottdesKrieges1 天前
Redis哨兵模式新建用户和修改口令
数据库·redis
爱好曙光1 天前
Redis Cluster 槽迁移:MOVED 重定向与拓扑刷新实战
redis·cluster·性能调优·moved·槽迁移
萨小耶1 天前
AI 面试答题链路源码分析:Redis 幂等、题目锁与状态机如何配合
人工智能·redis·面试
ZealSinger1 天前
Boot4升后session_redis属性怎么改名
redis·springsession·boot4·升级踩坑
牧瀬クリスだ1 天前
Redis五大数据类型全解析:从入门到实战
java·数据库·redis·后端·缓存
我不会插花弄玉1 天前
5.Hash 【由浅入深-redis】
redis·算法·哈希算法
Java小生不才1 天前
SPRING AI向量化
redis·spring ai
Lucis__2 天前
Redis持久化机制解析
redis·缓存·操作系统·文件·非关系型数据库·1024程序员节