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 } }