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}"; } }