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,简洁高效、易维护
相关推荐
用户3169353811832 天前
Java连接Redis
redis
小小工匠4 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
taocarts_bidfans5 天前
反向海淘跨境缓存架构优化:taocarts Redis分层缓存实战技术
redis·缓存·架构·反向海淘·taocarts
炘爚5 天前
Linux——Redis
数据库·redis·缓存
csjane10795 天前
Redisson 限流原理
java·redis
ThanksGive5 天前
Go 服务里的 Redis 锁惊群问题:一次本地合流优化实践
redis
小挪号底迪滴5 天前
Redis 和 MySQL 数据不一致怎么办?缓存更新策略实战
redis·mysql·缓存
青山木5 天前
Hot 100 --- 矩阵置零
线性代数·算法·leetcode·矩阵·哈希算法
闪电悠米5 天前
黑马点评-Redis ZSet-实现关注 Feed 流
服务器·网络·数据库·redis·缓存·junit·lua