Многополевые запросы к Redis с использованием Redis Spring - PullRequest
1 голос
/ 23 января 2020

это будет очень бей c вопрос, так как я новичок в Spring-Redis

Я сейчас нахожусь в процессе изучения базы данных Redis, и я работаю над функцией приоритета, я вынужден Используйте Redis для этой функции. Ниже в вызове / запросе у меня есть.

Прямо сейчас у нас есть DataModel, как показано ниже:

@RedisHash("Org_Work")
public class OrgWork {

   private @Id @Indexed UUID id;
   private @Indexed String CorpDetails;
   private @Indexed String ContractType;
   private @Indexed String ContractAssigned;
   private @Indexed String State;
   private @Indexed String Country; 

}
public interface OrgWorkRepository extends CrudRepository<HoopCalendar, String> {

List<OrgWork> findByCorpDetailsAndContractTypeAndStateAndCountry(String CorpDetails, String ContractType, String ContractAssigned, String State, String Country);

}

мы разрабатываем API для запроса к вышеуказанной модели данных, где перед -end отправит нам поля CorpDetails, ContractType, ContractAssigned, State и Country, и мы должны запросить их в базе данных Redis и вернуть обратно объект DurationOfWork.

В этом случае у меня будет нагрузка прибл. 100000 звонков в минуту.

Пожалуйста, дайте мне знать, если это правильный путь, и некоторые предложения по улучшению времени ответа.

*** Обновлен запрос

1 Ответ

0 голосов
/ 24 января 2020

См. Spring Data Redis - 8.5. Вторичные индексы и:

  • 8.6. Запрос по примеру
  • 8.10. Запросы и методы запросов

Аннотация @Indexed инструктирует Spring Data Redis (SDR) создать вторичный индекс, индексированный как set , для индексации поля ha sh.

Это означает, что при вставке данных SDR будет запускать для Redis семь команд:

HMSET "OrgWork:19315449-cda2-4f5c-b696-9cb8018fa1f9" "_class" "OrgWork" 
    "id" "19315449-cda2-4f5c-b696-9cb8018fa1f9" 
    "CorpDetails" "CorpDetailsValueHere" "ContractType" "ContractTypeValueHere" 
    ... "Country" "Costa Rica"
SADD  "OrgWork" "19315449-cda2-4f5c-b696-9cb8018fa1f9"                           
SADD  "OrgWork:CorpDetails:CorpDetailsValueHere" "19315449-cda2-4f5c-b696-9cb8018fa1f9"
SADD  "OrgWork:ContractType:ContractTypeValueHere" "19315449-cda2-4f5c-b696-9cb8018fa1f9"
...
SADD  "OrgWork:Country:Costa Rica" "19315449-cda2-4f5c-b696-9cb8018fa1f9"

Использование запроса по примеру:

Вы хотите создайте хранилище :

interface OrgWorkRepository extends QueryByExampleExecutor<OrgWork> {
}

и затем выполните запрос, как показано в примере службы ниже:

class OrgWorkService {

  @Autowired OrgWorkRepository orgWorkRepository;

  List<OrgWork> findOrgWorks(OrgWork probe) {
    return orgWorkRepository.findAll(Example.of(probe));
  }
}

И используйте как:

OrgWork orgWorkExample = new OrgWork();                          
orgWorkExample.setCorpDetails("CorpDetailsValueHere"); 
orgWorkExample.setContractType("ContractTypeValueHere");
...
List<OrgWork> results = orgWorkService.findOrgWorks(orgWorkExample);

За кулисами SDR позаботится о преобразовании этого в команды Redis для получения ваших данных, используя комбинацию SINTER и HGETALL :

SINTER   …:CorpDetails:CorpDetailsValueHere   …:ContractType:ContractTypeValueHere   ...
HGETALL "OrgWork:d70091b5-0b9a-4c0a-9551-519e61bc9ef3" 
HGETALL ...

Это двухэтапный процесс:

  1. Извлечение ключей, содержащихся на пересечении вторичных индексов, с использованием SINTER
  2. Извлечение каждого ключа, возвращенного <1> в отдельности, с использованием HGETALL

Рабочая нагрузка 100 000 в минуту должна быть управляемой для Redis при условии, что у вас есть качественный сервис ver, разумный размер набора данных и запросы в среднем несколько определены c.

SINTER имеет временную сложность O (N * M), наихудший случай, где N - количество элементов наименьшего набор и М это количество наборов. У вас есть один набор для каждого измерения в вашем запросе.

HGETALL - это O (N), где N - размер га sh, 7 в вашем случае.

Как всегда Рекомендуется провести сравнительный анализ, чтобы проверить, получаете ли вы желаемую производительность, и отрегулировать при необходимости.

...