.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分钟内对同一用户的请求可以直接从缓存中获得结果,而不需要再次访问数据库。

相关推荐
克拉克盖博1 小时前
chapter03_Bean的实例化与策略模式
java·spring·策略模式
海梨花4 小时前
【从零开始学习Redis】项目实战-黑马点评D2
java·数据库·redis·后端·缓存
小兔兔吃萝卜6 小时前
Spring 创建 Bean 的 8 种主要方式
java·后端·spring
AAA修煤气灶刘哥8 小时前
面试官: SpringBoot自动配置的原理是什么?从启动到生效,一文讲透
后端·spring·面试
qq_三哥啊10 小时前
【IDEA】设置Debug调试时调试器不进入特定类(Spring框架、Mybatis框架)
spring·intellij-idea·mybatis
别惹CC10 小时前
Spring AI 进阶之路01:三步将 AI 整合进 Spring Boot
人工智能·spring boot·spring
寒士obj11 小时前
Spring事物
java·spring
IT毕设实战小研19 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
甄超锋20 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
Java小白程序员1 天前
Spring Framework:Java 开发的基石与 Spring 生态的起点
java·数据库·spring