Извлечение выбранных объектов сеанса переадресации сервис-стека на основе значений свойств
Я хочу обновить несколько пользовательских сеансов servicetack, которые хранятся в Redis. Я хочу вернуть все сеансы, для которых настраиваемое свойство имеет определенное значение, и затем я могу их обработать. На данный момент лучшее решение, которое у меня есть, возвращает все ключи как таковые:
List<string> sessionkeys = redis.SearchKeys("urn:iauthsession:*");
Я думаю, что это не будет хорошо масштабироваться. Я хотел бы сделать что-то аналогичное:
List<string> sessionkeys = redis.AllKeys.Where(x=>x.ParentId == 3);
Возможно ли это с помощью Redis, и если да, то как, в идеале, используя стандартные библиотеки с ServiceStack.
1 ответ
Вместо SearchKeys
Вы хотите использовать более новые API Redis Scan, которые позволяют перебирать ключи в курсоре.
Значения Redis имеют блоб и не индексируются, поэтому возможности для их оптимизации невелики. Наиболее эффективным способом будет проверка значений с помощью пользовательской операции LUA на стороне сервера, которая минимизирует количество запросов и полезных данных, отправляемых клиенту.
Встроенная в Redis версия LUA имеет cjson, который можно использовать для десериализации значений JSON, в руководстве Lua для пользователей Redis есть несколько примеров использования этого.
Поскольку Redis не поддерживает запросы или индексы на стороне сервера, способ Redis состоит в том, чтобы предварительно подготовить запросы, к которым необходимо обращаться, и поддерживать пользовательские индексы при каждом сохранении сеанса, некоторые сведения о том, как поддерживать пользовательские индексы в Redis, находятся по адресу:
- Хранение связанных сущностей и ведение пользовательских индексов
- Проектирование базы данных NoSQL с использованием Redis
В ServiceStack вы можете переопределить OnSaveSession()
в вашем AppHost, который вызывается при каждом сохранении сеанса.