『Redis開発と運行維持』---Pipeline(パイプライン、パイプライン)、事務とLua

2949 ワード

Pipeline
  • Redisクライアントは、1回のコマンドを実行し、送信コマンド、コマンドキュー、コマンド実行、結果を返す4つのプロセスを経験する必要があります.4つのプロセスは、1回のRound Trip Time(RRT、往復時間)
  • と総称される.
  • Pipeline(パイプライン)機構は、一組のRedisコマンドを組み立てる、一度のRTTでRedisに転送し、その一連のRedisコマンドの実行結果をクライアント
  • に順次返すことができる.
  • 性能テスト:実行速度は一般的に1つの実行よりも速く、クライアントとサービス側のネットワーク遅延が大きいほど、Pipelineの効果は明らかに
  • である.
  • オリジナルバッチコマンドとPipelineを比較します.原生ロットコマンドは原子で、Pipelineは非原子です.オリジナルバッチコマンドは、複数のキーに対応するコマンドであり、Pipelineは複数のコマンドをサポートします.オリジナルバッチコマンドはRedisサービス側が実装をサポートし、Pipelineはサービス側とクライアントの共同実装を必要とする.
  • ベストプラクティスは、一度にPipelineデータを組み立てる量が大きすぎると、クライアントの待ち時間が増える一方で、一定のネットワークブロックをもたらし、一度に大量のコマンドを含むPipelineを複数回小さいPipelineに分割してPipelineを完成させるには1つのRedisインスタンスしか操作できないが、分散Redisシーンにおいても、一括操作の重要な最適化手段とすることができる.

  • 事務とLua
    取引
    単純なトランザクション機能:multi(トランザクション開始)とexec(トランザクション終了)コマンドの間に、一緒に実行するコマンドのセットを配置し、原子順で実行できます.
    トランザクションを停止するにはexecコマンドの代わりにdiscardを使用します.
    watchコマンドは、トランザクションが実行される前に、トランザクションのkeyが他のクライアントによって変更されていないことを確認し、変更された場合はトランザクションを実行しません.楽観的なロックに似ています.
    Redisのトランザクションは比較的簡単で、トランザクションのロールバックを保証できず、トランザクション内のコマンド間の論理演算を実現できない.
    Lua構文
    Luaチュートリアル:https://www.runoob.com/lua/lua-tutorial.html
    RedisでLuaを使う
  • eval実行luaスクリプトeval key key
  • redis-cli--eval Luaスクリプトが長い場合は、redis-cli--evalを使用してファイルを直接実行することもできます.evalコマンドは–evalパラメータと本質的に同じです.
  • evalsha

  • まず、LuaスクリプトをRedisサービス側にロードし、そのスクリプトのSHA 1チェックサムを取得します.evalshaコマンドは、パラメータとしてSHA 1を使用して、Luaスクリプトを送信するたびにオーバーヘッドを回避するために、対応するLuaスクリプトを直接実行できます.これにより、クライアントはスクリプトの内容を実行するたびにスクリプトを常駐させる必要がなくなり、スクリプト機能が多重化されます.
  • script loadスクリプトのロード:スクリプトの内容をRedisメモリにロードし、SHA 1
  • を得る.
  • evalsha SHA1 key key 実行スクリプト:入力パラメータSHA 1の値を、対応するLuaスクリプト
  • を実行する.
  • Luaは、redis.call関数を使用して、Redisへのアクセス
  • を実現することができる.
    redis-cli -a password script load 'redis.call("set","hello","world") return redis.call("get","hello")'
    #   sha1: "317adb9b83d8b5df45f0bc67609674b0ae930a62"
    
    127.0.0.1> evalsha f25d77be007f76dbce293d457128571799d159b9 0
    

    メリット
  • LuaスクリプトはRedisで原子的に実行され、実行中に他のコマンド
  • は挿入されません.
  • Luaスクリプトは、コマンドをカスタマイズし、これらのコマンドをRedisメモリに常駐させ、多重化の効果を実現します.
  • Luaスクリプトは、複数のコマンドを一度にパッケージ化し、ネットワークのオーバーヘッドを効果的に削減します.

  • Redis管理Luaスクリプト
    script load #  Lua     Redis   
    
    scripts exists sha1 [sha1 …] #   sha1       Redis   
    
    script flush #   Redis         Lua  
    
    script kill #       Lua  。    lua    redis ,              。           ,script kill      ,    shutdown save  redis  。