2012-02-09 3 views
3

HandlerSocket取引のRedisで

redis.watch('powerlevel') 
current = redis.get('powerlevel') 
redis.multi() 
redis.set('powerlevel', current + 1) 
redis.exec() 
  1. それはHandlerSocketを使用してこの操作を実行することは可能ですか?
  2. トランザクションを扱うための一般的な機能は、handlersotsketを提供していますか?
+0

Redis取引の詳細[こちら](https://github.com/kondratovich/the-little-redis-book/blob/master/en/redis.md)、取引の章を参照 – komelgman

答えて

3

Redisの「トランザクション」と汎用トランザクションエンジンの比較は、常に誤解を招くことがあります。 RedisのWATCH/MULTI/EXECブロックは次のとおりです。

  • 一貫
  • (エラーの場合はなしロールバック)アトミックではありません(Redisのと、とにかく多くの整合性ルールが存在しない)
  • 完全に分離された(すべてがシリアル化されます)AOF + FSYNC戦略は

だから一般トランザクションを定義するために使用され、完全なACID特性が完全にRedisのによって提供されていないを選択された場合

  • おそらく耐久。ほとんどのトランザクションエンジンとは異なり、Redisは非常に強力な分離を提供し、ロールバック機能を提供しようとはしません。

    同じ動作だけで使用することにより簡単な方法で達成することができるので、疑問に提供された例は、IMO本当に代表ではありません。

    redis.incr(「電力レベル」)

    Redisのため単一の操作は常にアトミックで分離されています。

    WATCH/MULTI/EXECブロックは、通常、さまざまなキー間の一貫性を強制する必要がある場合や、楽観的なロックパターンを実装する場合に使用されます。つまり、隔離されたカウンタを増分するだけの目的であれば、WATCH/MULTI/EXECブロックを使用する必要はありません。

    HandlerSocketは完全に異なる獣です。これはMySQLのジェネリックハンドラの上に構築され、基盤となるストレージエンジンによってはトランザクションの動作が異なります。たとえば、MyISAMと一緒に使用される場合、ACIDトランザクションは使用されませんが、テーブルレベルのR/Wロックによって一貫性が保証されます。 InnoDBでは、ACIDトランザクションはデフォルトの分離レベル(InnoDB設定AFAIKで設定可能)で使用されます。 InnoDBはMVCC(マルチバージョニング同時実行制御)を実装しているので、ロックはMyISAMよりもはるかに複雑です。

    HandlerSocketはワーカースレッドの2つのプールで動作します(読み取り専用接続用、書き込み専用接続用)。人々は複数の読み取りワーカースレッドを使用することになっていますが、書き込みスレッドは1つだけです(おそらくロックの競合を減らすため)。したがって、基本構成では、書き込み操作はシリアル化されますが、読み取り操作は行われません。 AFAIKは、Redisと同じ分離セマンティックを持つ唯一の可能性は、書き込みと書き込みの両方の操作を実行する書き込み専用ソケットを使用し、書き込みスレッドを1つだけ保持することです(すべての操作の完全な直列化)。それはスケーラビリティにも影響を与えます。

    HandlerSocketプロトコルから、トランザクション機能へのアクセスはありません。各イベントループの繰り返しでは、すべての操作(すべてのソケットから取得)を収集し、これらの操作すべてに対して一意のトランザクション(InnoDBにのみ関連する)を実行します。 AFAIKでは、ユーザーはこのトランザクションの範囲を変更する方法がありません。

    結論として、Redis WATCH/MULTI/EXECブロックの動作をHandlerSocketでエミュレートすることは一般的に不可能です。

    この例に戻って、一貫した方法でカウンタをインクリメントするだけの目的なら、これは完全にthe HandlerSocket protocolでサポートされています。例えば、+/-(インクリメント/デクリメント)演算が利用可能であり、操作(Redis GETSETコマンドと同様)または+?/ - ? (増分/減分、前の値を戻す)。

  • +0

    ありがとう、私は持っていますUの使用に関して同じ結論になるか? +?、 - ?オペレーション。 – komelgman

    関連する問題