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