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,简洁高效、易维护
相关推荐
momo0611711 小时前
Redis新手入门 -- 学习笔记
redis·后端
那年窗外下的雪.12 小时前
AIDC 学习日志|第 22 天|All-Active/Single-Active 故障演练设计
服务器·网络·学习·算法·哈希算法
David猪大卫14 小时前
【C++修炼】哈希表的实现
数据结构·c++·笔记·学习·算法·哈希算法·散列表
shehuiyuelaiyuehao17 小时前
算法44,模拟算法,数青蛙
算法·哈希算法·散列表
吃饱了得干活19 小时前
Redisson 进阶实战:看门狗机制与分布式锁完全指南
java·redis·后端
数据知道20 小时前
密钥管理(KMS)——轮换、分级、HSM 硬件安全模块
网络安全·密码学·哈希算法
我是苏苏21 小时前
Redis开发09:Windows系统下主从复制的配置教程
数据库·redis·缓存
写后端的胖头鱼1 天前
【高频面试题】如何找出redis中的慢查询记录
redis·慢日志
老王熬夜敲代码1 天前
BLAKE3:最快的密码学哈希函数
算法·密码学·哈希算法
彧azz1 天前
Redis 全面指南:从核心概念到高可用架构实战
数据库·redis·架构