초기커밋
This commit is contained in:
294
ServerCommon/Cache/UgcNpcTrendRankCacheRequest.cs
Normal file
294
ServerCommon/Cache/UgcNpcTrendRankCacheRequest.cs
Normal file
@@ -0,0 +1,294 @@
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
using StackExchange.Redis;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
|
||||
|
||||
namespace ServerCommon;
|
||||
|
||||
public class UgcNpcTrendRankCache : CacheBase
|
||||
{
|
||||
public long TrendRankCount { get; set; }
|
||||
public List<(string guid, long score)> Ranks { get; set; } = new();
|
||||
|
||||
public string toBasicString()
|
||||
{
|
||||
return $"UgcNpcTrendRankCache - trend:{TrendRankCount} / list: {Ranks}";
|
||||
}
|
||||
}
|
||||
|
||||
public class UgcNpcTrendRankCacheRequest : RedisRequestSharedBase
|
||||
{
|
||||
// in
|
||||
private readonly string m_rank_type;
|
||||
private DateTime m_date_time { get; set; }
|
||||
|
||||
// out
|
||||
private UgcNpcTrendRankCache? m_trend_rank_cache_nullable { get; set; }
|
||||
|
||||
public UgcNpcTrendRankCacheRequest(UgcNpcRankType type, RedisConnector redisConnector) : base(type.ToString(),
|
||||
redisConnector)
|
||||
{
|
||||
m_rank_type = type.ToString();
|
||||
m_date_time = DateTimeHelper.MinTime;
|
||||
}
|
||||
|
||||
public UgcNpcTrendRankCacheRequest(UgcNpcRankType type, DateTime time, RedisConnector redisConnector) : base(
|
||||
type.ToString(),
|
||||
redisConnector)
|
||||
{
|
||||
m_rank_type = type.ToString();
|
||||
m_date_time = time;
|
||||
}
|
||||
|
||||
protected override string onMakeKey()
|
||||
{
|
||||
if (m_date_time == DateTimeHelper.MinTime) return $"rank:{m_rank_type}:trend";
|
||||
|
||||
var date = m_date_time.ToString("yyyy-MM-dd");
|
||||
return $"rank:{m_rank_type}:trend:{date}";
|
||||
}
|
||||
|
||||
public override string toBasicString() =>
|
||||
$"UgcNpcTrendRankCache: in[{m_rank_type}], out[{m_trend_rank_cache_nullable?.toBasicString()}]";
|
||||
|
||||
public UgcNpcTrendRankCache? getTrendRankCache() => m_trend_rank_cache_nullable;
|
||||
|
||||
public async Task<bool> isExistKey()
|
||||
{
|
||||
try
|
||||
{
|
||||
var result = await onPrepareRequest();
|
||||
if (result.isFail()) return false;
|
||||
|
||||
var database = getDatabase();
|
||||
ArgumentNullException.ThrowIfNull(database);
|
||||
|
||||
var redis_value = await database.KeyExistsAsync(onMakeKey());
|
||||
return redis_value;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
var error_code = ServerErrorCode.TryCatchException;
|
||||
var err_msg = $"Failed to get isExistKey from Redis !!! : : errorCode{error_code}, errMsg:{e.Message} - {nameof(isExistKey)}";
|
||||
Log.getLogger().error(err_msg);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public async Task<Result> getRanks(int pageNum, int size)
|
||||
{
|
||||
var result = new Result();
|
||||
string err_msg;
|
||||
|
||||
var start = (long)pageNum * size;
|
||||
var end = start + size;
|
||||
|
||||
try
|
||||
{
|
||||
result = await onPrepareRequest();
|
||||
if (result.isFail()) return result;
|
||||
|
||||
var database = getDatabase();
|
||||
|
||||
m_trend_rank_cache_nullable = new();
|
||||
|
||||
var rank_trend_key = onMakeKey();
|
||||
if (string.IsNullOrEmpty(rank_trend_key))
|
||||
{
|
||||
m_trend_rank_cache_nullable.TrendRankCount = 0;
|
||||
return result;
|
||||
}
|
||||
|
||||
var total_count = await database.SortedSetLengthAsync(rank_trend_key);
|
||||
|
||||
if (total_count < start)
|
||||
{
|
||||
err_msg =
|
||||
$"Failed to get UgcNpcTrendRankCache from Redis !!! : out of range rank [{total_count}] - {pageNum} / {size}";
|
||||
result.setFail(ServerErrorCode.UgcNpcRankOutOfRange, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
return result;
|
||||
}
|
||||
|
||||
if (total_count < end) end = total_count;
|
||||
|
||||
var redis_value =
|
||||
await database.SortedSetRangeByRankWithScoresAsync(getKey(), start, end, Order.Descending);
|
||||
|
||||
m_trend_rank_cache_nullable.TrendRankCount = total_count;
|
||||
foreach (var value in redis_value)
|
||||
{
|
||||
m_trend_rank_cache_nullable.Ranks.Add((value.Element.ToString(), (long)value.Score));
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
var error_code = ServerErrorCode.TryCatchException;
|
||||
err_msg =
|
||||
$"Failed to get UgcNpcTrendRankCache from Redis !!! : : errorCode{error_code}, errMsg:{e.Message} - {nameof(getRanks)}";
|
||||
result.setFail(error_code, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<Result> initRankScore(Dictionary<string, long> ranks)
|
||||
{
|
||||
var result = new Result();
|
||||
string err_msg;
|
||||
|
||||
var redis_values = new SortedSetEntry[ranks.Count];
|
||||
var idx = 0;
|
||||
|
||||
foreach (var rank in ranks)
|
||||
{
|
||||
var value = new SortedSetEntry(rank.Key, rank.Value);
|
||||
redis_values[idx] = value;
|
||||
idx++;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
result = await onPrepareRequest();
|
||||
if (result.isFail()) return result;
|
||||
|
||||
var database = getDatabase();
|
||||
var transaction = database.CreateTransaction();
|
||||
transaction.AddCondition(Condition.KeyNotExists(getKey()));
|
||||
|
||||
_ = transaction.SortedSetAddAsync(getKey(), redis_values, When.Always);
|
||||
|
||||
var is_success = await transaction.ExecuteAsync();
|
||||
|
||||
if (false == is_success)
|
||||
{
|
||||
err_msg = $"failed to sorted set!! : initRankScore - count[{ranks.Count}]";
|
||||
result.setFail(ServerErrorCode.RedisSortedSetsWriteFailed, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
var error_code = ServerErrorCode.TryCatchException;
|
||||
err_msg = $"Failed to get UgcNpcTotalRankCache from Redis !!! : : errorCode{error_code}, errMsg:{e.Message} - {nameof(setRankScore)}";
|
||||
result.setFail(error_code, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<Result> initRankScore(string rankKey, long deltaCount)
|
||||
{
|
||||
var result = new Result();
|
||||
string err_msg;
|
||||
|
||||
try
|
||||
{
|
||||
result = await onPrepareRequest();
|
||||
if (result.isFail()) return result;
|
||||
|
||||
var database = getDatabase();
|
||||
|
||||
var redis_value = await database.SortedSetAddAsync(getKey(), rankKey, deltaCount, When.Always);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
var error_code = ServerErrorCode.TryCatchException;
|
||||
err_msg = $"Failed to get UgcNpcTrendRankCache from Redis !!! : : errorCode{error_code}, errMsg:{e.Message} - {nameof(setRankScore)}";
|
||||
result.setFail(error_code, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<Result> setTtl()
|
||||
{
|
||||
var result = new Result();
|
||||
string err_msg;
|
||||
|
||||
try
|
||||
{
|
||||
result = await onPrepareRequest();
|
||||
if (result.isFail()) return result;
|
||||
|
||||
var database = getDatabase();
|
||||
|
||||
var expire_time = new TimeSpan(MetaHelper.GameConfigMeta.NpcRankingRetentionPeriod, 0,0);
|
||||
var redis_value = await database.KeyExpireAsync(getKey(), expire_time);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
var error_code = ServerErrorCode.TryCatchException;
|
||||
err_msg = $"Failed to get UgcNpcTotalRankCache from Redis !!! : : errorCode{error_code}, errMsg:{e.Message} - {nameof(setRankScore)}";
|
||||
result.setFail(error_code, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<Result> setRankScore(string rankKey, long deltaCount)
|
||||
{
|
||||
var result = new Result();
|
||||
string err_msg;
|
||||
|
||||
try
|
||||
{
|
||||
result = await onPrepareRequest();
|
||||
if (result.isFail()) return result;
|
||||
|
||||
var database = getDatabase();
|
||||
|
||||
var redis_value = await database.SortedSetAddAsync(getKey(), rankKey, deltaCount, When.NotExists);
|
||||
if (false == redis_value)
|
||||
{
|
||||
_ = await database.SortedSetIncrementAsync(getKey(), rankKey, deltaCount);
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
var error_code = ServerErrorCode.TryCatchException;
|
||||
err_msg =
|
||||
$"Failed to get UgcNpcTrendRankCache from Redis !!! : : errorCode{error_code}, errMsg:{e.Message} - {nameof(setRankScore)}";
|
||||
result.setFail(error_code, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<Result> resetRanks()
|
||||
{
|
||||
var result = new Result();
|
||||
string err_msg;
|
||||
|
||||
try
|
||||
{
|
||||
result = await onPrepareRequest();
|
||||
if (result.isFail()) return result;
|
||||
|
||||
var database = getDatabase();
|
||||
|
||||
_ = await database.KeyDeleteAsync(getKey());
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
var error_code = ServerErrorCode.TryCatchException;
|
||||
err_msg =
|
||||
$"Failed to get UgcNpcTrendRankCache from Redis !!! : : errorCode{error_code}, errMsg:{e.Message} - {nameof(setRankScore)}";
|
||||
result.setFail(error_code, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user