redis+lua+ロックによるデータ競合の同時処理と分散処理のある程度の解決
2636 ワード
どんなプログラムでも原子性原子性にこだわっています.一般的に言えば、データを処理するときにどの操作にも割り込まれないということです.具体的には、この文章を見てみると、わかりやすいと思います.
主にredisでluaスクリプトをどのように使用するかを理解します(linuxコマンドを使用したくない兄は、redisのeval()関数を使用することができます)
以下は私が最も基本的なクラスを書いたので、まずredis共通クラスをインストールします.
luaのシナリオについては、文法を見ても、最も基礎的なものを手に入れることができます.ここではあまり言いません.https://www.cnblogs.com/yanghuahui/p/3697996.html
コールモード
Redisで分散ロックを優雅に実現するにはどうすればいいですか?https://baijiahao.baidu.com/s?id=1623086259657780069&wfr=spider&for=pc
主にredisでluaスクリプトをどのように使用するかを理解します(linuxコマンドを使用したくない兄は、redisのeval()関数を使用することができます)
# script: lua
# numkeys: key
# key: redis
# arg:
# scriptsha:
# linux
redis-cli --eval script key1 key2 , arg1 arg2
# Redis , , sha
redis-cli script load “$(cat script)”
#
redis-cli --evalsha scriptsha key1 key2 , arg1 arg2
以下は私が最も基本的なクラスを書いたので、まずredis共通クラスをインストールします.
composer require predis/predis
luaのシナリオについては、文法を見ても、最も基礎的なものを手に入れることができます.ここではあまり言いません.https://www.cnblogs.com/yanghuahui/p/3697996.html
_redis = new Client(['host' => $host,'port' => $port]);
}
/**
* @param $key
* @param int $sec
* @param int $val
*/
public function lock($key, $sec = 2, $val = 1)
{
$this->_redis->setex($key, $sec, $val);
}
/**
* @param $key
* @param $value
* @param string $lua | lua ( )
* @param string $scriptsha | sha
* @return bool
*/
public function unlock($key, $val, $lua = '', $scriptsha = '')
{
if(!$lua && !$scriptsha)
return false;
$command = $scriptsha
? 'redis-cli --evalsha '.$scriptsha.' '.$key.' , '.$val
: 'redis-cli --eval '.$lua.' '.$key.' , '.$val;
!$this->_redis->get($key) ? $res = false : exec($command, $res);
return $res;
}
/**
* Redis , , SHA1 ,
* @param $lua | lua ( )
*/
public function load($lua)
{
exec('redis-cli script load "$(cat '.$lua.')"', $res);
return $res;
}
}
コールモード
$redisLock = new xxx\RedisLock();
$redisLock->lock($key);
$redisLock->unlock($key, $value, $lua);
$redisLock->load($lua);