2016-05-16 105 views
0

我想排序哈希中的“字段”。 例如,Redis:排序哈希“字段”在阿尔法

  1. 的myKey,CDE firstone
  2. 的myKey,ABCDE,secondone
  3. 的myKey,BCDE,thirdone

我想的字段进行排序(CDE,ABCDE,BCDE)按字母顺序排列,但是没有办法这样做..如果有人知道这个,请帮助我。

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

回答

0

哈希字段名称无法排序 - 很容易 - 没有本机命令来执行此操作,并且字段返回的顺序(例如,使用HGETALL)适用于所有意图和目的随机。

虽然排序集合在排序时更为可取,但您可以使用将执行词法排序哈希字段的Lua脚本来解决此问题。例如:

$ 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"