Redis學習筆記(三)使用Lua腳本實現分佈式鎖

 Redis在2.6推出了腳本功能,容許開發者使用Lua語言編寫腳本傳到Redis中執行。php

使用Lua腳本的好處以下:html

  • 1.減小網絡開銷:原本5次網絡請求的操做,能夠用一個請求完成,原先5次請求的邏輯放在redis服務器上完成。使用腳本,減小了網絡往返時延。
  • 2.原子操做:Redis會將整個腳本做爲一個總體執行,中間不會被其餘命令插入。
  • 3.複用:客戶端發送的腳本會永久存儲在Redis中,意味着其餘客戶端能夠複用這一腳本而不須要使用代碼完成一樣的邏輯。

一、Redis命令行執行Lua腳本git

01 、EVAL語法github

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

(1)script:須要執行的lua腳本  redis

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

(3)key:redis中各類數據結構的替代符號數組

(4)script:自定義參數緩存

說明:EVAL 和 EVALSHA 命令是從 Redis 2.6.0 版本開始的,使用內置的 Lua 解釋器,能夠對 Lua 腳本進行求值。bash

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

0三、使用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 命令

二、Redis中Lua腳本命令介紹

0一、SCRIPT  命令

命令用於將腳本 script 添加到腳本緩存中,但並不當即執行這個腳本。

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

0二、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"

0三、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>

0四、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>

0五、SCRIPT KILL

殺死當前正在運行的 Lua 腳本

三、調試

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"

 四、案例介紹

一、獲取指定的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"

二、集合去重

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)

四、訪問頻率控制

實現一個訪問頻率控制,某個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

五、實現分佈式鎖

<?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

五、大數據

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"
...

官方教程  

相關文章
相關標籤/搜索