157 lines
5.7 KiB
C#
157 lines
5.7 KiB
C#
namespace PARR.Domain.Cache
|
||
{
|
||
/// <summary>
|
||
/// Ключи для кэша
|
||
/// </summary>
|
||
public static class CacheKeys
|
||
{
|
||
#region Пример
|
||
// Пример для русских букв
|
||
//public static class Test
|
||
//{
|
||
// // Если нужно конвертировать русские буквы
|
||
// public static (string[], string[]) Ttt(string workGroup) => (["shortcode"], [workGroup]);
|
||
//}
|
||
#endregion
|
||
|
||
/// <summary>
|
||
/// Имя bucket
|
||
/// </summary>
|
||
private const string BucketName = "bucket";
|
||
|
||
|
||
/// <summary>
|
||
/// Авторизация пользователей, сессии
|
||
/// </summary>
|
||
public static class UserAuth
|
||
{
|
||
/// <summary>
|
||
/// Авторизированный пользователь
|
||
/// </summary>
|
||
/// <param name="ipAddress"></param>
|
||
/// <returns></returns>
|
||
public static string[] Session(string ipAddress) => ["user", "session", ipAddress];
|
||
|
||
/// <summary>
|
||
/// Заблокированный пользователь
|
||
/// </summary>
|
||
/// <param name="ipAddress"></param>
|
||
/// <returns></returns>
|
||
public static string[] Banned(string ipAddress) => ["user", "banned", ipAddress];
|
||
}
|
||
|
||
/// <summary>
|
||
/// Отчеты о загруженности
|
||
/// </summary>
|
||
public static class Workload
|
||
{
|
||
/// <summary>
|
||
/// Ключ для Template Hash
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public static string[] TemplateHash() => ["template", "report", "params"];
|
||
|
||
/// <summary>
|
||
/// Ключ Template внутри Hash
|
||
/// </summary>
|
||
/// <param name="id"></param>
|
||
/// <returns></returns>
|
||
public static string[] Template(Guid id) => [id.ToString()];
|
||
|
||
/// <summary>
|
||
/// Отчет о загруженности, все ЗО
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public static string[] WorkloadResponseAreaAll() => ["workload", "response-area", "all"];
|
||
|
||
/// <summary>
|
||
/// Отчет о загруженности, одна ЗО
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public static string[] WorkloadResponseAreaItem() => ["workload", "response-area", "item"];
|
||
|
||
/// <summary>
|
||
/// Отчет о загруженности, все РГ
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public static string[] WorkloadWorkGroupAll() => ["workload", "work-group", "all"];
|
||
|
||
/// <summary>
|
||
/// Отчет о загруженности, одна РГ
|
||
/// </summary>
|
||
public static string[] WorkloadWorkGroupItem() => ["workload", "work group", "item"];
|
||
}
|
||
|
||
/// <summary>
|
||
/// Юниты
|
||
/// </summary>
|
||
public static class Unit
|
||
{
|
||
/// <summary>
|
||
/// Ключ для Unit Hash с bucket
|
||
/// </summary>
|
||
/// <param name="unitId"></param>
|
||
/// <returns></returns>
|
||
public static string[] UnitHashWithBucket(Guid unitId) => ["unit", BucketName, GetBucketKey(unitId)];
|
||
|
||
/// <summary>
|
||
/// Ключ Unit внутри Hash
|
||
/// </summary>
|
||
/// <param name="unitId"></param>
|
||
/// <returns></returns>
|
||
public static string[] UnitItem(Guid unitId) => [unitId.ToString()];
|
||
}
|
||
|
||
|
||
|
||
#region Helpers
|
||
|
||
/// <summary>
|
||
/// Получить имя (номер) bucket по id.
|
||
/// Оптимальное кол-во элементов в бакете 512-1000 (если больше, оптимизировать настройки Redis).
|
||
/// </summary>
|
||
/// <param name="id"></param>
|
||
/// <param name="bucketSize">Кол-во bucket`ов</param>
|
||
/// <returns></returns>
|
||
private static string GetBucketKey(Guid id, BucketSize bucketSize = BucketSize.Size256)
|
||
{
|
||
// Получаем GUID в виде строки без дефисов (32 символа)
|
||
string guidString = id.ToString("N");
|
||
|
||
//4096
|
||
|
||
// Берем первые xx символа как срез памяти (без аллокации новой строки)
|
||
ReadOnlySpan<char> hexPart = guidString.AsSpan(0, (int)bucketSize);
|
||
|
||
// Конвертируем Hex в обычное число byte
|
||
if (!int.TryParse(hexPart, System.Globalization.NumberStyles.HexNumber, null, out int bucketId))
|
||
{
|
||
// На случай непредвиденных сбоев, хотя для валидного GUID это невозможно
|
||
bucketId = 0;
|
||
}
|
||
|
||
return bucketId.ToString();
|
||
}
|
||
|
||
/// <summary>
|
||
/// Кол-во возможных bucket.
|
||
/// В bucket оптимально размещать до 1000 записей, если больше, то требуется переконфигурация redis
|
||
/// </summary>
|
||
private enum BucketSize
|
||
{
|
||
/// <summary>
|
||
/// Для 256 bucket`ов - берем 2 символа
|
||
/// </summary>
|
||
Size256 = 2,
|
||
|
||
/// <summary>
|
||
/// Для 4096 bucket`ов - берем 3 символа
|
||
/// </summary>
|
||
Size4096 = 3
|
||
}
|
||
|
||
#endregion
|
||
|
||
}
|
||
}
|