2016-05-16 12 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" 
関連する問題