using NetAdmin.Application.Services;
using NetAdmin.Domain.Dto.Dependency;
using NetAdmin.Domain.Dto.Sys.Cache;
using NetAdmin.SysComponent.Application.Services.Sys.Dependency;
using StackExchange.Redis;
namespace NetAdmin.SysComponent.Application.Services.Sys;
///
public sealed class CacheService(IConnectionMultiplexer connectionMultiplexer) //
: ServiceBase, ICacheService
{
private readonly InstanceNode _redisInstance;
///
/// Initializes a new instance of the class.
///
public CacheService(IConnectionMultiplexer connectionMultiplexer, IOptions redisOptions) //
: this(connectionMultiplexer) //
{
_redisInstance = redisOptions.Value.Instances.First(x => x.Name == Chars.FLG_REDIS_INSTANCE_DATA_CACHE);
}
///
public async Task CacheStatisticsAsync()
{
var database = connectionMultiplexer.GetDatabase(_redisInstance.Database);
return new CacheStatisticsRsp((string)await database.ExecuteAsync("info").ConfigureAwait(false)) {
DbSize = (long)await database.ExecuteAsync("dbSize").ConfigureAwait(false)
};
}
///
public async Task> GetAllEntriesAsync(PagedQueryReq req)
{
req.ThrowIfInvalid();
var database = connectionMultiplexer.GetDatabase(_redisInstance.Database);
var redisResults = (RedisResult[])await database
.ExecuteAsync("scan", (req.Page - 1) * req.PageSize, "count"
, req.PageSize)
.ConfigureAwait(false);
var list = ((string[])redisResults![1])!.Where(x => database.KeyType(x) == RedisType.Hash)
.Select(x => database.HashGetAll(x)
.Append(new HashEntry("key", x))
.ToArray()
.ToStringDictionary())
.ToList()
.ConvertAll(x => x.Adapt());
return new PagedQueryRsp(req.Page, req.PageSize, 10000, list);
}
}