2

エントリが数値 ID を JSON でエンコードされた配列にマップするハッシュ 'users' があるとします。たとえば、整数 1 は文字列 {name: 'John', surname: 'Doe', 職業: 'plumber'} にマップされます。 .

ハッシュ内のアイテムの数値 ID は、さまざまなリストに格納されます。したがって、「foobar」がこれらのリストの 1 つである場合、そこから実際のデータを取得するには、単純な Lua スクリプトを実行します (サーバー側の結合操作を実装します)。または、私が学んだばかりのように、次のようなものを使用できます

SORT foobar BY inexistent_key GET user:*

しかし、それは各ユーザーのデータを個別のキーに保存することを意味しますが、これはコストがかかるようです (私の場合、小さなコレクションがたくさんあるので、ハッシュの Redis 圧縮を利用したいと考えています)。

最後に問題は次のとおりです。これらのリストをアルファベット順に、たとえば各ユーザーの姓、次に名前の順に並べる必要があります。基礎となるデータモデルをあまり変更せずに (可能であれば)、これを達成するための最良の方法は何ですか?

これまでのところ、私が考えることができる最善の方法は、SORT コマンドを BY 句と STORE 句と一緒に使用することでした。

SORT foobar BY surname:* STORE foobar

リストが変更されるたびに、しかしそのように私は多くのキーが必要になります. 理想的なソリューションとなる BY 句でハッシュを使用できれば、それは私には思えます。

並べ替えたいフィールドが何らかの形で制限されている場合 (数百の姓など)、文字列を整数にマッピングして Redis 並べ替えセットを使用することを考えることができますが、そうではないようです。

4

2 に答える 2

3

Lua スクリプトの複雑さなしに、ハッシュ キーで並べ替えることができますが、Json 構造のキーを Redis のハッシュ キーに複製する必要があります。

以下の例の構造は次のとおりです。

usersはクエリ内のユーザー ID のセットです。

user:Xは、重複した名前/のデータを含む Redis ハッシュです。

userdata :Xは、元のユーザー Json ハッシュです。


redis> hmset user:1 name First surname User
OK
redis> set userdata:1 "{occupation: 'Tester'}"
OK
redis> hmset user:2 name Last surname Violet
OK
redis> set userdata:2 "{occupation: 'Bookseller'}"
OK
redis> hmset user:3 name Middle surname Veredict
OK
redis> set userdata:3 "{occupation: 'Judge'}"
OK
redis> hmset user:4 name Ultimate surname Veredict
OK
redis> set userdata:4 "{occupation: 'Ultimate Judge'}"
OK
redis> sadd users 1
(integer) 1
redis> sadd users 2
(integer) 1
redis> sadd users 3
(integer) 1
redis> sadd users 4
(integer) 1
redis> sort users by user:*->surname get user:*->name get user:*->surname get userdata:* alpha
1) "First"
2) "User"
3) "{occupation: 'Tester'}"
4) "Middle"
5) "Veredict"
6) "{occupation: 'Judge'}"
7) "Ultimate"
8) "Veredict"
9) "{occupation: 'Ultimate Judge'}"
10) "Last"
11) "Violet"
12) "{occupation: 'Bookseller'}"

編集

By複数が最後の節のみを考慮していることを見落としていました。したがって、1 つのコマンドで複数のキーで並べ替えることはできません。

また、SORT辞書式順序付けに使用されるコマンドにはalpha修飾子が必要になりました。

于 2012-07-15T16:10:09.233 に答える
1

結局、私の問題に取り組む方法は、Luaで利用可能なtable.sort()関数を使用することであるように思われます。小さなハッシュ「users」とIDの小さなリスト「foobar」に加えて、「users:sort-strings」などの別の小さなハッシュを導入しました。ここには、IDを並べ替える文字列を格納します。 foob​​ar'(架空の例では、名前と名前の組み合わせ)。'foobar'を並べ替えるには、Redisで次のLuaスニペットを実行し、キー'foobar'、'users:sort-strings'、および'foobar:tmp'(一時キー)として渡します。

local lst = redis.call('LRANGE', KEYS[1], 0, -1)
local sort_function = function (id0, id1)
   local s0 = redis.call('HGET', KEYS[2], id0)
   local s1 = redis.call('HGET', KEYS[2], id1)
   return (s0 < s1)
end
table.sort(lst, sort_function)
for key, value in ipairs(lst) do
   redis.call('RPUSH', KEYS[3], value)
end
redis.call('DEL', KEYS[1])
redis.call('RENAME', KEYS[3], KEYS[1])
于 2012-07-17T08:31:54.113 に答える