我在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"
(反向)?
答案 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"