redis luaスクリプトによる原子間操作のケース


リファレンスリンク


Redis luaスクリプトの使用

サンプルコード

if redis.call('EXISTS', KEYS[1]) == 1 then
    redis.call('INCR', KEYS[1])
else
    redis.call('SET', KEYS[1], 1)
    redis.call('EXPIRE', KEYS[1], ARGV[1])
end

return redis.call('GET', KEYS[1])


luaスクリプトでredisコマンドを呼び出すにはredis.call('INCR', KEYS[1])を使用します.最初のパラメータはredisのコマンドで、後ろのパラメータはコマンドの後ろのパラメータ値です.


redisの命令はこうです
127.0.0.1:6379[11]> set age 12
OK
127.0.0.1:6379[11]>

ではluaスクリプトにはこのように書かれており、後の0は操作するKEYの個数を示しており、redisがluaスクリプトを使用してパラメータをどのように伝達するかについては、上の接続を見ることができます.
127.0.0.1:6379[11]> EVAL "return redis.call('SET', 'age',18)" 0
OK
127.0.0.1:6379[11]> get age
"18"

自分で書いた例はコマンドラインで実行します

127.0.0.1:6379[11]>  EVAL "if redis.call('EXISTS',KEYS[1]) == 1 then redis.call('INCR',KEYS[1]) else redis.call('TTL',KEYS[1],ARGV[1]) end return redis.call('GET',KEYS[1])" 1 name 2500
"103"
127.0.0.1:6379[11]> ttl name
     1  KEYS   ,     1,  name  KEYS    ,   2500  ARGV    ,redis lua                          KEYS ARGV。

redis luaスクリプトコマンドフォーマット:

EVAL script numkeys key [key ...] arg [arg ...]

説明:
  • scriptは、luaスクリプトという最初のパラメータです.
  • の2番目のパラメータnumkeysは、後続のパラメータにいくつかのkeyがあることを指定します.
  • key[key...]は、操作するキーであり、複数指定可能であり、luaスクリプトにおいてKEYS[1]、KEYS[2]により
  • を取得する
  • arg[arg...]、パラメータは、luaスクリプトでARGV[1]、ARGV[2]で取得されます.

  • コマンドラインでluaスクリプトを実行する

    127.0.0.1:6379> eval "redis.call('SET', KEYS[1], ARGV[1]);redis.call('EXPIRE', KEYS[1], ARGV[2]); return 1;" 1 test 10 60
    (integer) 1
    

    redis-cliコマンドを使用してスクリプトを実行する


    書式設定
    redis-cli --eval lua_file key1 key2 , arg1 arg2 arg3
    

    注意事項
  • evalの後のパラメータはluaスクリプトファイル.lua接尾辞
  • です.
  • numkeysと書くのではなく、,で区切られています.前後にスペースが必要です.

  • 2つのスクリプトを実行する方法は少し異なり、他は同じです.redis-cliを使用する場合は、スクリプト内でredisのライブラリを選択する必要があります.コマンドラインでライブラリを選択することができます(redis.call('select',11)など)、コマンドを実行するには、一般的にパッケージされたredisクライアントを使用して、redisのライブラリを直接選択します.
    luaの基本的な文法は菜鳥チュートリアルを見ることができます.