.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 小时前
框架模块说明 #05 权限管理_03
java·开发语言·spring
夏子曦5 小时前
Redis——主从复制原理
数据库·redis·缓存
fa_lsyk5 小时前
SpringMVC:SpringMVC的bean加载机制
java·spring·servlet·mvc
K丶one6 小时前
Spring boot + Vue2 整合人脸识别登录
java·spring boot·spring
沈询-阿里7 小时前
java调用ai模型:使用国产通义千问完成基于知识库的问答
java·人工智能·spring
ThisIsClark8 小时前
【后端面试总结】Redis过期删除策略
数据库·redis·缓存
清酒伴风(面试准备中......)8 小时前
Redis使用场景-缓存-缓存击穿
java·数据库·redis·缓存·面试·实习
焱焱枫8 小时前
Oracle的缓存会话游标
数据库·缓存·oracle
武昌库里写JAVA9 小时前
框架5:SpringBoot 2 - 核心功能
spring boot·spring·毕业设计·layui·课程设计
CS软件开发框架9 小时前
Swagger自动生成API接口注释和实体模型注释
java·服务器·前端·c#·.net·.netcore·swagger