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

相关推荐
华哥啊.4 分钟前
redis缓存token失效的处理机制
数据库·redis·缓存
谢尔登1 小时前
【JavaWeb】2. 通用基础代码
spring
HelloZheQ3 小时前
Spring MVC 介绍与实践
java·spring·mvc
小猪佩奇TONY5 小时前
Vulkan 学习(12)---- Vulkan pipeline 创建
java·学习·spring
你啊我啊你好6 小时前
缓存常见问题
java·redis·缓存
唐梓航-求职中6 小时前
缓存-Redis-API-Redission-自动续期-watch dog
数据库·redis·缓存
唐梓航-求职中6 小时前
缓存-Redis-API-Redission-可重入锁-原理
数据库·redis·缓存
荆州克莱6 小时前
【Azure Redis 缓存】Azure Redis 遇见的连接不上问题和数据丢失的情况解答
spring boot·spring·spring cloud·css3·技术
计算机学姐7 小时前
基于SpringBoot的斯诺克球馆预约购票管理系统
java·vue.js·spring boot·后端·mysql·spring·intellij-idea
新知图书7 小时前
第一个Spring MVC 6入门示例
java·spring·mvc