ly/Common/Redis/RedisService.cs

82 lines
2.4 KiB
C#
Raw Permalink Normal View History

2025-03-22 12:16:22 +00:00
using LY.App.Extensions.DI;
using StackExchange.Redis;
using System.Text.Json;
namespace LY.App.Common.Redis
{
/// <summary>
/// redis 连接服务
/// </summary>
public class RedisService
{
private readonly IDatabase _db;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="connectionString"></param>
public RedisService(string connectionString)
{
var redis = ConnectionMultiplexer.Connect(connectionString);
_db = redis.GetDatabase();
}
/// <summary>
/// 泛型存储数据到 Redis
/// </summary>
public async Task<bool> SetAsync<T>(string key, T value, TimeSpan? expiry = null)
{
string jsonData = JsonSerializer.Serialize(value);
return await _db.StringSetAsync(key, jsonData, expiry);
}
/// <summary>
/// 泛型获取数据
/// </summary>
public async Task<T?> GetAsync<T>(string key)
{
string jsonData = await _db.StringGetAsync(key);
return jsonData is not null ? JsonSerializer.Deserialize<T>(jsonData) : default;
}
/// <summary>
/// 删除 Key
/// </summary>
public async Task<bool> DeleteAsync(string key)
{
return await _db.KeyDeleteAsync(key);
}
/// <summary>
/// 检查 Key 是否存在
/// </summary>
public async Task<bool> ExistsAsync(string key)
{
return await _db.KeyExistsAsync(key);
}
2025-03-26 03:23:39 +00:00
/// <summary>
/// 获取数据,如果不存在则从数据源获取并存入 Redis
/// </summary>
/// <typeparam name="T">数据类型</typeparam>
/// <param name="key">Redis Key</param>
/// <param name="factory">数据源方法</param>
/// <param name="expiry">可选的过期时间</param>
/// <returns>获取到的值</returns>
public async Task<T?> GetOrSetAsync<T>(string key, Func<Task<T>> factory, TimeSpan? expiry = null)
{
var value = await GetAsync<T>(key);
if (value is not null)
{
return value;
}
value = await factory();
if (value is not null)
{
await SetAsync(key, value, expiry);
}
return value;
}
2025-03-22 12:16:22 +00:00
}
}