2016-05-16 88 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"