redis-pyおよびRedisリスト・データ型を使用してスタック・データ構造を実装しています。対応するリストのデータ型が空の場合の処理方法については明確ではありません。既定のRedisの動作は、リストが空になると、関連するキーが削除されるように見えます。例えば、空のリストの場合はRedisでヒットします。これは、Python終了時にスタックデータ構造内のすべての要素をポップまたはクリアするときです。基本的には、自分のコードにRedisリストの操作を呼び出すスタックオブジェクトがあるということです。たとえば、スタックオブジェクトのクライアントがstack.pop()を実行すると、スタックオブジェクトはredis-pyを使ってRedisの対応するリストのBRPOPを呼び出します。また、私のセットアップでは、スタックオブジェクトはRedisの関連リストのキーであるkey属性を持っています。Redisを使用して永続スタック・データ構造を実装する
私は、これまでに約2可能な解決策を考えている:
は完全にRedisのリストを空にしないでください。少なくともリストの1つの要素を維持してください。 Redisリストに1つの要素のみが含まれている場合、クライアントの観点からはスタックは空です。このアプローチはうまくいきますが、プッシュ/ポップされた要素の数を追跡する必要があるため、私は主にそれを好まないのです。
リストが空で、関連するキーが削除されている場合。その後のプッシュでは、Redisで新しいリストを作成するだけです。このアプローチも機能しますが、複雑さが増すということは、スタック・オブジェクトと同じキーを使用して、他の誰かがkを作成したかどうかを確認できないことです。
したがって、私は基本的に、上記の2つのアプローチで必要とされた簿記を含まない空のリストでキーを保持する方法を探しています。ありがとう。
2番目のソリューションが最適です。私はそれに何の問題も見ません。リストを作成する必要はありません。単にLpushを作成するだけです。作成したラッシュが作成されます。同様に、ポップで(nil)を取得した場合、スタックは空であり、アプリケーションロジックで処理されます。私はあなたの鍵の寿命を追跡することによって何を意味するのか分かりません。また、redisは基本的にはSQLデータベースではないので、入れたキーを制御する必要があります。他の誰かがあなたと同じキーを作成しているとは言えません。 –
@KarthikeyanGopall他のリソースをオンラインで見ると、キーの衝突を避けるために、何らかの名前付け規則が必要になるようです。どのキーが入力されるかを制御するには、プロセスの出力(手動または自動)が必要です。レディスはあなたにこの施設を提供しているようではありませんが、レディス外で扱う必要があります。また、私の質問のトラッキングキーのライフビットはあいまいだったので編集しました。 – Waqas