.NET Core 内置的一个简单易用的内存缓存

为了构建一个通用的缓存类,可以封装 Microsoft.Extensions.Caching.Memory 的功能,提供更加友好的接口来缓存软件系统中的各种数据。下面是一个简单的例子,展示了如何创建这样一个缓存类,并说明了如何使用它。

缓存类定义

csharp 复制代码
using Microsoft.Extensions.Caching.Memory;
using System;

public class AppCache
{
    private readonly IMemoryCache _cache;

    public AppCache(IMemoryCache cache)
    {
        _cache = cache;
    }

    // 泛型方法用于缓存任何类型的对象
    public void Set<T>(string key, T value, TimeSpan? expiration = null)
    {
        var options = new MemoryCacheEntryOptions();
        if (expiration.HasValue)
        {
            options.SetAbsoluteExpiration(expiration.Value);
        }
        else
        {
            // 默认过期时间,例如1小时
            options.SetAbsoluteExpiration(TimeSpan.FromHours(1));
        }

        _cache.Set(key, value, options);
    }

    // 尝试获取缓存值,如果不存在则返回默认值
    public T GetOrDefault<T>(string key)
    {
        return _cache.Get<T>(key) ?? default(T);
    }

    // 检查缓存中是否存在指定键
    public bool Exists(string key)
    {
        return _cache.TryGetValue(key, out _);
    }

    // 从缓存中移除指定键
    public void Remove(string key)
    {
        _cache.Remove(key);
    }

    // 清空所有缓存项
    public void Clear()
    {
        foreach (var item in _cache.Compact(1.0))
        {
            // Compact 方法会尝试释放尽可能多的空间,参数是0到1之间的小数,表示希望释放的比例。
            // 这里我们传入1.0,意味着尽可能地清除所有的缓存。
        }
    }
}

使用示例

假设我们有一个需要频繁查询用户信息的应用程序,我们可以利用上述 AppCache 类来缓存这些信息,以减少数据库的负载和提高响应速度。

注册服务

首先,在 Startup.cs 中注册 IMemoryCacheAppCache

csharp 复制代码
public void ConfigureServices(IServiceCollection services)
{
    services.AddMemoryCache();
    services.AddSingleton<AppCache>(provider => 
        new AppCache(provider.GetService<IMemoryCache>()));
    
    // 其他服务配置...
}
控制器或服务中使用缓存

接下来,在控制器或其他服务中使用 AppCache 来缓存用户信息:

csharp 复制代码
using Microsoft.AspNetCore.Mvc;

public class UserController : Controller
{
    private readonly AppCache _appCache;

    public UserController(AppCache appCache)
    {
        _appCache = appCache;
    }

    public IActionResult GetUser(int userId)
    {
        string cacheKey = $"user_{userId}";

        // 尝试从缓存中获取用户信息
        var user = _appCache.GetOrDefault<User>(cacheKey);

        if (user == null)
        {
            // 如果缓存中没有用户信息,则从数据库加载
            user = LoadUserFromDatabase(userId);

            // 将用户信息存储到缓存中,设置30分钟的过期时间
            _appCache.Set(cacheKey, user, TimeSpan.FromMinutes(30));
        }

        return Json(user);
    }

    private User LoadUserFromDatabase(int userId)
    {
        // 模拟从数据库加载用户信息
        // 实际应用中应替换为真实的数据库访问代码
        return new User { Id = userId, Name = "John Doe" };
    }
}

// 用户实体类
public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
}

在这个例子中,GetUser 方法首先尝试从缓存中读取用户信息。如果找不到对应的缓存项,它会从数据库中加载用户信息,并将其添加到缓存中,同时设置了30分钟的过期时间。这样可以确保在接下来的30分钟内对同一用户的请求可以直接从缓存中获得结果,而不需要再次访问数据库。

相关推荐
手握风云-2 小时前
Redis:不只是缓存那么简单(十五)
数据库·redis·缓存
谙忆3 小时前
图片CDN与边缘优化实战:缓存策略、图片处理型CDN与动态裁剪
java·spring·缓存
web行路人4 小时前
Spring Boot 第四周:集成 Spring Security 与 JWT 鉴权实践
spring boot·后端·spring
Xiaouuuuua5 小时前
Superpowers:GPT-5.6 时代下的流程毒瘤
java·gpt·spring
小杍随笔5 小时前
【 .npmrc 终极配置指南:统一管理 npm/pnpm 缓存与全局目录,告别磁盘混乱】
前端·缓存·npm
IvorySQL6 小时前
PG 日报|新增 VFD 缓存监控视图,精细化数据库调优
大数据·数据库·人工智能·缓存·postgresql·区块链
一生有你20206 小时前
Spring AI ChatMemory 监控与排查:从指标到排错全链路
java·人工智能·spring
折哥的程序人生 · 物流技术专研6 小时前
Java 23 种设计模式:从踩坑到精通 | 番外:状态 vs 策略 —— if-else 消除的两条路,你走对了吗?
java·spring·状态模式·策略模式·java面试·java设计模式·从踩坑到精通
吴声子夜歌7 小时前
Redis 6.x——监控指标
数据库·redis·缓存
折哥的程序人生 · 物流技术专研7 小时前
Java 23 种设计模式:从踩坑到精通 | 番外:工厂方法 vs 抽象工厂 —— 从单产品到产品族,架构如何演进?
java·spring·java面试·抽象工厂·工厂方法·java设计模式·从踩坑到精通