Redis:将前n个元素相对于Sorted Set中的给定元素

时间:2017-02-28 14:32:36

标签: sorting redis

我在Redis中有一个Sorted Set,它按分数存储我的数据,到目前为止一切正常。

分数是时间序列,数据是字符串Id。我想要的是将前三个元素相对于按时间排序的给定元素。

例如,我的排序集SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[Employee_Update] @EmployeeId [int], @LastName [nvarchar](max), @FirstName [nvarchar](max), @MiddleName [nvarchar](max), @Gender [nvarchar](max), @Salary [decimal](18, 2), @DepartmentId [int] AS BEGIN UPDATE [dbo].[Employees] SET [LastName] = @LastName, [FirstName] = @FirstName, [MiddleName] = @MiddleName, [Gender] = @Gender, [Salary] = @Salary, [DepartmentId] = @DepartmentId WHERE ([EmployeeId] = @EmployeeId) END 包含这些数据(按反向得分排序):

"ids_by_time"

是否可以使用此查询Redis Sorted Set将订单中的前3个获得50000 "rev75" 49055 "rev95" 49050 "rev25" 49025 "rev11" 49015 "rev500" 49000 "rev1" 48105 "rev22" 48000 "rev300" 47999 "rev74" 47345 "rev33" 47255 "rev11" 46288 "rev5" ?在这种情况下,结果将按此顺序"rev1"(反向)?

1 个答案:

答案 0 :(得分:3)

是的,可以这样做。一种方法是阅读文档并弄清楚。另一种方法是在SO上提出问题并希望有人来帮助。

要完成上述任务,首先需要知道“给定元素”的等级 - 使用ZREVRANK命令很容易获得。然后,使用回复计算相关元素范围的排名,并使用ZREVRANGE获取,即如果排名为n,则需要使用n+1的范围到n+3接下来的3个元素。像这样:

127.0.0.1:6379> ZREVRANGE ids_by_time 0 -1
 1) "rev75"
 2) "rev95"
 3) "rev25"
 4) "rev500"
 5) "rev1"
 6) "rev22"
 7) "rev300"
 8) "rev74"
 9) "rev33"
10) "rev11"
11) "rev5"
127.0.0.1:6379> ZREVRANK ids_by_time rev1
(integer) 4
127.0.0.1:6379> ZREVRANGE ids_by_time 5 7
1) "rev22"
2) "rev300"
3) "rev74"

您始终可以将其包装在Lua脚本中,以确保原子性和最小的网络流量。例如:

~$ cat script.lua 
local rank = redis.call('ZREVRANK', KEYS[1], ARGV[1])
return redis.call('ZREVRANGE', KEYS[1], rank+1, rank+tonumber(ARGV[2]))
~$ redis-cli --eval script.lua ids_by_time , rev1 3
1) "rev22"
2) "rev300"
3) "rev74"