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,简洁高效、易维护
相关推荐
aXin_ya2 小时前
Redis 高级篇(最佳实践)
数据库·redis·缓存
霖霖总总2 小时前
[Redis小技巧32]Redis分布式锁的至暗时刻:从原理演进到时钟跳跃的终极博弈
数据库·redis·分布式
Wy_编程5 小时前
Redis数据类型和常用命令
数据库·redis·缓存
ZC跨境爬虫6 小时前
通俗易懂讲解分布式爬虫基础概念(附Scrapy-Redis实操教程)
redis·分布式·爬虫·python·scrapy
aXin_ya7 小时前
Redis 原理篇 (数据结构)
数据库·redis·缓存
身如柳絮随风扬7 小时前
Redis 单线程模型
redis
不会写DN10 小时前
Go 项目中 Redis 缓存的实用设计与实现(Cache-Aside 模式)
redis·缓存·golang
aXin_ya10 小时前
Redis 网络模型 内存回收
数据库·redis·缓存
.柒宇.11 小时前
Redis
数据库·redis·缓存