PythonはLUAスクリプト戦闘に流量制限やグラブをRedisの赤い封筒事業

知識ポイント

何1.lua
2.redis、関係LUA、パイソン(Java)の3つの
3.ベアラサービスロジックのlua

なぜLUAスクリプトに参加

  • ネットワークのオーバーヘッドを削減します。複数の要求は、ネットワークの遅延を減らすために、スクリプトの形式で送信することができます
  • アトミック操作。全体として全体のスクリプトが実行するRedisの他のコマンドの途中に挿入されないであろう。そのため、競合状態を気にせずに、スクリプトを書くプロセスでトランザクションを使用せずに、発生します。
  • 多重化。クライアントから送信された足跡は、他のクライアントが同じロジックを実行するスクリプトコードを使用せずに多重化することができるように、Redisの中に恒久的に存在することになります。

LUA環境のインストール

仮想マシンのCentOS-30に機械テストアドレスが
参照搭載Redisのインストール
PS:クラスタモードにインストールガイドを、この単一のインスタンスができRedisのデモ、Rubyスクリプト部分を使用せずに上記の手順を参照。

  • インストールが依存しており、Luaの:
> yum install -y readline
> yum install -y readline-devel
> wget http://www.lua.org/ftp/lua-5.1.1.tar.gz
> tar -zxvf lua-5.1.1.tar.gz -C /usr/local/
> cd /usr/local/lua-5.1.1
> make linux
> make install

  • 検証
> lua
> print("hello world")
> hello world

3つの方法でのRedisのLuaスクリプトの呼び出し*のeval

  • evalsha
  • スクリプトをロードし
    、直接実行するためのevalのluaスクリプト、以下の使用を
EVAL script numkeys key [key ...] arg [arg ...] > eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second 1) "key1" 2) "key2" 3) "first" 4) "second" 

キーに代わって動作させるrediskey
argはカスタムパラメータを渡すことができ
numkeysは、いくつかの重要な識別するために使用される
スクリプトを使用すると、スクリプトLuaの書き込みということです
KEYS内部で使用されるのluaスクリプトを[1]とARGV [1]パス・キーと引数を取得します

LUAは、参照構文LUAチュートリアル

local result=0
    local id= redis.call('get',KEYS[1])
if id then
    result= redis.call('sismember',id,KEYS[2])
end
 
if result==1 then
    redis.call('expire',KEYS[1],ARGV[1])
end
  
return result

モード1

redis-cli  --eval 1.lua 2 user1 user:list 1800

モード2

  redis-cli  eval "$(1.lua)" 2 user1 user:list 1800

モード3

  redis-cli  script load "$(cat 1.lua)"
  redis-cli  evalsha 2cfe726fe60678e8ed4d689a3e98727d1e1e2339 1 test 1
  • デモスクリプトファイル名:redis.lua
redis.call('set','age','18')
local age = redis.call('get','age')
return age;

  • スタートのRedis
> /usr/local/redis-3.2.9/src/redis-server /usr/local/redis-3.2.9/redis.conf 
  • スクリプトの実行
    のconfのでとてもホストすることを下記に指定された-hバインドIP、に配置されました。evalのコマンドを使用して実行
> /usr/local/redis-3.2.9/src/redis-cli -h 192.168.1.30 -p 6379 --eval /usr/local/luadir/redis.lua
>"18"     #set了age,并返回了value = 18

このとき、接続はRedisの-CLIをRedisの場合。キーは、*このキーの年齢を見ることがあります。

パラメータでのRedisのLuaスクリプトの呼び出し

  • 構文:
    / Redisの-CLI -h 192.168.1.30 -p 6379 --eval / .lua KEY1 KEY2 ...、VALUE1 VALUE2 *
  • スクリプトの内容:
--获取key1 的值,并赋值给local age
local age = redis.call('get', KEYS[1]);
if age == 18 then
redis.call('set',KEYS[2],ARGV[1])
end

KEY1 =「年齢」の値が18である場合には、セットキー2 =値「mawenxia」に「名前」

  • スクリプトを実行します。
> /usr/local/redis-3.2.9/src/redis-cli -h 192.168.1.30 -p 6379 --eval /usr/local/luadir/redis-arg.lua age name , mawenxia

  • 私たちは、名前に1つの以上のキーを参照することができ、コンテンツは「mawenxia」であります

    [画像のアップロードが失敗した...(画像-90eef1-1540882227440を)]

Pythonの操作は、LUAスクリプトのRedis

import redis
pool = redis.ConnectionPool(host="localhost", port=6379, db=0) r = redis.Redis(connection_pool=pool) lua_2 = """ local ret = redis.call("get", KEYS[1]) return ret """ script_2 = r.register_script(lua_2) print(script_2(keys=["hugo"])) 

結果:


 
image.png

JAVA動作のRedisのLuaスクリプト

public class TestSingleRedis {

    private static Jedis jedis; //单实例[] private static ShardedJedis shard; //分片[] private static ShardedJedisPool pool; //池化[apache common - pool2] 
  • 注:このキースクリプトが値「myhash」を取るされているので、そうでない場合、値が空に取られ、データのRedisを挿入する必要があります。

Luaのテーブルタイプ

  • アレイと同様のLUAテーブル型。違いは、他の言語と、Luaは下付き文字として任意の型を使用することができることです。
 //定义空表
T1={} 
//赋值 T1["name"] = "mawenxia" T1["age"] = 18 //其他赋值方式 T1.name = "mawenxia" T1.age = 18 //其他赋值方式 T1.person = {name="mawenxia",age=18} 
  • LuaのCjsonツールのインストール
> wget http://www.kyne.com.au/~mark/software/download/lua-cjson-2.1.0.tar.gz
> tar -zvxf lua-cjson-2.1.0.tar.gz -C /usr/local/
> cd /usr/local/lua-cjson-2.1.0/
> vim Makefile
> 修改PREFIX 变量为/usr/local  保存
> make install
> cp cjson.so /usr/local/lib/lua/5.1/

  • LuaのテーブルタイプとCjsonを結合。ハッシュ操作は、都合のデータのRedisのタイプのものであってもよいです

RedisのLuaのスクリプトがグラブに赤い封筒シーンを達成するために組み合わせます

  • 主に、原子Redisの+のLUAスクリプトを使用します。ユーザーをつかむために二度同じような状況を避けるために。
  • 前提:ユーザーが良好な分布量の数ではなく、ラッシュ時に再配分によると、赤い封筒を開始します。Redisのリストに割り当てた後。
  • 基本的な考え方:2のList1(割り当てられていない赤)、リスト2(調剤後赤)とセット。キーで使用するセットは、ユーザが奪われているかどうかを判断するために繰り返すことはできません。
  • 原子性を確保するために3つのLuaスクリプトの動作を実現します。1:LIST1から除去赤をポップ:セットから取られたユーザIDが、グラブは、IDが存在しない場合、ステップ2.2に進むか否かを判断します。3:赤とLIST2グラブユーザIDにプッシュします。
  • 最後に、情報LIST2ビジネスシステムは、割り当て後に読むことができます

参考:
http://xiaorui.cc/2016/03/27/%E8%AF%A6%E8%A7%A3python%E8%B0%83%E7%94%A8redis-lua%E5%86%85%E5 %B5%8C%E8 84% %9A%E6%9C%AC%E7%9A%84%E9%ABの%98%E7%以下のBA%A7%E7%94%A8%E6%B3%95 /

https://www.jianshu.com/p/bec0d7cf0b43

https://www.jianshu.com/p/d88e7359b025

 
 
0人が親指アップ
 
 


著者:hugoren
リンクします。https://www.jianshu.com/p/e7a3243b61e6
出典:ジェーンの本は
、著者が著作権を保有しています。著者は認可商業転載してください接触、非商用の転載は、ソースを明記してください。

おすすめ

転載: www.cnblogs.com/ExMan/p/12622626.html