2016-06-27 16 views
0

redis-pyおよびRedisリスト・データ型を使用してスタック・データ構造を実装しています。対応するリストのデータ型が空の場合の処理​​方法については明確ではありません。既定のRedisの動作は、リストが空になると、関連するキーが削除されるように見えます。例えば、空のリストの場合はRedisでヒットします。これは、Python終了時にスタックデータ構造内のすべての要素をポップまたはクリアするときです。基本的には、自分のコードにRedisリストの操作を呼び出すスタックオブジェクトがあるということです。たとえば、スタックオブジェクトのクライアントがstack.pop()を実行すると、スタックオブジェクトはredis-pyを使ってRedisの対応するリストのBRPOPを呼び出します。また、私のセットアップでは、スタックオブジェクトはRedisの関連リストのキーであるkey属性を持っています。Redisを使用して永続スタック・データ構造を実装する

私は、これまでに約2可能な解決策を考えている:

  1. は完全にRedisのリストを空にしないでください。少なくともリストの1つの要素を維持してください。 Redisリストに1つの要素のみが含まれている場合、クライアントの観点からはスタックは空です。このアプローチはうまくいきますが、プッシュ/ポップされた要素の数を追跡する必要があるため、私は主にそれを好まないのです。

  2. リストが空で、関連するキーが削除されている場合。その後のプッシュでは、Redisで新しいリストを作成するだけです。このアプローチも機能しますが、複雑さが増すということは、スタック・オブジェクトと同じキーを使用して、他の誰かがkを作成したかどうかを確認できないことです。

したがって、私は基本的に、上記の2つのアプローチで必要とされた簿記を含まない空のリストでキーを保持する方法を探しています。ありがとう。

+0

2番目のソリューションが最適です。私はそれに何の問題も見ません。リストを作成する必要はありません。単にLpushを作成するだけです。作成したラッシュが作成されます。同様に、ポップで(nil)を取得した場合、スタックは空であり、アプリケーションロジックで処理されます。私はあなたの鍵の寿命を追跡することによって何を意味するのか分かりません。また、redisは基本的にはSQLデータベースではないので、入れたキーを制御する必要があります。他の誰かがあなたと同じキーを作成しているとは言えません。 –

+0

@KarthikeyanGopall他のリソースをオンラインで見ると、キーの衝突を避けるために、何らかの名前付け規則が必要になるようです。どのキーが入力されるかを制御するには、プロセスの出力(手動または自動)が必要です。レディスはあなたにこの施設を提供しているようではありませんが、レディス外で扱う必要があります。また、私の質問のトラッキングキーのライフビットはあいまいだったので編集しました。 – Waqas

答えて

1

あなたの2番目のソリューションが最適です。

はい、命名規則を維持する必要があります。これは、SQLデータベースまたはキー値ストアがない場合は非常に基本的です。あなたが入れたキーを制御する必要があります。あなたがそのコントロールを持っていない場合、どのキーがどの目的のために使われているか分からないのです。同じことを達成するために、あなたがに入れてすべてのキーにいくつかの意味のある文字列の前に付けることができます。

を例えば、私は、単一のユーザーUSER1の3つのハッシュマップを保存したい場合、私は

このような
hmset ACTIONS_user1 a 10 b 20 ... 
hmset VIEWS_user1 home_page 4 login 10 ... 
hmset ALERTS_user1 daily 5 hourly 12 ... 

を行います上の例では、user1はアプリケーションロジックによって動的に作成され、そのキーに何が含まれているかを表す意味のある文字列が追加されます。

このようにして、あなたはあなたが置くキーを常に制御し、あなたはキーの衝突に直面しません。

これが役に立ちます。

+0

私の主な関心事は、特定のキーに関連付けられたデータのオーバーライド/無効化でした。私はあなたの提案と共に行って、2番目のアプローチを選択しました。衝突を避けるための複雑さは、コードの外部で処理する必要があります。 – Waqas

+0

2つの理論的な点は、あなたの実際的な助言を奪い去ることを意図していませんが、完了のために(キーの制御がないと仮定して)、1)理論的に言えば、異なるアプリケーションが同一のHMSETコマンドを発行する場合があります。ありそうもないが、不可能ではない。 2)2つの異なるキーが同じバケットに入って衝突する可能性がありますが、Redisはこれをユーザーに透過的にします。 – Waqas

関連する問題