mix*_*dev 8 database-design data-modeling redis
我有用户作为Redis Hashes,并希望根据工资和年龄找到类似的用户(给定特定用户).
<user>
<id>101</id>
<name>Neo</name>
<age>30</age>
<salary>300</salary>
....
</user>
Run Code Online (Sandbox Code Playgroud)
因此,在这种情况下,我需要找到接近我的年龄和工资的用户,这些用户都在某个给定的限度内接近我的工资.在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
Run Code Online (Sandbox Code Playgroud)
我们可以这样做,比如说使用ZINTERSTORE,结果集合是按照SQL中的用户相似性排序的吗?
She*_*har 12
这不像SQL查询那么容易.你需要设置一些键等.
不过,这就是我认为的方法.您需要创建两个已排序的集合,其中用户ID为成员,年龄/工资为分数.
ZADD index:user:age 30 101 # 101 is id of user whose name is Neo
ZADD index:user:salary 300 101
Run Code Online (Sandbox Code Playgroud)
为两个条件创建中间集
# 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
Run Code Online (Sandbox Code Playgroud)
最后