redis+lua+ロックによるデータ競合の同時処理と分散処理のある程度の解決

2636 ワード

どんなプログラムでも原子性原子性にこだわっています.一般的に言えば、データを処理するときにどの操作にも割り込まれないということです.具体的には、この文章を見てみると、わかりやすいと思います.
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);