using StackExchange.Redis;
namespace QYZH.InteractiveMagazine.Infrastructure.Cache;
///
/// Redis操作封装
///
public static class RedisHelper
{
private static string? _keyPrefix;
///
/// Redis连接实例
///
public static IConnectionMultiplexer? Connection { get; set; }
///
/// 设置键前缀
///
/// 前缀字符串
public static void SetKeyPrefix(string prefix)
{
_keyPrefix = prefix;
}
///
/// 获取Redis数据库实例
///
/// 数据库索引
/// IDatabase实例
public static IDatabase GetDatabase(int db = -1)
{
if (Connection == null || !Connection.IsConnected)
{
throw new InvalidOperationException("Redis连接未初始化或已断开");
}
return Connection.GetDatabase(db);
}
///
/// 设置字符串值
///
/// 键
/// 值
/// 过期时间
/// 是否成功
public static async Task StringSetAsync(string key, string value, TimeSpan? expiry = null)
{
var db = GetDatabase();
var prefixedKey = GetPrefixedKey(key);
if (expiry.HasValue)
{
return await db.StringSetAsync(prefixedKey, value, (Expiration)expiry.Value);
}
return await db.StringSetAsync(prefixedKey, value);
}
///
/// 获取字符串值
///
/// 键
/// 值
public static async Task StringGetAsync(string key)
{
var db = GetDatabase();
var prefixedKey = GetPrefixedKey(key);
return await db.StringGetAsync(prefixedKey);
}
///
/// 删除键
///
/// 键
/// 是否成功
public static async Task KeyDeleteAsync(string key)
{
var db = GetDatabase();
var prefixedKey = GetPrefixedKey(key);
return await db.KeyDeleteAsync(prefixedKey);
}
///
/// 检查键是否存在
///
/// 键
/// 是否存在
public static async Task KeyExistsAsync(string key)
{
var db = GetDatabase();
var prefixedKey = GetPrefixedKey(key);
return await db.KeyExistsAsync(prefixedKey);
}
///
/// 设置键的过期时间
///
/// 键
/// 过期时间
/// 是否成功
public static async Task KeyExpireAsync(string key, TimeSpan expiry)
{
var db = GetDatabase();
var prefixedKey = GetPrefixedKey(key);
return await db.KeyExpireAsync(prefixedKey, expiry);
}
///
/// 获取带前缀的键
///
/// 原始键
/// 带前缀的键
private static string GetPrefixedKey(string key)
{
return string.IsNullOrEmpty(_keyPrefix) ? key : $"{_keyPrefix}:{key}";
}
}