Redis
 sql >> база данни >  >> NoSQL >> Redis

Запитване с много полета в Redis с помощта на Redis Spring

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

  • 8.6. Запитване по пример
  • 8.10. Заявки и методи за заявки

Анотацията @Indexed инструктира Spring Data Redis (SDR) да създаде вторичен индексиран като набор за индексиране на полето на хеша.

Това означава, че когато вмъкнете данни, 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, ако приемем, че имате качествен сървър, разумен размер на набора от данни и средно запитванията са малко специфични.

SINTER има времева сложност от O(N*M) в най-лошия случай, където N е мощността на най-малкия набор, а M е броят на наборите. Имате един набор за всяко измерение на вашата заявка.

HGETALL е O(N), където N е размерът на хеша, 7 във вашия случай.

Както винаги, препоръчва се да направите сравнителен анализ, за ​​да тествате дали получавате желаната производителност и да коригирате, ако е необходимо.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да изчистя блокирани/застояли Resque работници?

  2. API за електронна търговия, направен с Node-Js, Typescript, PostgreSQL, Redis и Kafka

  3. Как да изтриете групово стотици хиляди ключове със специални знаци в Redis

  4. Redis pub/sub за чат сървър в node.js

  5. Redis Cluster - готово за производство?