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

ASP.NET Core 是否有内置的按服务隔离缓存方案实现不同服务缓存独立?

ASP.NET Core 多服务隔离缓存实现方案

ASP.NET Core 没有开箱即用的多服务隔离 IMemoryCache 内置实现,但可以通过轻量的泛型封装实现完全符合需求的隔离缓存,无需手动维护键前缀,同时完全兼容原生 IMemoryCache 的所有API与过期配置。


实现方案:泛型隔离缓存包装器

核心逻辑是给每个服务类型生成独立的缓存实例,自动为所有缓存键拼接服务类型唯一前缀,业务侧完全感知不到前缀的存在,用法和原生 IMemoryCache 完全一致。

1. 定义泛型缓存包装类

using Microsoft.Extensions.Caching.Memory;

public class IsolatedMemoryCache<TService> : IMemoryCache
{
    private readonly IMemoryCache _innerCache;
    private readonly string _keyPrefix;

    public IsolatedMemoryCache(IMemoryCache innerCache)
    {
        _innerCache = innerCache;
        // 用服务类型的FullName作为全局唯一前缀,确保不同服务天然隔离
        _keyPrefix = $"{typeof(TService).FullName}:";
    }

    public bool TryGetValue(object key, out object value)
    {
        return _innerCache.TryGetValue($"{_keyPrefix}{key}", out value);
    }

    public ICacheEntry CreateEntry(object key)
    {
        // 透传所有缓存配置,包括过期时间、优先级、回调等
        return _innerCache.CreateEntry($"{_keyPrefix}{key}");
    }

    public void Remove(object key)
    {
        _innerCache.Remove($"{_keyPrefix}{key}");
    }

    public void Dispose()
    {
        // 不释放内部共享的IMemoryCache单例,仅空实现接口要求
    }
}

IMemoryCache 自带的 Set、GetOrCreate 等常用方法都是扩展方法,只要实现上述3个核心接口方法即可直接使用所有原生API,无需额外编码。

2. 注册服务

在 Program.cs 中完成服务注册:

// 注册原生IMemoryCache单例
builder.Services.AddMemoryCache();
// 注册泛型隔离缓存,会为每个不同的TService生成独立的缓存实例
builder.Services.AddSingleton(typeof(IsolatedMemoryCache<>));

3. 业务侧使用

在需要缓存的服务中直接注入对应类型的隔离缓存即可:

public class OrderService
{
    private readonly IsolatedMemoryCache<OrderService> _cache;

    public OrderService(IsolatedMemoryCache<OrderService> cache)
    {
        _cache = cache;
    }

    public async Task<Order> GetOrderById(long orderId)
    {
        // 直接使用普通键名,无需手动加前缀
        return await _cache.GetOrCreateAsync($"order_{orderId}", entry =>
        {
            // 过期配置和原生IMemoryCache完全一致,支持所有原生特性
            entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(10);
            entry.SlidingExpiration = TimeSpan.FromMinutes(2);
            return QueryOrderFromRemote(orderId);
        });
    }
}

方案特性

  • 天然隔离:不同服务的缓存键自动添加唯一前缀,即使使用完全相同的键名也不会互相覆盖
  • 完全兼容:所有原生 IMemoryCache 的过期配置、大小限制、优先级、过期回调等特性都可以直接使用,无任何学习成本
  • 无侵入性:业务代码不需要调整逻辑,仅需要替换注入的缓存类型即可
  • 可扩展:如果需要按租户、模块等其他维度隔离,仅需要修改前缀生成逻辑即可适配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 07:06:03