Redis многостолбцовый запрос диапазона - PullRequest
8 голосов
/ 22 мая 2011

У меня есть пользователи как Redis Hashes, и я хочу найти похожих пользователей (с учетом конкретного пользователя) по зарплате и возрасту.

<user>
  <id>101</id>
  <name>Neo</name>
  <age>30</age>
  <salary>300</salary>
  ....
</user>

Итак, в этом случае мне нужно найти пользователей, которые близки кмой возраст И зарплата близка к моей зарплате как в определенных пределахВ SQL я бы гипотетически сделал что-то вроде

SELECT id, abs(age - 30) as agediff, abs(salary - 300) as saldiff FROM
 USERS WHERE 
(age BETWEEN 25 35) AND (salary BETWEEN 250 350) ORDER BY agediff ASC, saldiff ASC

Можем ли мы сделать это, скажем, используя ZINTERSTORE, таким образом, чтобы результирующий набор упорядочивался по пользовательскому сходству, как в SQL?

1 Ответ

12 голосов
/ 23 мая 2011

Это не так просто, как запрос SQL. Вам нужно установить некоторые ключи и т. Д.

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

ZADD index:user:age 30 101 # 101 is id of user whose name is Neo
ZADD index:user:salary 300 101 

Создание промежуточных наборов для обоих условий

# Condition 1: age 25-30
ZUNIONSTORE temp:age 1 index:user:age WEIGHTS 1
ZREMRANGEBYSCORE temp:age 0 24
ZREMRANGEBYSCORE temp:age 36 INF
# Condition 2: Repeat above for salary
# Now create result set which is intersection of both above sets
ZINTERSTORE temp:result 2 temp:salary temp:age # 2 is no. of sets to intersect
# Verify result
ZRANGE temp:result 0 -1

Наконец

  • удалить временные ключи
  • Запустите все эти команды, используя MULTI / EXEC, чтобы был только один прием в оба конца
...