为了构建一个通用的缓存类,可以封装 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
中注册 IMemoryCache
和 AppCache
:
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分钟内对同一用户的请求可以直接从缓存中获得结果,而不需要再次访问数据库。