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

Redis филтрирайте по диапазон, сортирайте и първо върнете 10

Случаят на употреба, който описвате, не може да бъде моделиран елегантно в NoSQL решения. Това не е ограничение на Redis.

Нека обясня това малко повече. Изпълнявате заявки за диапазон в едно поле и сортирате в друго. Това не е нещо, в което NoSQL решенията са добри. Например Google App Engine забранява подобни заявки. Разгледайте ограниченията на заявките на GAE и прочетете раздела „Свойствата във филтрите за неравенство трябва да бъдат сортирани преди други поръчки за сортиране“

За да получи всички резултати, които съответстват на филтър за неравенство, заявка сканира индексната таблица за първия съвпадащ ред, след което връща всички последователни резултати, докато не намери ред, който не съвпада. За да могат последователните редове да представят пълния набор от резултати, редовете трябва да бъдат подредени от филтъра за неравенство преди други редове за сортиране.

Като каза това, все още можете ефективно да изпълнявате заявките си, но решението няма да е елегантно.

  1. Създайте диапазони на заплати - 0-5000, 5000-10000, 10000-15000 и т.н.
  2. Създайте набори като users_with_salary:10000-15000 . Този набор ще съдържа потребителски идентификатори, които имат заплата в дадения диапазон.
  3. По същия начин създайте набори като „users_with_rating:1-2“. Този набор ще съдържа потребителски идентификатори, които имат оценки в дадения диапазон
  4. Сега изпълнете следния псевдокод

String userids[];
for(rating = 10; rating > 0; rating--) {
  for(salary = min_salary; salary < max_salary; salary += 5000) {
      String salary_key = "users_with_salary:" + salary + "-" + (salary+5000);
      String rating_key = "users_with_rating:" + rating + "-" + (rating+1);

      userids.append(redis.sinter(salary_key, rating_key));

      if(userids.length > 10) {
         break;
      }
   }
}

С redis 2.6 и lua скриптове можете дори да стартирате това на сървъра на lua.

В заключение, ако искате да изпълнявате сложни заявки за вашите данни, най-добре е да ги моделирате в релационна база данни.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Демократична опашка в Сидекик

  2. Как да изброя всички Redis бази данни?

  3. Проблем с контролния поток с възел/редис и обратни извиквания?

  4. Как *правилно* запитвате Redis от Tornado?

  5. Разширението phpredis не работи, не може да зареди 'redis.so'