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,简洁高效、易维护
相关推荐
.柒宇.10 小时前
Redis主从复制集群搭建详解
数据库·redis·缓存·主从复制
IT策士12 小时前
Python 中间件系列:redis 深入浅出
redis·python·中间件
小猿姐12 小时前
GitLab on Kubernetes:使用 KubeBlocks 部署生产级高可用 PostgreSQL 和 Redis
redis·postgresql·kubernetes
phltxy13 小时前
Redis 常见数据类型之全局通用命令详解
数据库·redis·bootstrap
難釋懷14 小时前
Redis网络模型-用户空间和内核态空间
网络·arm开发·redis
薪火铺子14 小时前
布隆过滤器原理与 Redis 防穿透实战
数据库·redis·缓存
S1998_1997111609•X14 小时前
哈希树阻断正常系统通信工程进行函数钩子解析
安全·百度·缓存·哈希算法·量子计算
.柒宇.15 小时前
Redis高频面试题与跳跃表原理详解
数据库·redis·缓存
未若君雅裁15 小时前
Redis 和 MySQL 双写一致性:延迟双删、读写锁、MQ、Canal 怎么选?
数据库·redis·面试
Kiyra16 小时前
Agent 的记忆不是存数据库就行:上下文预算与轻量记忆的设计实战
数据库·人工智能·后端·面试·职场和发展·哈希算法