缓存的封装类
public class CacheService
{
private readonly IDistributedCache _cache;
public CacheService(IDistributedCache cache)
{
_cache = cache;
}
/// <summary>
/// 保存到缓存
/// </summary>
/// <param name="data">值</param>
/// <param name="key">键</param>
/// <param name="sliding">相对过期时间</param>
/// <param name="expiration">绝对过期时间</param>
/// <returns></returns>
public async Task SetValueAsync(string key, object data, int sliding, int expiration)
{
byte[] bytes = JsonSerializer.SerializeToUtf8Bytes(data);
await _cache.SetAsync(key, bytes, new DistributedCacheEntryOptions()
{
SlidingExpiration = TimeSpan.FromMinutes(sliding),
AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(expiration)
});
}
/// <summary>
/// 获取缓存
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public T? GetValue<T>(string key)
{
byte[]? bytes = _cache.Get(key);
if (bytes == null || bytes.Length < 1)
{
return default;
}
ReadOnlySpan<byte> readOnlySpan = new(bytes);
return JsonSerializer.Deserialize<T>(readOnlySpan);
}
public async Task<T> GetCacheAsync<T>(string key)
{
byte[] cacheData = await _cache.GetAsync(key);
if (cacheData != null)
{
T cachedObject = JsonSerializer.Deserialize<T>(cacheData)!;
return cachedObject;
}
else
{
return default!; // 如果没有找到缓存数据,返回默认值(null 或适当的默认值)
}
}
/// <summary>
/// 删除缓存
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public async Task RemoveCacheAsync(string key)
{
await _cache.RemoveAsync(key);
}
/// <summary>
/// 检查缓存是否存在
/// </summary>
/// <param name="key">缓存键</param>
/// <returns>返回布尔值表示是否存在</returns>
public async Task<bool> IsCacheExistsAsync(string key)
{
var cacheValue = await _cache.GetAsync(key);
// 如果缓存项为null,表示缓存中没有这个键
return cacheValue != null;
}
}
依赖注入
#region 注册内存缓存
builder.services.AddDistributedMemoryCache();
#endregion
使用示例
public class MailSeriverMpI : IMailSeriver
{
private readonly CacheService _cache;
public MailSeriverMpI(CacheService cache)
{
_cache = cache;
}
public string Send(string title, string to)
{
//写入缓存
_cache.SetValueAsync(to, emailCode, 3, 3);
//读取数据
_cacheService.GetValue<EmailCode>(changepwdDTO.Email).EmailC;
}
}