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

CAS(チェックアンドセット)を実装するRedis Luaスクリプト?

    Redisのドキュメントによると、アトミック性に関しては問題ありません:

    Redisは、同じLuaインタープリターを使用してすべてのコマンドを実行します。また、Redisは、スクリプトがアトミックな方法で実行されることを保証します。スクリプトの実行中は、他のスクリプトやRedisコマンドは実行されません。このセマンティクスは、MULTI/EXECのセマンティクスに似ています。他のすべてのクライアントの観点からは、スクリプトの効果はまだ表示されていないか、すでに完了しています。

    ただし、スクリプトが遅すぎると問題が発生します。したがって、スクリプトは、ある程度のロジックとアトミック性を必要とする軽い操作に最適です。

    陥る可能性のあるもう1つの抜け穴は、スクリプトが途中で失敗した場合、スクリプトはエラーを返しますが、行った呼び出しをロールバックできなかったことです。

    例:次のようなスクリプトがあります:

    redis.call('set', 'foo', 1)
    redis.call('rpush', 'foo', 2)
    

    スクリプトの実行はエラーを返しますが、foo すでに1としてredisに設定されています 。

    あなたの質問とは関係のない何か:あなたが使用していることに気づきました

    eval "your_raw_code" key_count keys argv
    

    実際には、ターミナルにいるときにevalでluaスクリプトファイルを呼び出すことができます:

    > redis-cli eval "$(cat path/to/script/script_name.lua)" key_count keys argv
    



    1. MongoDBでデータベースとコレクションを管理する方法

    2. ネストされたフィールドのMongoDB更新データ

    3. タスク名でCeleryタスクを検査およびキャンセルする方法

    4. HadoopのMapReduceキー値ペアとは何ですか?