using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using StackExchange.Redis; namespace CoreCms.Net.Caching.AutoMate.RedisCache { public class RedisOperationRepository : IRedisOperationRepository { private readonly ILogger _logger; private readonly ConnectionMultiplexer _redis; private readonly IDatabase _database; public RedisOperationRepository(ILogger logger, ConnectionMultiplexer redis) { _logger = logger; _redis = redis; _database = redis.GetDatabase(); } private IServer GetServer() { var endpoint = _redis.GetEndPoints(); return _redis.GetServer(endpoint.First()); } public async Task Clear() { foreach (var endPoint in _redis.GetEndPoints()) { var server = GetServer(); foreach (var key in server.Keys()) { await _database.KeyDeleteAsync(key); } } } /// /// 获取锁 /// /// /// /// /// public bool LockTake(string key, string value, TimeSpan cacheTime) { return _database.LockTake(key, value, cacheTime); } /// /// 异步获取锁 /// /// /// /// /// public async Task LockTakeAsync(string key, string value, TimeSpan cacheTime) { return await _database.LockTakeAsync(key, value, cacheTime); } /// /// 延长锁(续约) /// /// /// /// /// public bool LockExtend(string key, string value, TimeSpan cacheTime) { return _database.LockExtend(key, value, cacheTime); } /// /// 延长锁(续约) /// /// /// /// /// public async Task LockExtendAsync(string key, string value, TimeSpan cacheTime) { return await _database.LockExtendAsync(key, value, cacheTime); } /// /// 释放锁 /// /// /// /// public bool LockRelease(string key, string value) { return _database.LockRelease(key, value); } /// /// 异步释放锁 /// /// /// /// public async Task LockReleaseAsync(string key, string value) { return await _database.LockReleaseAsync(key, value); } /// /// 判断key是否存在 /// /// /// public async Task KeyExistsAsync(string key) { return await _database.KeyExistsAsync(key); } /// /// 判断key是否存在 /// /// /// public bool KeyExists(string key) { return _database.KeyExists(key); } /// /// 获取键过期时间 /// /// /// public async Task KeyTime(string key) { return await _database.KeyTimeToLiveAsync(key); } /// /// 获取值 /// /// /// public async Task Get(string key) { return await _database.StringGetAsync(key); } /// /// 获取值 /// /// /// public RedisValue StringGet(string key) { return _database.StringGet(key); } /// /// 搜索匹配Key /// /// /// public List SearchKey(string pattern) { var list = new List(); var script = "return redis.call('keys',@pattern)"; var prepared = LuaScript.Prepare(script); var redisResult = _database.ScriptEvaluate(prepared, new { pattern }); if (!redisResult.IsNull) { foreach (var key in (RedisKey[])redisResult) { list.Add(key); } } return list; } public async Task KeyDeleteAsync(string key) { await _database.KeyDeleteAsync(key); } public void KeyDelete(string key) { _database.KeyDelete(key); } /// /// 模糊删除 /// /// public void LikeRemove(string pattern) { var redisResult = _database.ScriptEvaluate(LuaScript.Prepare( //Redis的keys模糊查询: " local res = redis.call('KEYS', @keypattern) " + " return res "), new { @keypattern = pattern }); if (!redisResult.IsNull) { var preSult = (RedisKey[])redisResult; _database.KeyDelete(preSult); } } /// /// 模糊删除 /// /// public async Task LikeRemoveAsync(string pattern) { var redisResult = await _database.ScriptEvaluateAsync(LuaScript.Prepare( //Redis的keys模糊查询: " local res = redis.call('KEYS', @keypattern) " + " return res "), new { @keypattern = pattern }); if (!redisResult.IsNull) { var preSult = (RedisKey[])redisResult; await _database.KeyDeleteAsync(preSult); } } /// /// 获取值 /// /// /// /// /// public async Task SetAsync(string key, object value, TimeSpan cacheTime) { if (value != null) { //序列化,将object值生成RedisValue await _database.StringSetAsync(key, JsonConvert.SerializeObject(value), cacheTime); } } /// /// 获取值 /// /// /// /// /// public async Task StringSetAsync(string key, string value, TimeSpan cacheTime) { return await _database.StringSetAsync(key, value, cacheTime); } /// /// 获取值 /// /// /// /// /// public bool StringSet(string key, string value, TimeSpan cacheTime) { return _database.StringSet(key, value, cacheTime); } /// /// 获取值 /// /// /// /// public bool StringSet(string key, string value) { return _database.StringSet(key, value); } /// /// 获取值 /// /// /// /// /// public bool StringSet(string key, RedisValue value, TimeSpan cacheTime) { return _database.StringSet(key, value, cacheTime); } /// /// 获取值 /// /// /// /// public bool StringSet(string key, RedisValue value) { return _database.StringSet(key, value); } /// /// Increment 递增 /// /// /// /// public async Task StringIncrement(string key, long value = 1) { return await _database.StringIncrementAsync(key, value); } /// /// 获取一个值并序列化 /// /// /// /// public async Task Get(string key) { var value = await _database.StringGetAsync(key); //需要用的反序列化,将Redis存储的Byte[],进行反序列化 return value.HasValue ? JsonConvert.DeserializeObject(value) : default; } /// /// 根据key获取RedisValue /// /// /// public async Task ListRangeAsync(string redisKey) { return await _database.ListRangeAsync(redisKey); } /// /// 在列表头部插入值。如果键不存在,先创建再插入值 /// /// /// /// public async Task ListLeftPushAsync(string redisKey, string redisValue) { return await _database.ListLeftPushAsync(redisKey, redisValue); } /// /// 在列表尾部插入值。如果键不存在,先创建再插入值 /// /// /// /// public async Task ListRightPushAsync(string redisKey, string redisValue) { return await _database.ListRightPushAsync(redisKey, redisValue); } /// /// 在列表尾部插入数组集合。如果键不存在,先创建再插入值 /// /// /// /// public async Task ListRightPushAsync(string redisKey, IEnumerable redisValue) { var redislist = new List(); foreach (var item in redisValue) { redislist.Add(item); } return await _database.ListRightPushAsync(redisKey, redislist.ToArray()); } /// /// 移除并返回存储在该键列表的第一个元素 反序列化 /// /// /// public async Task ListLeftPopAsync(string redisKey) where T : class { var cacheValue = await _database.ListLeftPopAsync(redisKey); if (string.IsNullOrEmpty(cacheValue)) return null; var res = JsonConvert.DeserializeObject(cacheValue); return res; } /// /// 移除并返回存储在该键列表的最后一个元素 反序列化 /// 只能是对象集合 /// /// /// public async Task ListRightPopAsync(string redisKey) where T : class { var cacheValue = await _database.ListRightPopAsync(redisKey); if (string.IsNullOrEmpty(cacheValue)) return null; var res = JsonConvert.DeserializeObject(cacheValue); return res; } /// /// 移除并返回存储在该键列表的第一个元素 /// /// /// public async Task ListLeftPopAsync(string redisKey) { return await _database.ListLeftPopAsync(redisKey); } /// /// 移除并返回存储在该键列表的最后一个元素 /// /// /// public async Task ListRightPopAsync(string redisKey) { return await _database.ListRightPopAsync(redisKey); } /// /// 列表长度 /// /// /// public async Task ListLengthAsync(string redisKey) { return await _database.ListLengthAsync(redisKey); } /// /// 返回在该列表上键所对应的元素 /// /// /// public async Task> ListRangeAsync(string redisKey, int db = -1) { var result = await _database.ListRangeAsync(redisKey); return result.Select(o => o.ToString()); } /// /// 根据索引获取指定位置数据 /// /// /// /// /// public async Task> ListRangeAsync(string redisKey, int start, int stop) { var result = await _database.ListRangeAsync(redisKey, start, stop); return result.Select(o => o.ToString()); } /// /// 删除List中的元素 并返回删除的个数 /// /// key /// 元素 /// 大于零 : 从表头开始向表尾搜索,小于零 : 从表尾开始向表头搜索,等于零:移除表中所有与 VALUE 相等的值 /// public async Task ListDelRangeAsync(string redisKey, string redisValue, long type = 0) { return await _database.ListRemoveAsync(redisKey, redisValue, type); } /// /// 清空List /// /// public async Task ListClearAsync(string redisKey) { await _database.ListTrimAsync(redisKey, 1, 0); } /// /// 有序集合/定时任务延迟队列用的多 /// /// key /// 元素 /// 分数 public async Task SortedSetAddAsync(string redisKey, string redisValue, double score) { return await _database.SortedSetAddAsync(redisKey, redisValue, score); } /// /// 添加到有序集合 用时间 /// /// /// /// /// public async Task SortedSetAddAsync(string key, string msg, DateTime time) { var score = (time.ToUniversalTime().Ticks - 621355968000000000) / 10000000; var bl = await _database.SortedSetAddAsync(key, msg, score); //When.NotExists 不更新 直接添加 return bl; } #region 小北 添加的 几个有序集合功能 /// /// 获取有序集合索引 /// /// /// /// public async Task SortedSetRankAsync(string key, string value) { var result = await _database.SortedSetRankAsync(key, value); return result; } /// /// 返回有序集中,成员的分数值。 如果成员元素不是有序集 key 的成员,或 key 不存在,返回 null /// /// /// /// public async Task SortedSetScoreAsync(string key, string value) { var result = await _database.SortedSetScoreAsync(key, value); return result; } public double? SortedSetScore(string key, string value) { var result = _database.SortedSetScore(key, value); return result; } /// /// 返回有序列表里的数据 /// /// RedisKey /// 0 是第一个 /// 最大分数值 /// public async Task> SortedSetRangeByRankAsync(string redisKey, int start, int stop) { var result = await _database.SortedSetRangeByRankAsync(redisKey, start, stop); return result.Select(o => o.ToString()); } /// /// 移出序列表里的指定范围数量 /// /// RedisKey /// 0 是第一个 /// 最大分数值 /// public async Task SortedSetRemoveRangeByRankAsync(string redisKey, int start, int stop) { return await _database.SortedSetRemoveRangeByRankAsync(redisKey, start, stop); } /// /// 返回有序列表里的指定范围数量 /// /// RedisKey /// 0 是第一个 /// 最大分数值 /// public async Task SortedSetLengthAsync(string redisKey, long min, long max) { return await _database.SortedSetLengthAsync(redisKey, min, max); } #endregion 小北 添加的 几个有序集合功能 } }