Redis學習筆記(三)使用Lua指令碼實現分散式鎖

Tinywan發表於2018-09-13

 Redis在2.6推出了指令碼功能,允許開發者使用Lua語言編寫指令碼傳到Redis中執行。

使用Lua指令碼的好處如下:

  • 1.減少網路開銷:本來5次網路請求的操作,可以用一個請求完成,原先5次請求的邏輯放在redis伺服器上完成。使用指令碼,減少了網路往返時延。
  • 2.原子操作:Redis會將整個指令碼作為一個整體執行,中間不會被其他命令插入。
  • 3.複用:客戶端傳送的指令碼會永久儲存在Redis中,意味著其他客戶端可以複用這一指令碼而不需要使用程式碼完成同樣的邏輯。

1、Redis命令列執行Lua指令碼

01 、EVAL語法

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

(1)script:需要執行的lua指令碼  

(2)numkeys:  key的個數,指定了鍵名引數的數量

(3)key:redis中各種資料結構的替代符號

(4)script:自定義引數

說明:EVAL 和 EVALSHA 命令是從 Redis 2.6.0 版本開始的,使用內建的 Lua 直譯器,可以對 Lua 指令碼進行求值。

EVAL的第一個引數是一段 Lua 5.1 指令碼程式。 這段Lua指令碼不需要(也不應該)定義函式。它執行在 Redis 伺服器中。

EVAL的第二個引數是引數的個數,後面的引數(從第三個引數),表示在指令碼中所用到的那些 Redis 鍵(key),這些鍵名引數可以在 Lua 中通過全域性變數 KEYS 陣列,用 1 為基址的形式訪問( KEYS[1] , KEYS[2] ,以此類推)。

在命令的最後,那些不是鍵名引數的附加引數 arg [arg …] ,可以在 Lua 中通過全域性變數 ARGV 陣列訪問,訪問的形式和 KEYS 變數類似( ARGV[1] 、 ARGV[2] ,諸如此類)。

02 、上面這幾段長長的說明可以用一個簡單的例子來概括

127.0.0.1:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 name age Tinywan 24
1) "name"
2) "age"
3) "Tinywan"
4) "24"

說明:第一個引數的字串就是script,也就是lua指令碼。2表示keys的個數,KEYS[1] 就是 name 的佔位符,KEYS[2] 就是 age 的佔位符,ARGV[1] 就是 Tinywan 的佔位符,ARGV[2] 就是 24 的佔位符,以此類推。所以最後的結果應該就是:{ return name age Tinywan 24}

03 、redis.call() 和 redis.pcall() 兩個函式的引數可以是任意的 Redis 命令

127.0.0.1:6379> EVAL "return redis.call(`SET`,`Name`,`Tinywan`)" 0
OK
127.0.0.1:6379> get Name
"Tinywan"

說明:可以看到上面傳遞的key的個數是為0

03、使用KEYS和ARGV

127.0.0.1:6379> EVAL "return redis.call(`SET`,KEYS[2],ARGV[3])" 3 name01 name02 name03 Tinywan01 Tinywan02 Tinywan03
OK
127.0.0.1:6379> keys *
1) "name02"
127.0.0.1:6379> get name02
"Tinywan03"

說明:返回結果是Redis multi bulk replies的Lua陣列,這是一個Redis的返回型別,您的客戶端庫可能會將他們轉換成陣列型別。

03 、redis.call() 和 redis.pcall() 的區別

redis.call() 執行一個不存在的Redis命令: SETNGX

127.0.0.1:6379> EVAL "redis.call(`SETNGX`,KEYS[1],ARGV[1]);redis.call(`SET`,KEYS[3],ARGV[1])" 3 name01 name02 name03 Tinywan01 Tinywan02 Tinywan03

(error) ERR Error running script (call to f_0adfcdb3f740b2aabfe19f0e80de7cda7ce6262f): @user_script:1: @user_script: 1: Unknown Redis command called from Lua script
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379>

說明:當 redis.call() 在執行命令的過程中發生錯誤時,指令碼會停止執行,並返回一個指令碼錯誤,錯誤的輸出資訊會說明錯誤造成的原因。由於第一個執行錯誤,導致後面的也沒有執行,設定不成功。

redis.pcall() 執行一個不存在的Redis命令: SETNGX

127.0.0.1:6379> EVAL "redis.pcall(`SETNGX`,KEYS[1],ARGV[1]);redis.call(`SET`,KEYS[3],ARGV[1])" 3 name01 name02 name03 Tinywan01 Tinywan02 Tinywan03
(nil)
127.0.0.1:6379> keys *
1) "name03"
127.0.0.1:6379> get name03
"Tinywan01"
127.0.0.1:6379>  

 說明: redis.pcall() 出錯時並不引發(raise)錯誤,而是返回一個 nil,後面的命令任然可以執行成功。  

redis.call() 與 redis.pcall()很類似, 他們唯一的區別是當redis命令執行結果返回錯誤時, redis.call()將返回給呼叫者一個錯誤,而redis.pcall()會將捕獲的錯誤以Lua表的形式返回。

redis.call() 和 redis.pcall() 兩個函式的引數可以是任意的 Redis 命令

2、Redis中Lua指令碼命令介紹

01、SCRIPT  命令

命令用於將指令碼 script 新增到指令碼快取中,但並不立即執行這個指令碼。

127.0.0.1:6379> SCRIPT LOAD "return redis.call(`set`,KEYS[1],ARGV[1])"
"c686f316aaf1eb01d5a4de1b0b63cd233010e63d"

02、EVALSHA 命令 

根據給定的 SHA1 校驗碼(也就是 SCRIPT LOAD 執行指令碼生成的雜湊值),對快取在伺服器中的指令碼進行求值。 將指令碼快取到伺服器的操作可以通過 SCRIPT LOAD 命令進行。

127.0.0.1:6379> EVALSHA c686f316aaf1eb01d5a4de1b0b63cd233010e63d 2 Github Blog github.tinywan blog.tinywan
OK
127.0.0.1:6379> keys *
1) "Github"
2) "name03"
127.0.0.1:6379> get Github
"github.tinywan"

03、SCRIPT FLUSH 命令  

清空Lua指令碼快取 Flush the Lua scripts cache.

127.0.0.1:6379> SCRIPT FLUSH
OK
127.0.0.1:6379> EVALSHA c686f316aaf1eb01d5a4de1b0b63cd233010e63d 2 Github Blog github.tinywan blog.tinywan
(error) NOSCRIPT No matching script. Please use EVAL.
127.0.0.1:6379> SCRIPT LOAD "return redis.call(`set`,KEYS[1],ARGV[1])"
"c686f316aaf1eb01d5a4de1b0b63cd233010e63d"
127.0.0.1:6379> EVALSHA c686f316aaf1eb01d5a4de1b0b63cd233010e63d 2 Github Blog github.tinywan blog.tinywan
OK
127.0.0.1:6379>

04、SCRIPT EXISTS

 命令用於校驗指定的指令碼是否已經被儲存在快取當中

127.0.0.1:6379> SCRIPT EXISTS c686f316aaf1eb01d5a4de1b0b63cd233010e63d
1) (integer) 1
127.0.0.1:6379> SCRIPT FLUSH
OK
127.0.0.1:6379> SCRIPT EXISTS c686f316aaf1eb01d5a4de1b0b63cd233010e63d
1) (integer) 0
127.0.0.1:6379>

05、SCRIPT KILL

殺死當前正在執行的 Lua 指令碼

3、除錯

script.lua指令碼

local foo = redis.call("ping")
return foo

執行指令碼

$ redis-cli --eval script.lua 
PONG

loop.lua指令碼

local i = 0
while true do
    i = i + 1
    redis.debug(i)
end
return "OK"

進入除錯模式

$ redis-cli --ldb --eval loop.lua set set , wet set
Lua debugging session started, please use:
quit    -- End the session.
restart -- Restart the script in debug mode again.
help    -- Show Lua script debugging commands.

* Stopped at 1, stop reason = step over
-> 1   local i = 0
^C

開啟另外一個shell視窗

www@iZ2zec3dge6rwz2uw4tveuZ:~$ redis-cli 
127.0.0.1:6379> keys *
(error) BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE.
127.0.0.1:6379> keys *
(error) BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE.
127.0.0.1:6379> keys *
(error) BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE.
127.0.0.1:6379> SCRIPT KILL
OK
127.0.0.1:6379> keys *
  1) "REDIS_CACHE:RESTY_VOD_DETAIL:55"

 4、案例介紹

1、獲取指定的key的List中的所有資料

list.lua指令碼

local key = KEYS[1]
-- 返回列表 key 中指所有的元素
local list = redis.call("lrange", key, 0, -1)
return list

向佇列中插入測試資料

127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> LPUSH book Linux Java C Golang PHP Python
(integer) 6
127.0.0.1:6379> keys *
1) "book"
127.0.0.1:6379> LRANGE book 0 -1
1) "Python"
2) "PHP"
3) "Golang"
4) "C"
5) "Java"
6) "Linux"
127.0.0.1:6379>

執行Lua指令碼,獲取列表資料

λ  redis-cli.exe --eval .list.lua book
1) "Python"
2) "PHP"
3) "Golang"
4) "C"
5) "Java"
6) "Linux"

2、集合去重

member.lua指令碼

-- 接受key
local key = KEYS[1]
-- 接受所有引數
local args = ARGV

local i = 0
-- 初始化表 result
local result = {}

for m, n in ipairs(args) do
    local is_repeat = redis.call("sismember", key, n)
    if tonumber(is_repeat) == 1 then
        table.insert(result, 1, n)
    end
end
return result

向集合中插入測試資料

127.0.0.1:6379> SADD Book HTML CSS SQL JAVA
(integer) 4
127.0.0.1:6379> SMEMBERS Book
1) "SQL"
2) "JAVA"
3) "CSS"
4) "HTML"

注意:Windows 環境的Redis是不支援接受多個引數的(Lua指令碼中的ARGV接受的引數是一個nil),所以以下除錯在Linux環境有效

開始除錯指令碼(阻塞方式)

HTML 是集合中的元素

$ redis-cli --ldb-sync-mode --eval member.lua Book , HTML
Lua debugging session started, please use:
quit    -- End the session.
restart -- Restart the script in debug mode again.
help    -- Show Lua script debugging commands.

* Stopped at 2, stop reason = step over
-> 2   local key = KEYS[1]
lua debugger> s
* Stopped at 4, stop reason = step over
-> 4   local args = ARGV
lua debugger> s
* Stopped at 6, stop reason = step over
-> 6   local i = 0
lua debugger> s
* Stopped at 8, stop reason = step over
-> 8   local result = {}
lua debugger> s
* Stopped at 10, stop reason = step over
-> 10  for m, n in ipairs(args) do
lua debugger> s
* Stopped at 11, stop reason = step over
-> 11      local is_repeat = redis.call("sismember", key, n)
lua debugger> s
<redis> sismember Book HTML
<reply> 1
* Stopped at 12, stop reason = step over
-> 12      if tonumber(is_repeat) == 1 then
lua debugger> s
* Stopped at 13, stop reason = step over
-> 13          table.insert(result, 1, n)
lua debugger> s
* Stopped at 10, stop reason = step over
-> 10  for m, n in ipairs(args) do
lua debugger> s
* Stopped at 16, stop reason = step over
-> 16  return result
lua debugger> s

1) "HTML"

(Lua debugging session ended)

127.0.0.1:6379>   

說明:最後返回元素為:HTML 

Tinywan 不是集合中的元素

$ redis-cli --ldb-sync-mode --eval member.lua Book , Tinywan
Lua debugging session started, please use:
quit    -- End the session.
restart -- Restart the script in debug mode again.
help    -- Show Lua script debugging commands.

* Stopped at 2, stop reason = step over
-> 2   local key = KEYS[1]
lua debugger> s
* Stopped at 4, stop reason = step over
-> 4   local args = ARGV
lua debugger> s
* Stopped at 6, stop reason = step over
-> 6   local i = 0
lua debugger> s
* Stopped at 8, stop reason = step over
-> 8   local result = {}
lua debugger> s
* Stopped at 10, stop reason = step over
-> 10  for m, n in ipairs(args) do
lua debugger> s
* Stopped at 11, stop reason = step over
-> 11      local is_repeat = redis.call("sismember", key, n)
lua debugger> s
<redis> sismember Book Tinywan
<reply> 0
* Stopped at 12, stop reason = step over
-> 12      if tonumber(is_repeat) == 1 then
lua debugger> s
* Stopped at 10, stop reason = step over
-> 10  for m, n in ipairs(args) do
lua debugger> s
* Stopped at 16, stop reason = step over
-> 16  return result
lua debugger> s

(empty list or set)

(Lua debugging session ended)

127.0.0.1:6379> 

說明:最後返回元素為:empty

注意: KEYS和ARGV中間的 `,` 兩邊的空格,不能省略。

非除錯模式

www@iZ2zec3dge6rwz2uw4tveuZ:~/lua$ redis-cli --eval member.lua Book , Tinywan
(empty list or set)
www@iZ2zec3dge6rwz2uw4tveuZ:~/lua$ redis-cli --eval member.lua Book , JAVA
1) "JAVA"
www@iZ2zec3dge6rwz2uw4tveuZ:~/lua$ redis-cli --eval member.lua Book , HTML
1) "HTML"
www@iZ2zec3dge6rwz2uw4tveuZ:~/lua$ redis-cli --eval member.lua Book , HTML5
(empty list or set)

4、訪問頻率控制

實現一個訪問頻率控制,某個ip在短時間內頻繁訪問頁面,需要記錄並檢測出來,就可以通過Lua指令碼高效的實現

limit.lua指令碼

local times = redis.call("incr", KEYS[1])

if times == 1 then
    redis.call("expire", KEYS[1], ARGV[1])
end

if times > tonumber(ARGV[2]) then
    return 0
end
return 1

5、實現分散式鎖

<?php
/**.-------------------------------------------------------------------------------------------------------------------
 * |  Github: https://github.com/Tinywan
 * |  Blog: http://www.cnblogs.com/Tinywan
 * |--------------------------------------------------------------------------------------------------------------------
 * |  Author: Tinywan(ShaoBo Wan)
 * |  DateTime: 2018/9/13 22:28
 * |  Mail: 756684177@qq.com
 * |  Desc: 使用Redis實現分散式鎖
 * `------------------------------------------------------------------------------------------------------------------*/

class RedisLock
{
    /**
     * 獲取鎖
     * @param string $lock_name 鎖名
     * @param int $acquire_time 重複請求次數
     * @param int $lock_timeout 請求超時時間
     * @return bool|string
     */
    public static function acquireLock($lock_name, $acquire_time = 3, $lock_timeout = 120)
    {
        $identifier = md5($_SERVER[`REQUEST_TIME`] . mt_rand(1, 10000000));
        $lock_name = `LOCK:` . $lock_name;
        $lock_timeout = intval(ceil($lock_timeout));
        $end_time = time() + $acquire_time;
        while (time() < $end_time) {
            $script = <<<luascript
                 local result = redis.call(`setnx`,KEYS[1],ARGV[1]);
                    if result == 1 then
                        redis.call(`expire`,KEYS[1],ARGV[2])
                        return 1
                    elseif redis.call(`ttl`,KEYS[1]) == -1 then
                       redis.call(`expire`,KEYS[1],ARGV[2])
                       return 0
                    end
                    return 0
luascript;
            $result = location_redis()->evaluate($script, array($lock_name, $identifier, $lock_timeout), 1);
            if ($result == `1`) {
                return $identifier;
            }
            usleep(100000); //  函式延遲程式碼執行若干微秒
        }
        return false;
    }

    /**
     * 釋放鎖
     * @param string $lock_name 鎖名
     * @param string $identifier 獲取鎖返回的標識
     * @return bool
     */
    public static function releaseLock($lock_name, $identifier)
    {
        $lock_name = `LOCK:` . $lock_name;
        while (true) {
            $script = <<<luascript
                local result = redis.call(`get`,KEYS[1]);
                if result == ARGV[1] then
                    if redis.call(`del`,KEYS[1]) == 1 then
                        return 1;
                    end
                end
                return 0
luascript;
            $result = location_redis()->evaluate($script, array($lock_name, $identifier), 1);
            if ($result == 1) {
                return true;
            }
            break;
        }
        //程式已經失去了鎖
        return false;
    }
}

測試指令碼

private function redisLua1()
{
    for ($i = 0; $i < 100000; $i++) {
        $order = rand(1, 3);
        $order_no = `order_` . $order;
        Log::debug(`[非同步指令碼] 開始...` . $order_no);
        $orderLock = RedisLock::acquireLock($order_no);
        if (!$orderLock) {
            Log::debug(`[非同步指令碼] 獲取鎖失敗 ` . $order_no);
            continue;
        } else {
            Log::debug(`[非同步指令碼] 獲取鎖成功 ` . $order_no);
        }
        // 處理業務邏輯
        Log::debug(`[非同步指令碼] 處理業務 ` . $order_no);
        sleep(2);
        // 釋放鎖
        $orderUnLock = RedisLock::releaseLock($order_no, $orderLock); // 7f62708bb826c034850783efdba127b3
        if (!$orderUnLock) {
            Log::debug(`[非同步指令碼] 釋放鎖失敗 ` . $order_no);
        } else {
            Log::debug(`[非同步指令碼] 釋放鎖成功 ` . $order_no . PHP_EOL);
        }
    }
}

private function redisLua2()
{
    for ($i = 0; $i < 100000; $i++) {
        $order = rand(1, 3);
        $order_no = `order_` . $order;
        Log::debug(`[命令列] 開始...` . $order_no);
        $orderLock = RedisLock::acquireLock($order_no);
        if (!$orderLock) {
            Log::debug(`[命令列] 獲取鎖失敗 ` . $order_no);
            continue;
        } else {
            Log::debug(`[命令列] 獲取鎖成功 ` . $order_no);
        }
        // 處理業務邏輯
        Log::debug(`[命令列] 處理業務 ` . $order_no);
        sleep(2);
        // 釋放鎖
        $orderUnLock = RedisLock::releaseLock($order_no, $orderLock);
        if (!$orderUnLock) {
            Log::debug(`[命令列] 釋放鎖失敗 ` . $order_no);
        } else {
            Log::debug(`[命令列] 釋放鎖成功 ` . $order_no . PHP_EOL);
        }
    }
}

 開啟連個任務跑

模擬非同步通知

php think crontab redisLua1

 模擬主動查詢

php think crontab redisLua2

 測試結果

[ 2018-09-15T12:11:29+08:00 ][ debug ] [命令列] 開始...order_1
[ 2018-09-15T12:11:29+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_1
[ 2018-09-15T12:11:29+08:00 ][ debug ] [非同步指令碼] 處理業務 order_1
[ 2018-09-15T12:11:31+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_1

[ 2018-09-15T12:11:31+08:00 ][ debug ] [非同步指令碼] 開始...order_1
[ 2018-09-15T12:11:31+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_1
[ 2018-09-15T12:11:31+08:00 ][ debug ] [非同步指令碼] 處理業務 order_1
[ 2018-09-15T12:11:32+08:00 ][ debug ] [命令列] 獲取鎖失敗 order_1
[ 2018-09-15T12:11:32+08:00 ][ debug ] [命令列] 開始...order_3
[ 2018-09-15T12:11:32+08:00 ][ debug ] [命令列] 獲取鎖成功 order_3
[ 2018-09-15T12:11:32+08:00 ][ debug ] [命令列] 處理業務 order_3
[ 2018-09-15T12:11:33+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_1

[ 2018-09-15T12:11:33+08:00 ][ debug ] [非同步指令碼] 開始...order_2
[ 2018-09-15T12:11:33+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_2
[ 2018-09-15T12:11:33+08:00 ][ debug ] [非同步指令碼] 處理業務 order_2
[ 2018-09-15T12:11:34+08:00 ][ debug ] [命令列] 釋放鎖成功 order_3

[ 2018-09-15T12:11:34+08:00 ][ debug ] [命令列] 開始...order_2
[ 2018-09-15T12:11:35+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_2

[ 2018-09-15T12:11:35+08:00 ][ debug ] [非同步指令碼] 開始...order_1
[ 2018-09-15T12:11:35+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_1
[ 2018-09-15T12:11:35+08:00 ][ debug ] [非同步指令碼] 處理業務 order_1
[ 2018-09-15T12:11:36+08:00 ][ debug ] [命令列] 獲取鎖成功 order_2
[ 2018-09-15T12:11:36+08:00 ][ debug ] [命令列] 處理業務 order_2
[ 2018-09-15T12:11:37+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_1
[ 2018-09-15T12:12:06+08:00 ][ debug ] [命令列] 開始...order_3
[ 2018-09-15T12:12:06+08:00 ][ debug ] [非同步指令碼] 開始...order_3
[ 2018-09-15T12:12:06+08:00 ][ debug ] [命令列] 獲取鎖成功 order_3
[ 2018-09-15T12:12:06+08:00 ][ debug ] [命令列] 處理業務 order_3
[ 2018-09-15T12:12:08+08:00 ][ debug ] [命令列] 釋放鎖成功 order_3

[ 2018-09-15T12:12:08+08:00 ][ debug ] [命令列] 開始...order_3
[ 2018-09-15T12:12:09+08:00 ][ debug ] [命令列] 獲取鎖成功 order_3
[ 2018-09-15T12:12:09+08:00 ][ debug ] [命令列] 處理業務 order_3
[ 2018-09-15T12:12:09+08:00 ][ debug ] [非同步指令碼] 獲取鎖失敗 order_3
[ 2018-09-15T12:12:09+08:00 ][ debug ] [非同步指令碼] 開始...order_2
[ 2018-09-15T12:12:09+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_2
[ 2018-09-15T12:12:09+08:00 ][ debug ] [非同步指令碼] 處理業務 order_2
[ 2018-09-15T12:12:11+08:00 ][ debug ] [命令列] 釋放鎖成功 order_3

[ 2018-09-15T12:12:11+08:00 ][ debug ] [命令列] 開始...order_3
[ 2018-09-15T12:12:11+08:00 ][ debug ] [命令列] 獲取鎖成功 order_3
[ 2018-09-15T12:12:11+08:00 ][ debug ] [命令列] 處理業務 order_3
[ 2018-09-15T12:12:11+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_2

[ 2018-09-15T12:12:11+08:00 ][ debug ] [非同步指令碼] 開始...order_2
[ 2018-09-15T12:12:11+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_2
[ 2018-09-15T12:12:11+08:00 ][ debug ] [非同步指令碼] 處理業務 order_2
[ 2018-09-15T12:12:13+08:00 ][ debug ] [命令列] 釋放鎖成功 order_3

[ 2018-09-15T12:12:13+08:00 ][ debug ] [命令列] 開始...order_1
[ 2018-09-15T12:12:13+08:00 ][ debug ] [命令列] 獲取鎖成功 order_1
[ 2018-09-15T12:12:13+08:00 ][ debug ] [命令列] 處理業務 order_1
[ 2018-09-15T12:12:13+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_2

[ 2018-09-15T12:12:13+08:00 ][ debug ] [非同步指令碼] 開始...order_2
[ 2018-09-15T12:12:13+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_2
[ 2018-09-15T12:12:13+08:00 ][ debug ] [非同步指令碼] 處理業務 order_2
[ 2018-09-15T12:12:15+08:00 ][ debug ] [命令列] 釋放鎖成功 order_1

[ 2018-09-15T12:12:15+08:00 ][ debug ] [命令列] 開始...order_2
[ 2018-09-15T12:12:15+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_2

[ 2018-09-15T12:12:15+08:00 ][ debug ] [非同步指令碼] 開始...order_3
[ 2018-09-15T12:12:15+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_3
[ 2018-09-15T12:12:15+08:00 ][ debug ] [非同步指令碼] 處理業務 order_3
[ 2018-09-15T12:12:15+08:00 ][ debug ] [命令列] 獲取鎖成功 order_2
[ 2018-09-15T12:12:15+08:00 ][ debug ] [命令列] 處理業務 order_2
[ 2018-09-15T12:12:17+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_3

[ 2018-09-15T12:12:17+08:00 ][ debug ] [非同步指令碼] 開始...order_1
[ 2018-09-15T12:12:17+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_1
[ 2018-09-15T12:12:17+08:00 ][ debug ] [命令列] 釋放鎖成功 order_2

[ 2018-09-15T12:12:17+08:00 ][ debug ] [非同步指令碼] 處理業務 order_1
[ 2018-09-15T12:12:17+08:00 ][ debug ] [命令列] 獲取鎖成功 order_3
[ 2018-09-15T12:12:17+08:00 ][ debug ] [命令列] 處理業務 order_3
[ 2018-09-15T12:12:19+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_1

[ 2018-09-15T12:12:19+08:00 ][ debug ] [非同步指令碼] 開始...order_3
[ 2018-09-15T12:12:19+08:00 ][ debug ] [命令列] 釋放鎖成功 order_3

[ 2018-09-15T12:12:19+08:00 ][ debug ] [命令列] 開始...order_2
[ 2018-09-15T12:12:19+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_3
[ 2018-09-15T12:12:19+08:00 ][ debug ] [非同步指令碼] 處理業務 order_3
[ 2018-09-15T12:12:19+08:00 ][ debug ] [命令列] 獲取鎖成功 order_2
[ 2018-09-15T12:12:19+08:00 ][ debug ] [命令列] 處理業務 order_2
[ 2018-09-15T12:12:21+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_3

[ 2018-09-15T12:12:21+08:00 ][ debug ] [非同步指令碼] 開始...order_1
[ 2018-09-15T12:12:21+08:00 ][ debug ] [命令列] 釋放鎖成功 order_2

[ 2018-09-15T12:12:21+08:00 ][ debug ] [命令列] 開始...order_3
[ 2018-09-15T12:12:21+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_1
[ 2018-09-15T12:12:21+08:00 ][ debug ] [非同步指令碼] 處理業務 order_1
[ 2018-09-15T12:12:21+08:00 ][ debug ] [命令列] 獲取鎖成功 order_3
[ 2018-09-15T12:12:21+08:00 ][ debug ] [命令列] 處理業務 order_3
[ 2018-09-15T12:12:23+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_1

[ 2018-09-15T12:12:23+08:00 ][ debug ] [非同步指令碼] 開始...order_2
[ 2018-09-15T12:12:23+08:00 ][ debug ] [命令列] 釋放鎖成功 order_3

[ 2018-09-15T12:12:23+08:00 ][ debug ] [命令列] 開始...order_2
[ 2018-09-15T12:12:23+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_2
[ 2018-09-15T12:12:23+08:00 ][ debug ] [非同步指令碼] 處理業務 order_2
[ 2018-09-15T12:12:25+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_2

[ 2018-09-15T12:12:25+08:00 ][ debug ] [命令列] 獲取鎖成功 order_2
[ 2018-09-15T12:12:25+08:00 ][ debug ] [命令列] 處理業務 order_2
[ 2018-09-15T12:12:25+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_3
[ 2018-09-15T12:12:25+08:00 ][ debug ] [非同步指令碼] 處理業務 order_3
[ 2018-09-15T12:12:27+08:00 ][ debug ] [命令列] 釋放鎖成功 order_2

[ 2018-09-15T12:12:27+08:00 ][ debug ] [命令列] 開始...order_3
[ 2018-09-15T12:12:27+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_3

[ 2018-09-15T12:12:27+08:00 ][ debug ] [非同步指令碼] 開始...order_3
[ 2018-09-15T12:12:27+08:00 ][ debug ] [命令列] 獲取鎖成功 order_3
[ 2018-09-15T12:12:27+08:00 ][ debug ] [命令列] 處理業務 order_3
[ 2018-09-15T12:12:29+08:00 ][ debug ] [命令列] 釋放鎖成功 order_3

[ 2018-09-15T12:12:29+08:00 ][ debug ] [命令列] 開始...order_2
[ 2018-09-15T12:12:29+08:00 ][ debug ] [命令列] 獲取鎖成功 order_2
[ 2018-09-15T12:12:29+08:00 ][ debug ] [命令列] 處理業務 order_2
[ 2018-09-15T12:12:29+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_3
[ 2018-09-15T12:12:29+08:00 ][ debug ] [非同步指令碼] 處理業務 order_3
[ 2018-09-15T12:12:31+08:00 ][ debug ] [命令列] 釋放鎖成功 order_2

[ 2018-09-15T12:12:31+08:00 ][ debug ] [命令列] 開始...order_1
[ 2018-09-15T12:12:31+08:00 ][ debug ] [命令列] 獲取鎖成功 order_1
[ 2018-09-15T12:12:31+08:00 ][ debug ] [命令列] 處理業務 order_1
[ 2018-09-15T12:12:31+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_3

[ 2018-09-15T12:12:31+08:00 ][ debug ] [非同步指令碼] 開始...order_3
[ 2018-09-15T12:12:31+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_3
[ 2018-09-15T12:12:31+08:00 ][ debug ] [非同步指令碼] 處理業務 order_3
[ 2018-09-15T12:12:33+08:00 ][ debug ] [命令列] 釋放鎖成功 order_1

[ 2018-09-15T12:12:33+08:00 ][ debug ] [命令列] 開始...order_1
[ 2018-09-15T12:12:33+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_3

[ 2018-09-15T12:12:33+08:00 ][ debug ] [命令列] 獲取鎖成功 order_1
[ 2018-09-15T12:12:33+08:00 ][ debug ] [命令列] 處理業務 order_1
[ 2018-09-15T12:12:33+08:00 ][ debug ] [非同步指令碼] 開始...order_1
[ 2018-09-15T12:12:35+08:00 ][ debug ] [命令列] 釋放鎖成功 order_1

[ 2018-09-15T12:12:35+08:00 ][ debug ] [命令列] 開始...order_1
[ 2018-09-15T12:12:35+08:00 ][ debug ] [命令列] 獲取鎖成功 order_1
[ 2018-09-15T12:12:35+08:00 ][ debug ] [命令列] 處理業務 order_1
[ 2018-09-15T12:12:36+08:00 ][ debug ] [非同步指令碼] 獲取鎖失敗 order_1
[ 2018-09-15T12:12:36+08:00 ][ debug ] [非同步指令碼] 開始...order_3
[ 2018-09-15T12:12:36+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_3
[ 2018-09-15T12:12:36+08:00 ][ debug ] [非同步指令碼] 處理業務 order_3
[ 2018-09-15T12:12:37+08:00 ][ debug ] [命令列] 釋放鎖成功 order_1

[ 2018-09-15T12:12:37+08:00 ][ debug ] [命令列] 開始...order_3
[ 2018-09-15T12:12:38+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_3

[ 2018-09-15T12:12:38+08:00 ][ debug ] [非同步指令碼] 開始...order_2
[ 2018-09-15T12:12:38+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_2
[ 2018-09-15T12:12:38+08:00 ][ debug ] [非同步指令碼] 處理業務 order_2
[ 2018-09-15T12:12:38+08:00 ][ debug ] [命令列] 獲取鎖成功 order_3
[ 2018-09-15T12:12:38+08:00 ][ debug ] [命令列] 處理業務 order_3
[ 2018-09-15T12:12:40+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_2

[ 2018-09-15T12:12:40+08:00 ][ debug ] [非同步指令碼] 開始...order_3
[ 2018-09-15T12:12:40+08:00 ][ debug ] [命令列] 釋放鎖成功 order_3

[ 2018-09-15T12:12:40+08:00 ][ debug ] [命令列] 開始...order_2
[ 2018-09-15T12:12:40+08:00 ][ debug ] [命令列] 獲取鎖成功 order_2
[ 2018-09-15T12:12:40+08:00 ][ debug ] [命令列] 處理業務 order_2
[ 2018-09-15T12:12:40+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_3
[ 2018-09-15T12:12:40+08:00 ][ debug ] [非同步指令碼] 處理業務 order_3
[ 2018-09-15T12:12:42+08:00 ][ debug ] [命令列] 釋放鎖成功 order_2

[ 2018-09-15T12:12:42+08:00 ][ debug ] [命令列] 開始...order_3
[ 2018-09-15T12:12:42+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_3

[ 2018-09-15T12:12:42+08:00 ][ debug ] [非同步指令碼] 開始...order_2
[ 2018-09-15T12:12:42+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_2
[ 2018-09-15T12:12:42+08:00 ][ debug ] [非同步指令碼] 處理業務 order_2
[ 2018-09-15T12:12:42+08:00 ][ debug ] [命令列] 獲取鎖成功 order_3
[ 2018-09-15T12:12:42+08:00 ][ debug ] [命令列] 處理業務 order_3
[ 2018-09-15T12:12:44+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_2

[ 2018-09-15T12:12:44+08:00 ][ debug ] [非同步指令碼] 開始...order_1
[ 2018-09-15T12:12:44+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_1
[ 2018-09-15T12:12:44+08:00 ][ debug ] [非同步指令碼] 處理業務 order_1
[ 2018-09-15T12:12:44+08:00 ][ debug ] [命令列] 釋放鎖成功 order_3

[ 2018-09-15T12:12:44+08:00 ][ debug ] [命令列] 開始...order_3
[ 2018-09-15T12:12:44+08:00 ][ debug ] [命令列] 獲取鎖成功 order_3
[ 2018-09-15T12:12:44+08:00 ][ debug ] [命令列] 處理業務 order_3
[ 2018-09-15T12:12:46+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_1

[ 2018-09-15T12:12:46+08:00 ][ debug ] [非同步指令碼] 開始...order_2
[ 2018-09-15T12:12:46+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_2
[ 2018-09-15T12:12:46+08:00 ][ debug ] [非同步指令碼] 處理業務 order_2
[ 2018-09-15T12:12:46+08:00 ][ debug ] [命令列] 釋放鎖成功 order_3

[ 2018-09-15T12:12:46+08:00 ][ debug ] [命令列] 開始...order_3
[ 2018-09-15T12:12:46+08:00 ][ debug ] [命令列] 獲取鎖成功 order_3
[ 2018-09-15T12:12:46+08:00 ][ debug ] [命令列] 處理業務 order_3
[ 2018-09-15T12:12:48+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_2

[ 2018-09-15T12:12:48+08:00 ][ debug ] [非同步指令碼] 開始...order_1
[ 2018-09-15T12:12:48+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_1
[ 2018-09-15T12:12:48+08:00 ][ debug ] [非同步指令碼] 處理業務 order_1
[ 2018-09-15T12:12:48+08:00 ][ debug ] [命令列] 釋放鎖成功 order_3

[ 2018-09-15T12:12:48+08:00 ][ debug ] [命令列] 開始...order_1
[ 2018-09-15T12:12:50+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_1

[ 2018-09-15T12:12:50+08:00 ][ debug ] [非同步指令碼] 開始...order_3
[ 2018-09-15T12:12:50+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_3
[ 2018-09-15T12:12:50+08:00 ][ debug ] [非同步指令碼] 處理業務 order_3
[ 2018-09-15T12:12:50+08:00 ][ debug ] [命令列] 獲取鎖成功 order_1
[ 2018-09-15T12:12:50+08:00 ][ debug ] [命令列] 處理業務 order_1
[ 2018-09-15T12:12:52+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_3

[ 2018-09-15T12:12:52+08:00 ][ debug ] [命令列] 釋放鎖成功 order_1

[ 2018-09-15T12:12:52+08:00 ][ debug ] [命令列] 開始...order_1
[ 2018-09-15T12:12:52+08:00 ][ debug ] [非同步指令碼] 開始...order_3
[ 2018-09-15T12:12:52+08:00 ][ debug ] [命令列] 獲取鎖成功 order_1
[ 2018-09-15T12:12:52+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_3
[ 2018-09-15T12:12:52+08:00 ][ debug ] [命令列] 處理業務 order_1
[ 2018-09-15T12:12:52+08:00 ][ debug ] [非同步指令碼] 處理業務 order_3
[ 2018-09-15T12:12:54+08:00 ][ debug ] [命令列] 釋放鎖成功 order_1

[ 2018-09-15T12:12:54+08:00 ][ debug ] [命令列] 開始...order_2
[ 2018-09-15T12:12:54+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_3

[ 2018-09-15T12:12:54+08:00 ][ debug ] [非同步指令碼] 開始...order_1
[ 2018-09-15T12:12:54+08:00 ][ debug ] [命令列] 獲取鎖成功 order_2
[ 2018-09-15T12:12:54+08:00 ][ debug ] [命令列] 處理業務 order_2
[ 2018-09-15T12:12:54+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_1
[ 2018-09-15T12:12:54+08:00 ][ debug ] [非同步指令碼] 處理業務 order_1
[ 2018-09-15T12:12:56+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_1

[ 2018-09-15T12:12:56+08:00 ][ debug ] [命令列] 釋放鎖成功 order_2

[ 2018-09-15T12:12:56+08:00 ][ debug ] [非同步指令碼] 開始...order_2
[ 2018-09-15T12:12:56+08:00 ][ debug ] [命令列] 開始...order_1
[ 2018-09-15T12:12:56+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_2
[ 2018-09-15T12:12:56+08:00 ][ debug ] [命令列] 獲取鎖成功 order_1
[ 2018-09-15T12:12:56+08:00 ][ debug ] [命令列] 處理業務 order_1
[ 2018-09-15T12:12:56+08:00 ][ debug ] [非同步指令碼] 處理業務 order_2
[ 2018-09-15T12:12:58+08:00 ][ debug ] [命令列] 釋放鎖成功 order_1

[ 2018-09-15T12:12:58+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_2

[ 2018-09-15T12:12:58+08:00 ][ debug ] [命令列] 開始...order_1
[ 2018-09-15T12:12:58+08:00 ][ debug ] [非同步指令碼] 開始...order_2
[ 2018-09-15T12:12:58+08:00 ][ debug ] [命令列] 獲取鎖成功 order_1
[ 2018-09-15T12:12:58+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_2
[ 2018-09-15T12:12:58+08:00 ][ debug ] [命令列] 處理業務 order_1
[ 2018-09-15T12:12:58+08:00 ][ debug ] [非同步指令碼] 處理業務 order_2
[ 2018-09-15T12:13:00+08:00 ][ debug ] [命令列] 釋放鎖成功 order_1

[ 2018-09-15T12:13:00+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_2

[ 2018-09-15T12:13:00+08:00 ][ debug ] [命令列] 開始...order_1
[ 2018-09-15T12:13:00+08:00 ][ debug ] [非同步指令碼] 開始...order_3
[ 2018-09-15T12:13:00+08:00 ][ debug ] [命令列] 獲取鎖成功 order_1
[ 2018-09-15T12:13:00+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_3
[ 2018-09-15T12:13:00+08:00 ][ debug ] [命令列] 處理業務 order_1
[ 2018-09-15T12:13:00+08:00 ][ debug ] [非同步指令碼] 處理業務 order_3
[ 2018-09-15T12:13:02+08:00 ][ debug ] [命令列] 釋放鎖成功 order_1

[ 2018-09-15T12:13:02+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_3

[ 2018-09-15T12:13:02+08:00 ][ debug ] [命令列] 開始...order_1
[ 2018-09-15T12:13:02+08:00 ][ debug ] [非同步指令碼] 開始...order_3
[ 2018-09-15T12:13:02+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_3
[ 2018-09-15T12:13:02+08:00 ][ debug ] [命令列] 獲取鎖成功 order_1
[ 2018-09-15T12:13:02+08:00 ][ debug ] [非同步指令碼] 處理業務 order_3
[ 2018-09-15T12:13:04+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_3

[ 2018-09-15T12:13:04+08:00 ][ debug ] [命令列] 釋放鎖成功 order_1

[ 2018-09-15T12:13:04+08:00 ][ debug ] [命令列] 開始...order_2
1
[ 2018-09-15T12:13:04+08:00 ][ debug ] [命令列] 獲取鎖成功 order_2
[ 2018-09-15T12:13:04+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_1
[ 2018-09-15T12:13:04+08:00 ][ debug ] [非同步指令碼] 處理業務 order_1
[ 2018-09-15T12:13:04+08:00 ][ debug ] [命令列] 處理業務 order_2
[ 2018-09-15T12:13:06+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_1

[ 2018-09-15T12:13:06+08:00 ][ debug ] [命令列] 釋放鎖成功 order_2

[ 2018-09-15T12:13:06+08:00 ][ debug ] [命令列] 開始...order_1
[ 2018-09-15T12:13:06+08:00 ][ debug ] [非同步指令碼] 開始...order_2
[ 2018-09-15T12:13:06+08:00 ][ debug ] [命令列] 獲取鎖成功 order_1
[ 2018-09-15T12:13:06+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_2
[ 2018-09-15T12:13:07+08:00 ][ debug ] [非同步指令碼] 處理業務 order_2
[ 2018-09-15T12:13:09+08:00 ][ debug ] [命令列] 釋放鎖成功 order_1

[ 2018-09-15T12:13:09+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_2

[ 2018-09-15T12:13:09+08:00 ][ debug ] [非同步指令碼] 開始...order_2
[ 2018-09-15T12:13:09+08:00 ][ debug ] [命令列] 開始...order_2
[ 2018-09-15T12:13:09+08:00 ][ debug ] [命令列] 獲取鎖成功 order_2
[ 2018-09-15T12:13:09+08:00 ][ debug ] [命令列] 處理業務 order_2
[ 2018-09-15T12:13:11+08:00 ][ debug ] [命令列] 釋放鎖成功 order_2

[ 2018-09-15T12:13:11+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_2
[ 2018-09-15T12:13:11+08:00 ][ debug ] [非同步指令碼] 處理業務 order_2
[ 2018-09-15T12:13:11+08:00 ][ debug ] [命令列] 開始...order_2
[ 2018-09-15T12:13:13+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_2

[ 2018-09-15T12:13:13+08:00 ][ debug ] [命令列] 獲取鎖成功 order_2
[ 2018-09-15T12:13:13+08:00 ][ debug ] [非同步指令碼] 開始...order_2
[ 2018-09-15T12:13:13+08:00 ][ debug ] [命令列] 處理業務 order_2
[ 2018-09-15T12:13:15+08:00 ][ debug ] [命令列] 釋放鎖成功 order_2

[ 2018-09-15T12:13:15+08:00 ][ debug ] [命令列] 開始...order_2
[ 2018-09-15T12:13:15+08:00 ][ debug ] [命令列] 獲取鎖成功 order_2
[ 2018-09-15T12:13:15+08:00 ][ debug ] [命令列] 處理業務 order_2
[ 2018-09-15T12:13:16+08:00 ][ debug ] [非同步指令碼] 獲取鎖失敗 order_2
[ 2018-09-15T12:13:16+08:00 ][ debug ] [非同步指令碼] 開始...order_1
[ 2018-09-15T12:13:16+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_1
[ 2018-09-15T12:13:16+08:00 ][ debug ] [非同步指令碼] 處理業務 order_1
[ 2018-09-15T12:13:17+08:00 ][ debug ] [命令列] 釋放鎖成功 order_2

[ 2018-09-15T12:13:17+08:00 ][ debug ] [命令列] 開始...order_2
[ 2018-09-15T12:13:17+08:00 ][ debug ] [命令列] 獲取鎖成功 order_2
[ 2018-09-15T12:13:17+08:00 ][ debug ] [命令列] 處理業務 order_2
[ 2018-09-15T12:13:18+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_1

[ 2018-09-15T12:13:18+08:00 ][ debug ] [非同步指令碼] 開始...order_2
[ 2018-09-15T12:13:19+08:00 ][ debug ] [命令列] 釋放鎖成功 order_2

[ 2018-09-15T12:13:19+08:00 ][ debug ] [命令列] 開始...order_2
[ 2018-09-15T12:13:19+08:00 ][ debug ] [命令列] 獲取鎖成功 order_2
[ 2018-09-15T12:13:19+08:00 ][ debug ] [命令列] 處理業務 order_2
[ 2018-09-15T12:13:21+08:00 ][ debug ] [非同步指令碼] 獲取鎖失敗 order_2
[ 2018-09-15T12:13:21+08:00 ][ debug ] [非同步指令碼] 開始...order_3
[ 2018-09-15T12:13:21+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_3
[ 2018-09-15T12:13:21+08:00 ][ debug ] [非同步指令碼] 處理業務 order_3
[ 2018-09-15T12:13:21+08:00 ][ debug ] [命令列] 釋放鎖成功 order_2

[ 2018-09-15T12:13:21+08:00 ][ debug ] [命令列] 開始...order_2
[ 2018-09-15T12:13:21+08:00 ][ debug ] [命令列] 獲取鎖成功 order_2
[ 2018-09-15T12:13:21+08:00 ][ debug ] [命令列] 處理業務 order_2
[ 2018-09-15T12:13:23+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_3

[ 2018-09-15T12:13:23+08:00 ][ debug ] [非同步指令碼] 開始...order_2
[ 2018-09-15T12:13:23+08:00 ][ debug ] [命令列] 釋放鎖成功 order_2

[ 2018-09-15T12:13:23+08:00 ][ debug ] [命令列] 開始...order_2
[ 2018-09-15T12:13:23+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_2
[ 2018-09-15T12:13:23+08:00 ][ debug ] [非同步指令碼] 處理業務 order_2
[ 2018-09-15T12:13:25+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_2

[ 2018-09-15T12:13:25+08:00 ][ debug ] [命令列] 獲取鎖成功 order_2
[ 2018-09-15T12:13:25+08:00 ][ debug ] [命令列] 處理業務 order_2
[ 2018-09-15T12:13:25+08:00 ][ debug ] [非同步指令碼] 開始...order_1
[ 2018-09-15T12:13:25+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_1
[ 2018-09-15T12:13:25+08:00 ][ debug ] [非同步指令碼] 處理業務 order_1
[ 2018-09-15T12:13:27+08:00 ][ debug ] [命令列] 釋放鎖成功 order_2

[ 2018-09-15T12:13:27+08:00 ][ debug ] [命令列] 開始...order_2
[ 2018-09-15T12:13:27+08:00 ][ debug ] [命令列] 獲取鎖成功 order_2
[ 2018-09-15T12:13:27+08:00 ][ debug ] [命令列] 處理業務 order_2
[ 2018-09-15T12:13:27+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_1

[ 2018-09-15T12:13:27+08:00 ][ debug ] [非同步指令碼] 開始...order_3
[ 2018-09-15T12:13:27+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_3
[ 2018-09-15T12:13:27+08:00 ][ debug ] [非同步指令碼] 處理業務 order_3
[ 2018-09-15T12:13:29+08:00 ][ debug ] [命令列] 釋放鎖成功 order_2

[ 2018-09-15T12:13:29+08:00 ][ debug ] [命令列] 開始...order_2
[ 2018-09-15T12:13:29+08:00 ][ debug ] [命令列] 獲取鎖成功 order_2
[ 2018-09-15T12:13:29+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_3

[ 2018-09-15T12:13:29+08:00 ][ debug ] [非同步指令碼] 開始...order_3
[ 2018-09-15T12:13:29+08:00 ][ debug ] [命令列] 處理業務 order_2
[ 2018-09-15T12:13:29+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_3
[ 2018-09-15T12:13:29+08:00 ][ debug ] [非同步指令碼] 處理業務 order_3
[ 2018-09-15T12:13:31+08:00 ][ debug ] [命令列] 釋放鎖成功 order_2

[ 2018-09-15T12:13:31+08:00 ][ debug ] [命令列] 開始...order_3
[ 2018-09-15T12:13:31+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_3

[ 2018-09-15T12:13:31+08:00 ][ debug ] [命令列] 獲取鎖成功 order_3
[ 2018-09-15T12:13:31+08:00 ][ debug ] [命令列] 處理業務 order_3
[ 2018-09-15T12:13:31+08:00 ][ debug ] [非同步指令碼] 開始...order_2
[ 2018-09-15T12:13:31+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_2
[ 2018-09-15T12:13:31+08:00 ][ debug ] [非同步指令碼] 處理業務 order_2
[ 2018-09-15T12:13:33+08:00 ][ debug ] [命令列] 釋放鎖成功 order_3

[ 2018-09-15T12:13:33+08:00 ][ debug ] [命令列] 開始...order_3
[ 2018-09-15T12:13:33+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_2

[ 2018-09-15T12:13:33+08:00 ][ debug ] [非同步指令碼] 開始...order_1
[ 2018-09-15T12:13:33+08:00 ][ debug ] [命令列] 獲取鎖成功 order_3
[ 2018-09-15T12:13:33+08:00 ][ debug ] [命令列] 處理業務 order_3
[ 2018-09-15T12:13:33+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_1
[ 2018-09-15T12:13:33+08:00 ][ debug ] [非同步指令碼] 處理業務 order_1
[ 2018-09-15T12:13:35+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_1

[ 2018-09-15T12:13:35+08:00 ][ debug ] [命令列] 釋放鎖成功 order_3

[ 2018-09-15T12:13:35+08:00 ][ debug ] [非同步指令碼] 開始...order_2
[ 2018-09-15T12:13:35+08:00 ][ debug ] [命令列] 開始...order_1
[ 2018-09-15T12:13:35+08:00 ][ debug ] [命令列] 獲取鎖成功 order_1
[ 2018-09-15T12:13:35+08:00 ][ debug ] [命令列] 處理業務 order_1
[ 2018-09-15T12:13:35+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_2
[ 2018-09-15T12:13:35+08:00 ][ debug ] [非同步指令碼] 處理業務 order_2
[ 2018-09-15T12:13:37+08:00 ][ debug ] [命令列] 釋放鎖成功 order_1

[ 2018-09-15T12:13:37+08:00 ][ debug ] [命令列] 開始...order_3
[ 2018-09-15T12:13:37+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_2

[ 2018-09-15T12:13:37+08:00 ][ debug ] [非同步指令碼] 開始...order_3
[ 2018-09-15T12:13:37+08:00 ][ debug ] [命令列] 獲取鎖成功 order_3
[ 2018-09-15T12:13:37+08:00 ][ debug ] [命令列] 處理業務 order_3
[ 2018-09-15T12:13:39+08:00 ][ debug ] [命令列] 釋放鎖成功 order_3

[ 2018-09-15T12:13:39+08:00 ][ debug ] [命令列] 開始...order_3
[ 2018-09-15T12:13:39+08:00 ][ debug ] [命令列] 獲取鎖成功 order_3
[ 2018-09-15T12:13:39+08:00 ][ debug ] [命令列] 處理業務 order_3
[ 2018-09-15T12:13:40+08:00 ][ debug ] [非同步指令碼] 獲取鎖失敗 order_3
[ 2018-09-15T12:13:40+08:00 ][ debug ] [非同步指令碼] 開始...order_3
[ 2018-09-15T12:13:41+08:00 ][ debug ] [命令列] 釋放鎖成功 order_3

[ 2018-09-15T12:13:41+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_3
[ 2018-09-15T12:13:41+08:00 ][ debug ] [命令列] 開始...order_1
[ 2018-09-15T12:13:41+08:00 ][ debug ] [非同步指令碼] 處理業務 order_3
[ 2018-09-15T12:13:41+08:00 ][ debug ] [命令列] 獲取鎖成功 order_1
[ 2018-09-15T12:13:41+08:00 ][ debug ] [命令列] 處理業務 order_1
[ 2018-09-15T12:13:43+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_3

[ 2018-09-15T12:13:43+08:00 ][ debug ] [非同步指令碼] 開始...order_1
[ 2018-09-15T12:13:43+08:00 ][ debug ] [命令列] 釋放鎖成功 order_1

[ 2018-09-15T12:13:43+08:00 ][ debug ] [命令列] 開始...order_1
[ 2018-09-15T12:13:43+08:00 ][ debug ] [命令列] 獲取鎖成功 order_1
[ 2018-09-15T12:13:43+08:00 ][ debug ] [命令列] 處理業務 order_1
[ 2018-09-15T12:13:45+08:00 ][ debug ] [命令列] 釋放鎖成功 order_1

[ 2018-09-15T12:13:45+08:00 ][ debug ] [命令列] 開始...order_1
[ 2018-09-15T12:13:45+08:00 ][ debug ] [命令列] 獲取鎖成功 order_1
[ 2018-09-15T12:13:45+08:00 ][ debug ] [命令列] 處理業務 order_1
[ 2018-09-15T12:13:46+08:00 ][ debug ] [非同步指令碼] 獲取鎖失敗 order_1
[ 2018-09-15T12:13:46+08:00 ][ debug ] [非同步指令碼] 開始...order_3
[ 2018-09-15T12:13:46+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_3
[ 2018-09-15T12:13:46+08:00 ][ debug ] [非同步指令碼] 處理業務 order_3
[ 2018-09-15T12:13:47+08:00 ][ debug ] [命令列] 釋放鎖成功 order_1

[ 2018-09-15T12:13:47+08:00 ][ debug ] [命令列] 開始...order_3
[ 2018-09-15T12:13:48+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_3

[ 2018-09-15T12:13:48+08:00 ][ debug ] [非同步指令碼] 開始...order_3
[ 2018-09-15T12:13:48+08:00 ][ debug ] [命令列] 獲取鎖成功 order_3
[ 2018-09-15T12:13:48+08:00 ][ debug ] [命令列] 處理業務 order_3
[ 2018-09-15T12:13:50+08:00 ][ debug ] [命令列] 釋放鎖成功 order_3

[ 2018-09-15T12:13:50+08:00 ][ debug ] [命令列] 開始...order_3
[ 2018-09-15T12:13:50+08:00 ][ debug ] [命令列] 獲取鎖成功 order_3
[ 2018-09-15T12:13:50+08:00 ][ debug ] [命令列] 處理業務 order_3
[ 2018-09-15T12:13:51+08:00 ][ debug ] [非同步指令碼] 獲取鎖失敗 order_3
[ 2018-09-15T12:13:51+08:00 ][ debug ] [非同步指令碼] 開始...order_2
[ 2018-09-15T12:13:51+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_2
[ 2018-09-15T12:13:51+08:00 ][ debug ] [非同步指令碼] 處理業務 order_2
[ 2018-09-15T12:13:52+08:00 ][ debug ] [命令列] 釋放鎖成功 order_3

[ 2018-09-15T12:13:52+08:00 ][ debug ] [命令列] 開始...order_2
[ 2018-09-15T12:13:53+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_2

[ 2018-09-15T12:13:53+08:00 ][ debug ] [非同步指令碼] 開始...order_3
[ 2018-09-15T12:13:53+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_3
[ 2018-09-15T12:13:53+08:00 ][ debug ] [非同步指令碼] 處理業務 order_3
[ 2018-09-15T12:13:53+08:00 ][ debug ] [命令列] 獲取鎖成功 order_2
[ 2018-09-15T12:13:53+08:00 ][ debug ] [命令列] 處理業務 order_2
[ 2018-09-15T12:13:55+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_3

[ 2018-09-15T12:13:55+08:00 ][ debug ] [非同步指令碼] 開始...order_2
[ 2018-09-15T12:13:55+08:00 ][ debug ] [命令列] 釋放鎖成功 order_2

[ 2018-09-15T12:13:55+08:00 ][ debug ] [命令列] 開始...order_2
[ 2018-09-15T12:13:55+08:00 ][ debug ] [命令列] 獲取鎖成功 order_2
[ 2018-09-15T12:13:55+08:00 ][ debug ] [命令列] 處理業務 order_2
[ 2018-09-15T12:13:57+08:00 ][ debug ] [命令列] 釋放鎖成功 order_2

[ 2018-09-15T12:13:57+08:00 ][ debug ] [命令列] 開始...order_3
[ 2018-09-15T12:13:57+08:00 ][ debug ] [命令列] 獲取鎖成功 order_3
[ 2018-09-15T12:13:57+08:00 ][ debug ] [命令列] 處理業務 order_3
[ 2018-09-15T12:13:57+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_2
[ 2018-09-15T12:13:57+08:00 ][ debug ] [非同步指令碼] 處理業務 order_2
[ 2018-09-15T12:13:59+08:00 ][ debug ] [命令列] 釋放鎖成功 order_3

[ 2018-09-15T12:13:59+08:00 ][ debug ] [命令列] 開始...order_3
[ 2018-09-15T12:13:59+08:00 ][ debug ] [命令列] 獲取鎖成功 order_3
[ 2018-09-15T12:13:59+08:00 ][ debug ] [命令列] 處理業務 order_3
[ 2018-09-15T12:13:59+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_2

[ 2018-09-15T12:13:59+08:00 ][ debug ] [非同步指令碼] 開始...order_3
[ 2018-09-15T12:14:01+08:00 ][ debug ] [命令列] 釋放鎖成功 order_3

[ 2018-09-15T12:14:01+08:00 ][ debug ] [命令列] 開始...order_1
[ 2018-09-15T12:14:01+08:00 ][ debug ] [命令列] 獲取鎖成功 order_1
[ 2018-09-15T12:14:01+08:00 ][ debug ] [命令列] 處理業務 order_1
[ 2018-09-15T12:14:01+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_3
[ 2018-09-15T12:14:01+08:00 ][ debug ] [非同步指令碼] 處理業務 order_3
[ 2018-09-15T12:14:03+08:00 ][ debug ] [命令列] 釋放鎖成功 order_1

[ 2018-09-15T12:14:03+08:00 ][ debug ] [命令列] 開始...order_2
[ 2018-09-15T12:14:03+08:00 ][ debug ] [命令列] 獲取鎖成功 order_2
[ 2018-09-15T12:14:03+08:00 ][ debug ] [命令列] 處理業務 order_2
[ 2018-09-15T12:14:03+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_3

[ 2018-09-15T12:14:03+08:00 ][ debug ] [非同步指令碼] 開始...order_2
[ 2018-09-15T12:14:05+08:00 ][ debug ] [命令列] 釋放鎖成功 order_2

[ 2018-09-15T12:14:05+08:00 ][ debug ] [命令列] 開始...order_2
[ 2018-09-15T12:14:05+08:00 ][ debug ] [命令列] 獲取鎖成功 order_2
[ 2018-09-15T12:14:05+08:00 ][ debug ] [命令列] 處理業務 order_2
[ 2018-09-15T12:14:06+08:00 ][ debug ] [非同步指令碼] 獲取鎖失敗 order_2
[ 2018-09-15T12:14:06+08:00 ][ debug ] [非同步指令碼] 開始...order_3
[ 2018-09-15T12:14:06+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_3
[ 2018-09-15T12:14:06+08:00 ][ debug ] [非同步指令碼] 處理業務 order_3
[ 2018-09-15T12:14:07+08:00 ][ debug ] [命令列] 釋放鎖成功 order_2

[ 2018-09-15T12:14:07+08:00 ][ debug ] [命令列] 開始...order_3
[ 2018-09-15T12:14:08+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_3

[ 2018-09-15T12:14:08+08:00 ][ debug ] [非同步指令碼] 開始...order_1
[ 2018-09-15T12:14:08+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_1
[ 2018-09-15T12:14:08+08:00 ][ debug ] [非同步指令碼] 處理業務 order_1
[ 2018-09-15T12:14:08+08:00 ][ debug ] [命令列] 獲取鎖成功 order_3
[ 2018-09-15T12:14:08+08:00 ][ debug ] [命令列] 處理業務 order_3
[ 2018-09-15T12:14:10+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_1

[ 2018-09-15T12:14:10+08:00 ][ debug ] [非同步指令碼] 開始...order_1
[ 2018-09-15T12:14:10+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_1
[ 2018-09-15T12:14:10+08:00 ][ debug ] [非同步指令碼] 處理業務 order_1
[ 2018-09-15T12:14:10+08:00 ][ debug ] [命令列] 釋放鎖成功 order_3

[ 2018-09-15T12:14:10+08:00 ][ debug ] [命令列] 開始...order_1
[ 2018-09-15T12:14:12+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_1

[ 2018-09-15T12:14:12+08:00 ][ debug ] [非同步指令碼] 開始...order_3
[ 2018-09-15T12:14:12+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_3
[ 2018-09-15T12:14:12+08:00 ][ debug ] [非同步指令碼] 處理業務 order_3
[ 2018-09-15T12:14:12+08:00 ][ debug ] [命令列] 獲取鎖成功 order_1
[ 2018-09-15T12:14:12+08:00 ][ debug ] [命令列] 處理業務 order_1
[ 2018-09-15T12:14:14+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_3

[ 2018-09-15T12:14:14+08:00 ][ debug ] [非同步指令碼] 開始...order_2
[ 2018-09-15T12:14:14+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_2
[ 2018-09-15T12:14:14+08:00 ][ debug ] [非同步指令碼] 處理業務 order_2
[ 2018-09-15T12:14:14+08:00 ][ debug ] [命令列] 釋放鎖成功 order_1

[ 2018-09-15T12:14:14+08:00 ][ debug ] [命令列] 開始...order_2
[ 2018-09-15T12:14:16+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_2

[ 2018-09-15T12:14:16+08:00 ][ debug ] [非同步指令碼] 開始...order_3
[ 2018-09-15T12:14:16+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_3
[ 2018-09-15T12:14:16+08:00 ][ debug ] [非同步指令碼] 處理業務 order_3
[ 2018-09-15T12:14:16+08:00 ][ debug ] [命令列] 獲取鎖成功 order_2
[ 2018-09-15T12:14:16+08:00 ][ debug ] [命令列] 處理業務 order_2
[ 2018-09-15T12:14:18+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_3

[ 2018-09-15T12:14:18+08:00 ][ debug ] [非同步指令碼] 開始...order_2
[ 2018-09-15T12:14:18+08:00 ][ debug ] [命令列] 釋放鎖成功 order_2

[ 2018-09-15T12:14:18+08:00 ][ debug ] [命令列] 開始...order_1
[ 2018-09-15T12:14:18+08:00 ][ debug ] [命令列] 獲取鎖成功 order_1
[ 2018-09-15T12:14:18+08:00 ][ debug ] [命令列] 處理業務 order_1
[ 2018-09-15T12:14:18+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_2
[ 2018-09-15T12:14:18+08:00 ][ debug ] [非同步指令碼] 處理業務 order_2
[ 2018-09-15T12:14:20+08:00 ][ debug ] [命令列] 釋放鎖成功 order_1

[ 2018-09-15T12:14:20+08:00 ][ debug ] [命令列] 開始...order_3
[ 2018-09-15T12:14:20+08:00 ][ debug ] [命令列] 獲取鎖成功 order_3
[ 2018-09-15T12:14:20+08:00 ][ debug ] [命令列] 處理業務 order_3
[ 2018-09-15T12:14:20+08:00 ][ debug ] [非同步指令碼] 釋放鎖成功 order_2

[ 2018-09-15T12:14:20+08:00 ][ debug ] [非同步指令碼] 開始...order_3
[ 2018-09-15T12:14:22+08:00 ][ debug ] [命令列] 釋放鎖成功 order_3

[ 2018-09-15T12:14:22+08:00 ][ debug ] [命令列] 開始...order_3
[ 2018-09-15T12:14:22+08:00 ][ debug ] [命令列] 獲取鎖成功 order_3
[ 2018-09-15T12:14:22+08:00 ][ debug ] [命令列] 處理業務 order_3
[ 2018-09-15T12:14:23+08:00 ][ debug ] [非同步指令碼] 獲取鎖失敗 order_3
[ 2018-09-15T12:14:23+08:00 ][ debug ] [非同步指令碼] 開始...order_2
[ 2018-09-15T12:14:23+08:00 ][ debug ] [非同步指令碼] 獲取鎖成功 order_2
[ 2018-09-15T12:14:23+08:00 ][ debug ] [非同步指令碼] 處理業務 order_2
[ 2018-09-15T12:14:24+08:00 ][ debug ] [命令列] 釋放鎖成功 order_3

5、大資料

Redis大批量增加資料

command.txt

SET Key0 Value0
SET Key1 Value1
SET Key2 Value2
SET Key3 Value3
SET Key4 Value4
SET Key5 Value5
SET Key6 Value6
...
...
SET Key100000 Value100000

批量插入

$ cat command.txt | redis-cli -h 127.0.0.1 -p 6379 -n 0 --pipe
All data transferred. Waiting for the last reply...
Last reply received from server.
errors: 0, replies: 11

檢視插入的資料

127.0.0.1:6379> keys Ke*
 1) "Key2"
 2) "Key7"
 3) "Key10"
 4) "Key9"
 5) "Key3"
 6) "Key1"
 7) "Key8"
 8) "Key6"
 9) "Key5"
10) "Key4"
...

官方教程  

相關文章