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