sql >> データベース >  >> NoSQL >> Redis

redis:毎日カウンターをリセット

    深夜に発生する2つの同時トランザクションについて考えてみます。どちらもget(dt_key)を実行できますが、一方は最初にMULTI/EXECブロックを実行します。カウンターをリセットし、新しい日付を設定し、カウンターをインクリメントします。 2番目のものもMULTI/EXECブロックに入りますが、'dt'の値が変更されたため、実行は失敗し、incr_daily_numberが再度呼び出されます。今回はget(dt_key)が新しい日付を返すため、MULTI / EXECブロックが実行されると、カウンターはリセットされずにインクリメントされます。 2つのトランザクションは、異なるカウンター値で新しい日付を返します。

    したがって、ここには競合状態はなく、(日付、数)のカップルは一意であると思います。

    サーバー側のLuaスクリプト(実行は常にアトミック)を使用してこれを実装することもできます。通常はもっと便利です。

    実際には、Redisロックのようなものはないことに注意してください。 APIで利用可能なロックメカニズムは、RedisサーバーではなくPythonクライアントによって提供されます。その実装を見ると、SETNX + WATCH / MULTI/EXECブロックまたはLuaスクリプトにも基づいていることがわかります。




    1. ScrapyとMongoDBを使用したWebスクレイピングとクロール

    2. sslを使用してDockerredisコンテナを設定する方法

    3. pub-subパターンのzmqとredis

    4. RedisはRDBスナップショットを保存するように構成されていますが、現在ディスクに永続化できません-Ubuntu Server