Redis:排序哈希"字段"在阿尔法

时间:2016-05-16 08:48:57

标签: sorting hash redis

我正在尝试排序"字段"在哈希。 例如,

  1. mykey,cde,firstone
  2. mykey,abcde,secondone
  3. mykey,bcde,thirdone
  4. 我想按字母顺序对字段(cde,abcde,bcde)进行排序,但是没有办法这样做..如果有人知道这一点,请帮助我。

    如果没有办法解决这个问题,我正在考虑更改密钥和值的名称..并使用zadd而不是hash。如果你有更好的解决方案,请在这里给我一个建议。

1 个答案:

答案 0 :(得分:0)

哈希字段名称不能轻易排序 - 没有本地命令可以执行此操作,并且返回字段的顺序(例如,使用HGETALL)是随机的所有意图和目的。

虽然排序集在排序时更受欢迎,但您可以使用Lua脚本解决这个问题,该脚本将对Hash的字段进行词法排序。例如:

$ cat hashsort.lua
local r = redis.call('HGETALL',KEYS[1])
local t = {}
for i=1,#r,2 do
    t[#t+1] = { field = r[i], value = r[i+1] }
end
table.sort(t, function(a,b) return a.field < b.field end)
r = {}
for _, v in pairs(t) do
    r[#r+1] = v.field
    r[#r+1] = v.value
end
return r

$ redis-cli HMSET hash z 99 ee 55 e 5 a 1 b 2 ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ justsomethinglongsohashmaxzipwillbeexceeded
OK
$ redis-cli --eval hashsort.lua hash
 1) "a"
 2) "1"
 3) "b"
 4) "2"
 5) "e"
 6) "5"
 7) "ee"
 8) "55"
 9) "z"
10) "99"
11) "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
12) "justsomethinglongsohashmaxzipwillbeexceeded"