在 lua 脚本中按降序获取密钥列表

get key list in descending order in lua scipt

我在 redis 密钥库中有一个列表。它像这样包含日期作为键名。

key  
===  
20160429 
20160430 
20160501
20160502

现在我想输入最后 2 个键,为此我在 lua 脚本中执行以下操作。

local data = {};
local keyslist = redis.call('keys', 'stats:day:*');
local key, users, redisData;
-- keyslist = #keyslist.sort(#keyslist, function(a, b) return a[2] > b[2] end);
-- keyslist = #keyslist.sort(#keyslist, function(a,b) if a>b then return true; else return false; end end); 
for iCtr = 1, #keyslist do

    key = string.gsub(keyslist[iCtr], 'stats:day:','');
    redisData = redis.call('hmget', keyslist[iCtr], 'image','video');
    table.insert(data, {date=key, imgctr=redisData[1], vidctr=redisData[2]});
    if iCtr == 2 then break end
end

但这是返回前 2 条记录,我需要最后 2 条记录(例如以下键)

20160501
20160502

如何获取降序键列表?

排序的示例代码 Lua table:

keylist = {1,2,5,8,3, 5}

-- after the following line keylist will be sorted ascending (default)

table.sort(keylist)

-- this line is equivalent:

table.sort(keylist, function (a,b) return a < b end)

第二个参数是 table.sort 是一个函数,它有两个 table 值,如果第一个小于第二个,returns 为真。

要对 table 降序排序,您只需调用

table.sort(keylist, function(a,b)return a > b end)

请记住,您只能使用它来对 table 值进行排序,而不是它们的键。但是当您在不同的上下文中使用密钥时,这应该可以解决您的问题。

如果我的理解没错,您可能需要执行以下操作:

local count = 0
for iCtr = #keyslist-1,#keyslist do
  count=count+1
  --do your stuff
  if count == 2 then break end
  --or
  if iCtr == #keyslist then break end
end

这将从键列表中的倒数第二个项目开始,然后向上计数。 请注意,我没有测试代码,但它应该可以工作..