You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET7中Protobuf-net结合Redis缓存ProtoContract对象及EasyCaching问题求助

解决方案:.NET7中Protobuf-net结合Redis缓存实现及EasyCaching序列化器错误修复

方案一:直接使用StackExchange.Redis + Protobuf-net

无需依赖第三方缓存框架,直接控制序列化与Redis交互逻辑,轻量且灵活:

  1. 安装依赖包
Install-Package StackExchange.Redis
Install-Package protobuf-net
  1. 定义带Protobuf标记的实体类
[ProtoContract]
public class CacheItem
{
    [ProtoMember(1)]
    public int Id { get; set; }
    
    [ProtoMember(2)]
    public string Name { get; set; }
    
    // 其余字段按需求添加[ProtoMember(n)]标记,n需唯一
}
  1. 封装Redis缓存操作服务
public class RedisCacheService
{
    private readonly IDatabase _redisDb;

    public RedisCacheService(IConnectionMultiplexer redisMultiplexer)
    {
        _redisDb = redisMultiplexer.GetDatabase();
    }

    public async Task SetAsync<T>(string key, T value, TimeSpan? expiry = null) where T : class
    {
        using var ms = new MemoryStream();
        Serializer.Serialize(ms, value);
        ms.Position = 0;
        await _redisDb.StringSetAsync(key, ms.ToArray(), expiry);
    }

    public async Task<T?> GetAsync<T>(string key) where T : class
    {
        var data = await _redisDb.StringGetAsync(key);
        if (!data.HasValue) return null;
        
        using var ms = new MemoryStream(data);
        return Serializer.Deserialize<T>(ms);
    }
}
  1. 注册服务到DI容器
    在Program.cs中添加:
// 替换为你的Redis连接字符串
var redisConn = ConnectionMultiplexer.Connect("localhost:6379,password=your_password");
builder.Services.AddSingleton<IConnectionMultiplexer>(redisConn);
builder.Services.AddSingleton<RedisCacheService>();

方案二:修复EasyCaching序列化器缺失错误

你遇到的ArgumentNullException是因为EasyCaching的Redis提供者未绑定序列化器,需显式注册Protobuf序列化器:

  1. 安装扩展包
Install-Package EasyCaching.Redis
Install-Package EasyCaching.Serialization.Protobuf
  1. 配置EasyCaching服务
    在Program.cs中:
builder.Services.AddEasyCaching(options =>
{
    // 配置Redis实例
    options.UseRedis(config =>
    {
        config.DBConfig.Endpoints.Add(new ServerEndPoint("localhost", 6379));
        config.DBConfig.Database = 0;
        config.DBConfig.Password = "your_password"; // 按需添加
        config.CacheKeyPrefix = "app_cache:"; // 可选,添加键前缀
    }, "main_redis");

    // 注册Protobuf序列化器(关键步骤,缺失会导致报错)
    options.WithProtobuf();
});
  1. 注入并使用缓存服务
public class DemoService
{
    private readonly IEasyCachingProvider _cache;

    // 通过工厂获取指定名称的缓存提供者
    public DemoService(IEasyCachingProviderFactory cacheFactory)
    {
        _cache = cacheFactory.GetCachingProvider("main_redis");
    }

    public async Task SaveToCacheAsync()
    {
        var item = new CacheItem { Id = 100, Name = "DemoData" };
        await _cache.SetAsync("demo_key", item, TimeSpan.FromMinutes(15));
    }

    public async Task<CacheItem?> GetFromCacheAsync()
    {
        return await _cache.GetAsync<CacheItem>("demo_key");
    }
}

错误根源说明

EasyCaching不会自动注册序列化器,必须通过WithProtobuf()显式绑定,否则DefaultRedisCachingProvider构造时会因serializers参数为空抛出异常。

内容的提问来源于stack exchange,提问作者GGleGrand

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 13:22:13