.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 小时前
spring-cloud-alibaba-nacos-config使用说明
java·spring·nacos·springcloud·配置中心
遥不可及~~斌5 小时前
关于 @Autowired 和 @Value 使用 private 字段的警告问题分析与解决方案
spring·springboot
小小鸭程序员6 小时前
Spring Boot项目连接MySQL数据库及CRUD操作示例
java·spring boot·python·mysql·spring
麓殇⊙7 小时前
springMVC--Controller配置总结
java·spring
Feng.Lee8 小时前
如何判断数据来源缓存还是数据库
数据库·缓存
小小鸭程序员9 小时前
Spring Boot整合MyBatis-Plus实现CRUD操作教程
java·spring boot·python·mysql·spring
菲兹园长10 小时前
配置文件、Spring日志
java·spring boot·spring
zk计科小牛马11 小时前
SSM-SpringMVC篇
spring
橘猫云计算机设计12 小时前
基于springboot放松音乐在线播放系统(源码+lw+部署文档+讲解),源码可白嫖!
android·java·spring boot·后端·spring·微信小程序·毕业设计
kfhj13 小时前
Spring Cloud 框架为什么能处理高并发
后端·spring·spring cloud