using Admin.Core.Common; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using StackExchange.Redis; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace Admin.Core.Extensions { public class RedisBasketRepository : IRedisBasketRepository { private readonly ILogger _logger; private readonly ConnectionMultiplexer _redis; private readonly IDatabase _database; public RedisBasketRepository(ILogger logger, ConnectionMultiplexer redis) { _logger = logger; _redis = redis; _database = redis.GetDatabase(); } private IServer GetServer() { var endpoint = _redis.GetEndPoints(); return _redis.GetServer(endpoint.First()); } private IServer GetServer(System.Net.EndPoint endpoint) { return _redis.GetServer(endpoint); } /// /// 获取服务基础信息 /// public RedisBaseView GetBaseInfo() { var server = GetServer(); RedisBaseView view = new RedisBaseView() { redis_version = server.Version.ToString(), redis_mode = server.ServerType.ToString(), connected_clients = "", uptime_in_days = "", used_cpu_user_children = "", maxmemory_human = "", aof_enabled = "", rdb_last_bgsave_status = "", dbSize = "", instantaneous_input_kbps = "", instantaneous_output_kbps = "", }; return view; } /// /// 缓存监控 /// public List GetAllKes() { List redisKeys = new List(); foreach (var endPoint in _redis.GetEndPoints()) { var server = _redis.GetServer(endPoint); foreach (var key in server.Keys()) { RedisKeyView redisKey = new RedisKeyView() { Server = server.ToString(), Point = endPoint.ToString(), Key = key }; redisKeys.Add(redisKey); } } return redisKeys; } /// /// 节点状态 /// /// public List GetPointStatus() { //var ServerSelectionStrategy = _redis.OperationCount; List statuses = new List(); var endpoint = _redis.GetEndPoints(); foreach (var item in endpoint) { PointStatus status = new PointStatus() { Point = item.ToString(), Normal = GetServer(item).IsConnected }; statuses.Add(status); } return statuses; } /// /// 全部清除 /// /// public async Task Clear() { foreach (var endPoint in _redis.GetEndPoints()) { var server = GetServer(); foreach (var key in server.Keys()) { await _database.KeyDeleteAsync(key); } } } /// /// 判断是否存在 /// /// /// public async Task Exist(string key) { return await _database.KeyExistsAsync(key); } /// /// 获取 Reids 缓存值 /// /// /// public async Task GetValue(string key) { return await _database.StringGetAsync(key); } /// /// 移除某一个缓存值 /// /// /// public async Task Remove(string key) { return await _database.KeyDeleteAsync(key); } /// /// 保存-默认系统过期时间 /// /// /// /// 缓存过期时间,单位:分钟 /// public async Task SetStr(string key, string value, int timeSpan = 0) { value = value.IsNotEmptyOrNull() ? value : string.Empty; // 缓存过期时间:分钟 var cacheTimeOut = Appsettings.app(new string[] { "AppSettings", "CacheTimeOut" }).ObjToInt(); var cacheTime = TimeSpan.FromSeconds(timeSpan == 0 ? cacheTimeOut * 60 : timeSpan * 60); //序列化,将object值生成RedisValue return await _database.StringSetAsync(key, value, cacheTime); } /// /// 保存-永不过期 /// /// /// /// public async Task SetStrL(string key, string value) { value = value.IsNotEmptyOrNull() ? value : string.Empty; //序列化,将object值生成RedisValue return await _database.StringSetAsync(key, value); } /// /// 保存-默认系统过期时间 /// /// /// /// 缓存过期时间,单位:分钟 /// public async Task SetObj(string key, object value, int timeSpan = 0) { value = value.IsNotEmptyOrNull() ? value : string.Empty; // 缓存过期时间:分钟 var cacheTimeOut = Appsettings.app(new string[] { "AppSettings", "CacheTimeOut" }).ObjToInt(); var cacheTime = TimeSpan.FromSeconds(timeSpan == 0 ? cacheTimeOut * 60 : timeSpan * 60); //序列化,将object值生成RedisValue return await _database.StringSetAsync(key, SerializeHelper.Serialize(value), cacheTime); } /// /// 保存-永不过期 /// /// /// /// public async Task SetObjL(string key, object value) { value = value.IsNotEmptyOrNull() ? value : string.Empty; //序列化,将object值生成RedisValue return await _database.StringSetAsync(key, SerializeHelper.Serialize(value)); } /// /// 获取值,并序列化 /// /// /// /// public async Task Get(string key) { var value = await _database.StringGetAsync(key); if (value.HasValue) { //需要用的反序列化,将Redis存储的Byte[],进行反序列化 return SerializeHelper.Deserialize(value); } else { return default(TEntity); } } /// /// 根据key获取RedisValue /// /// /// /// public async Task ListRangeAsync(string redisKey) { return await _database.ListRangeAsync(redisKey); } /// /// 在列表头部插入值。如果键不存在,先创建再插入值 /// /// /// /// public async Task ListLeftPushAsync(string redisKey, string redisValue, int db = -1) { return await _database.ListLeftPushAsync(redisKey, redisValue); } /// /// 在列表尾部插入值。如果键不存在,先创建再插入值 /// /// /// /// public async Task ListRightPushAsync(string redisKey, string redisValue, int db = -1) { return await _database.ListRightPushAsync(redisKey, redisValue); } /// /// 在列表尾部插入数组集合。如果键不存在,先创建再插入值 /// /// /// /// public async Task ListRightPushAsync(string redisKey, IEnumerable redisValue, int db = -1) { 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, int db = -1) where T : class { return JsonConvert.DeserializeObject(await _database.ListLeftPopAsync(redisKey)); } /// /// 移除并返回存储在该键列表的最后一个元素 反序列化 /// 只能是对象集合 /// /// /// public async Task ListRightPopAsync(string redisKey, int db = -1) where T : class { return JsonConvert.DeserializeObject(await _database.ListRightPopAsync(redisKey)); } /// /// 移除并返回存储在该键列表的第一个元素 /// /// /// /// public async Task ListLeftPopAsync(string redisKey, int db = -1) { return await _database.ListLeftPopAsync(redisKey); } /// /// 移除并返回存储在该键列表的最后一个元素 /// /// /// /// /// public async Task ListRightPopAsync(string redisKey, int db = -1) { return await _database.ListRightPopAsync(redisKey); } /// /// 列表长度 /// /// /// /// public async Task ListLengthAsync(string redisKey, int db = -1) { 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, int db = -1) { 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, int db = -1) { return await _database.ListRemoveAsync(redisKey, redisValue, type); } /// /// 清空List /// /// /// public async Task ListClearAsync(string redisKey, int db = -1) { await _database.ListTrimAsync(redisKey, 1, 0); } } }