0

できるだけ効率的に redis キーのリストを取得したいと考えています。これは redis サーバーで好きなようにモデル化できるので、これは問題を解決するのと同じくらい適切な方法です。状況を説明しましょう。

Redis に文字列として保存されている「顧客」の大規模なセットを想定します。

customer__100000
customer__100001
customer__100002

各顧客にはかなりの数の属性があります。その中には、彼らが住んでいる都市があります。各都市も Redis に保存されます。

city__New York
city__San Francisco
city__Washington DC

のプロセスを経て、最終的に顧客キーのセット (プレフィルター用の交差セット) が得られます。これらのキーを取得したら、それらの顧客の中にどの都市があるかを調べる必要があります。ここでの私の最終目標は、都市の名前を取得することですが、都市名を取得できるキーを取得できれば、それも問題ありません。

ここで話している規模のアイデアを示すために、約 70 の属性 (都市はそのうちの 1 つ) を持ち、各属性が 50 から 100,000 の 20 万から 30 万の顧客を扱っていると仮定します。なるべく効率よく進めていきたいです。

4

1 に答える 1

2

顧客を文字列として保存する代わりに、ハッシュとして保存する必要があります。Redis のハッシュの ziplist エンコーディングは、スペース効率が非常に優れています。70 を超える要素を格納している場合hash-max-ziplist-entriesは、redis.conf の制限を上げることを検討する必要があります

SORTRedis ハッシュを使用していると、楽しいことができます。SORTwith GETandを使用するSTOREことで、顧客からすべての都市を取得し、それらをリストとして保存できます (個別ではありません)。lpop次に、リストに対してandを呼び出して、リストをセットに変換できsaddます。

Redis Lua スクリプトの例を次に示します。

-- a key which holds a set of customer keys
local set_of_customer_keys = KEYS[1]
-- a maybe-existing key which will hold the set of cities
local distinct_set = ARGV[1]
-- attribute to get (defaults to city)
local attribute = ARGV[2] or 'city'
-- remove current set of distinct_cities
redis.call("DEL", distinct_set)
-- use SORT to build a list out of customer hash values for `attribute` 
local cities = redis.call("SORT", set_of_customer_keys, "BY", "nosort", "GET", "*->"..attribute)
-- loop through all cities in the list and add them to the distinct cities set
for i, city in pairs(cities) do
  redis.call("SADD", distinct_set, city)
end
-- return the distinct cities
return redis.call("SMEMBERS", distinct_set)

customer__100000__cities顧客の属性とともに永続的に保存されるセットを保持し、それを使用sinter *customer_cities_keysして個別の都市のセットを取得することもできますが、メモリ効率が低下します。

于 2013-04-17T15:56:46.870 に答える