前言
在redis的官網(wǎng)上洋洋灑灑的大概提供了200多個(gè)命令,貌似看起來很多,但是這些都是別人預(yù)先給你定義好的,但你卻不能按照自己的意圖進(jìn)行定制,
所以是不是感覺自己還是有一種被束縛的感覺,有這個(gè)感覺就對(duì)了。。。
說來也巧,redis的大老板給了你解決這種問題的方法,那就是Lua腳本,而且redis的最新版本也支持Lua Script debug,這應(yīng)該也是未來Redis的一
個(gè)發(fā)展趨勢(shì),要想學(xué)好Redis,必會(huì)Lua Script。。。
下面話不多說了,來一起看看詳細(xì)的介紹吧
版本:自2.6.0起可用。
時(shí)間復(fù)雜度:取決于執(zhí)行的腳本。
使用Lua腳本的好處:
如何使用
基本使用
命令格式:
EVAL script numkeys key [key ...] arg [arg ...]
說明:
簡(jiǎn)單實(shí)例:
127.0.0.1:6379> eval "return ARGV[1]" 0 100 "100" 127.0.0.1:6379> eval "return {ARGV[1],ARGV[2]}" 0 100 101 1) "100" 2) "101" 127.0.0.1:6379> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second 1) "key1" 2) "key2" 3) "first" 4) "second" 127.0.0.1:6379> eval "redis.call('SET', KEYS[1], ARGV[1]);redis.call('EXPIRE', KEYS[1], ARGV[2]); return 1;" 1 test 10 60 (integer) 1 127.0.0.1:6379> ttl test (integer) 59 127.0.0.1:6379> get test "10"
注:
命令行里使用
如果直接使用redis-cli命令,格式會(huì)有點(diǎn)不一樣:
redis-cli --eval lua_file key1 key2 , arg1 arg2 arg3
注意的地方:
示例:
incrbymul.lua
local num = redis.call('GET', KEYS[1]); if not num then return 0; else local res = num * ARGV[1]; redis.call('SET',KEYS[1], res); return res; end
命令行運(yùn)行:
$ redis-cli --eval incrbymul.lua lua:incrbymul , 8 (integer) 0 $ redis-cli incr lua:incrbymul (integer) 1 $ redis-cli --eval incrbymul.lua lua:incrbymul , 8 (integer) 8 $ redis-cli --eval incrbymul.lua lua:incrbymul , 8 (integer) 64 $ redis-cli --eval incrbymul.lua lua:incrbymul , 2 (integer) 128
由于redis沒有提供命令可以實(shí)現(xiàn)將一個(gè)數(shù)原子性的乘以N倍,這里我們就用Lua腳本實(shí)現(xiàn)了,運(yùn)行過程中確保不會(huì)被其它客戶端打斷。
phpredis里使用
接著上面的例子:
incrbymul.php
?php $lua = EOF local num = redis.call('GET', KEYS[1]); if not num then return 0; else local res = num * ARGV[1]; redis.call('SET',KEYS[1], res); return res; end EOF; $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $ret = $redis->eval($lua, array("lua:incrbymul", 2), 1); echo $ret;
運(yùn)行:
$ redis-cli set lua:incrbymul 0 OK $ redis-cli incr lua:incrbymul (integer) 1 $ php incrbymul.php 2 $ php incrbymul.php 4
eval原型:
Redis::eval(string script, [array keys, long num_keys])
eval函數(shù)的第3個(gè)參數(shù)為KEYS個(gè)數(shù),phpredis依據(jù)此值將KEYS和ARGV做區(qū)分。
參考
1、在redis中使用lua腳本讓你的靈活性提高5個(gè)逼格 - 一線碼農(nóng)
https://www.jb51.net/article/148830.htm
2、Redis執(zhí)行Lua腳本示例 - yanghuahui
https://www.jb51.net/article/148833.htm
3、EVAL - Redis
https://redis.io/commands/eval
4、phpredis 執(zhí)行LUA腳本的例子 - jingtan的專欄
https://www.jb51.net/article/148838.htm
5、lua-book
http://me.52fhy.com/lua-book/
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
標(biāo)簽:定州 泰州 南寧 伊春 河源 甘南 畢節(jié) 拉薩
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Redis如何使用lua腳本實(shí)例教程》,本文關(guān)鍵詞 Redis,如何,使用,lua,腳本,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。