Извлечение выбранных объектов сеанса переадресации сервис-стека на основе значений свойств

Я хочу обновить несколько пользовательских сеансов 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, находятся по адресу:

В ServiceStack вы можете переопределить OnSaveSession() в вашем AppHost, который вызывается при каждом сохранении сеанса.

Другие вопросы по тегам