using FreeRedis;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Options;
using Microsoft.VisualBasic;
using Volo.Abp.Application.Services;
using Volo.Abp.Caching;
using Volo.Abp.DependencyInjection;
using Yi.Framework.Rbac.Application.Contracts.Dtos.MonitorCache;
using Yi.Framework.Rbac.Application.Contracts.IServices;
namespace Yi.Framework.Rbac.Application.Services.Monitor
{
public class MonitorCacheService : ApplicationService, IMonitorCacheService
{
public IAbpLazyServiceProvider LazyServiceProvider { get; set; }
///
/// 缓存前缀
///
private string CacheKeyPrefix => LazyServiceProvider.LazyGetRequiredService>().Value.KeyPrefix;
private bool EnableRedisCache
{
get
{
var redisEnabled = LazyServiceProvider.LazyGetRequiredService()["Redis:IsEnabled"];
return redisEnabled.IsNullOrEmpty() || bool.Parse(redisEnabled);
}
}
///
/// 使用懒加载防止报错
///
private IRedisClient RedisClient => LazyServiceProvider.LazyGetRequiredService();
///
/// 获取所有key并分组
///
///
[HttpGet("monitor-cache/name")]
public List GetName()
{
VerifyRedisCacheEnable();
var keys = RedisClient.Keys(CacheKeyPrefix + "*");
var result = GroupedKeys(keys.ToList());
var output = result.Select(x => new MonitorCacheNameGetListOutputDto { CacheName = x }).ToList();
return output;
}
private List GroupedKeys(List keys)
{
HashSet resultSet = new HashSet();
foreach (string str in keys)
{
string[] parts = str.Split(':');
// 如果字符串中包含冒号,则将第一部分和第二部分进行分组
if (parts.Length >= 2)
{
string group = $"{parts[0]}:{parts[1]}";
resultSet.Add(group);
}
// 如果字符串中不包含冒号,则直接进行分组
else
{
resultSet.Add(str);
}
}
return resultSet.ToList();
}
private void VerifyRedisCacheEnable()
{
if (!EnableRedisCache)
{
throw new UserFriendlyException("后端程序未使用Redis缓存,无法对Redis进行监控,可切换使用Redis");
}
}
[HttpGet("monitor-cache/key/{cacaheName}")]
public List GetKey(string cacaheName)
{
VerifyRedisCacheEnable();
var output = RedisClient.Keys($"{cacaheName}:*").Select(x => x.RemovePreFix(cacaheName + ":"));
return output.ToList();
}
//全部不为空
[HttpGet("monitor-cache/value/{cacaheName}/{cacaheKey}")]
public MonitorCacheGetListOutputDto GetValue(string cacaheName, string cacaheKey)
{
var value = RedisClient.HGet($"{cacaheName}:{cacaheKey}", "data");
return new MonitorCacheGetListOutputDto() { CacheKey = cacaheKey, CacheName = cacaheName, CacheValue = value };
}
[HttpDelete("monitor-cache/key/{cacaheName}")]
public bool DeleteKey(string cacaheName)
{
VerifyRedisCacheEnable();
RedisClient.Del($"{cacaheName}:*");
return true;
}
[HttpDelete("monitor-cache/value/{cacaheName}/{cacaheKey}")]
public bool DeleteValue(string cacaheName, string cacaheKey)
{
RedisClient.Del($"{cacaheName}:{cacaheKey}");
return true;
}
[HttpDelete("monitor-cache/clear")]
public bool DeleteClear()
{
RedisClient.FlushDb();
return true;
}
}
}