腳本使用 Lua 解釋器來執行腳本。 Redis 從2.6版本開始,經過內嵌支持 Lua 環境。執行腳本的經常使用命令爲 EVAL。php
redis內嵌lua解釋器,從redis 2.6版本開始,redis可使用EVAL命令執行lua腳本git
10.117.8.188:6379> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 string1 string2 first second 1) "string1" 2) "string2" 3) "first" 4) "second" 10.117.8.188:6379> EVAL "redis.call('set',KEYS[1],ARGV[1]);redis.call('set',KEYS[2],ARGV[2]);return 'ok';" 2 string1 string2 str1111 str2222 "ok"
10.117.8.188:6379> SCRIPT LOAD "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" "a42059b356c875f0717db19a51f6aaca9ae659ea" 10.117.8.188:6379> EVALSHA a42059b356c875f0717db19a51f6aaca9ae659ea 2 string1 string2 first second 1) "string1" 2) "string2" 3) "first" 4) "second"
10.117.8.188:6379> SCRIPT LOAD "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" "a42059b356c875f0717db19a51f6aaca9ae659ea"
10.117.8.188:6379> SCRIPT EXISTS a42059b356c875f0717db19a51f6aaca9ae659ea 1) (integer) 1 10.117.8.188:6379> SCRIPT EXISTS np2059b356c875f0717db19a51f6aaca9ae659ea 1) (integer) 0 10.117.8.188:6379> SCRIPT EXISTS a42059b356c875f0717db19a51f6aaca9ae659ea np2059b356c875f0717db19a51f6aaca9ae659ea 1) (integer) 1 2) (integer) 0
10.117.8.188:6379> SCRIPT FLUSH OK 10.117.8.188:6379> SCRIPT EXISTS a42059b356c875f0717db19a51f6aaca9ae659ea 1) (integer) 0
10.117.8.188:6379> SCRIPT KILL (error) NOTBUSY No scripts in execution right now. //沒有腳本在執行 (error) ERR Sorry the script already executed write commands against the dataset. You can either wait the script termination or kill the server in an hard way using the SHUTDOWN NOSAVE command.//嘗試殺死一個執行過寫操做的腳本 (error) ERR Error running script (call to f_694a5fe1ddb97a4c6a1bf299d9537c7d3d0f84e7): Script killed by user with SCRIPT KILL... // 腳本被殺死後,客戶端返回的錯誤信息
setGet.lua local num = redis.call('GET',KEYS[1]); if not ARGV[1] then redis.call('DEL',KEYS[1]); else redis.call('SET',KEYS[1],ARGV[1]); end return num; 命令行運行 www@iZ23dvyt70vZ:~ $ redis-cli --eval getSet.lua ll , 6 "5" www@iZ23dvyt70vZ:~ $ redis-cli --eval getSet.lua ll , 8 "6" www@iZ23dvyt70vZ:~ $ redis-cli --eval getSet.lua ll "8" www@iZ23dvyt70vZ:~ $ redis-cli --eval getSet.lua ll ,9 (nil)
public function redisTestAction(){ $redis = new \Redis(); $redis->connect('10.117.8.188',6379); // $redis->connect('127.0.0.1',6379); 兩個均可以 $luaScript = <<<EOF local num = redis.call('GET',KEYS[1]); if not ARGV[1] then redis.call('DEL',KEYS[1]); else redis.call('SET',KEYS[1],ARGV[1]); end return num; EOF; $res = $redis->eval($luaScript,['ll',20],1); var_dump($res); // 若是key:ll不存在,則res=false,ll不爲空,則返回ll的舊值,並將新值賦值給ll }
public function redisTestAction(){ $redis = new \Redis(); $redis->connect('10.117.8.188',6379); $luaScript = <<<EOF local num = redis.call('GET',KEYS[1]); if not ARGV[1] then redis.call('DEL',KEYS[1]); else redis.call('SET',KEYS[1],ARGV[1]); end return num; EOF; $luasha = $redis->script('load',$luaScript); var_dump($luasha); echo "<br/>"; $res = $redis->evalSha($luasha,['ll',335],1); var_dump($res); //返回結果 //string(40) "5f31d46a307c1c36487a8af9bd263a29ab4fedcd" //string(3) "330" //string(40) "5f31d46a307c1c36487a8af9bd263a29ab4fedcd" //string(3) "335" }
public function redisTestAction(){ $redis = new \Redis(); $redis->connect('10.117.8.188',6379); $luaScript = <<<EOF local num = redis.call('GET',KEYS[1]); if not ARGV[1] then redis.call('DEL',KEYS[1]); else redis.call('SET',KEYS[1],ARGV[1]); end return num; EOF; $res = $redis->script('load', $luaScript); var_dump($res); // 5f31d46a307c1c36487a8af9bd263a29ab4fedcd $res = $redis->script('exists', '5f31d46a307c1c36487a8af9bd263a29ab4fedcd'); var_dump($res); // array(1) { [0]=> int(1) } $res = $redis->script('flush'); var_dump($res); // bool(true) $res = $redis->script('kill'); var_dump($res); // bool(false) }
public function redisTestAction(){ $redis = new \Redis(); $redis->connect('10.117.8.188',6379); $luaScript = <<<EOF local num = redis.call('GET',KEYS[1]); if not ARGV[1] then redis.call('DEL',KEYS[1]); else redis.call('SET',KEYS[1],ARGV[1]); end return num; EOF; $err1 = $redis->getLastError(); var_dump($err1); // NULL echo "<br>"; $redis->eval($luaScript,['lrre',4]); $err = $redis->getLastError(); var_dump($err); //string(74) "@user_script: 1: Lua redis() command arguments must be strings or integers" }
public function redisTestAction(){ $redis = new \Redis(); $redis->connect('10.117.8.188',6379); $luaScript = <<<EOF local num = redis.call('GET',KEYS[1]); if not ARGV[1] then redis.call('DEL',KEYS[1]); else redis.call('SET',KEYS[1],ARGV[1]); end return num; EOF; $redis->eval($luaScript,['lrre',4]); $err = $redis->getLastError(); var_dump($err); // string(74) "@user_script: 1: Lua redis() command arguments must be strings or integers" echo "<br>"; $res = $redis->clearLastError(); var_dump($res); // bool(true) echo "<br>"; $err = $redis->getLastError(); var_dump($err);// NULL }
public function redisTestAction(){ $redis = new \Redis(); $redis->connect('10.117.8.188',6379); $redis->setOption(\Redis::OPT_PREFIX, 'prefix1:'); //全部新建的key都會帶有該前綴prefix1: $res1 = $redis->set('gg','gggggt'); // key爲gg,實際在redis中該鍵爲prefix1:gg var_dump($res1); $res = $redis->_prefix('gg'); var_dump($res); // 返回:prefix1:gg $res2 = $redis->_prefix('tt'); //鍵tt在redis中不存在,一樣返回prefix1:tt,並不會新建一個鍵prefix1:tt var_dump($res2);// 返回 prefix1:tt }
public function redisTestAction(){ $redis = new \Redis(); $redis->connect('10.117.8.188',6379); $redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_NONE); $redis->_serialize("foo"); // returns "foo" $redis->_serialize(Array()); // Returns "Array" $redis->_serialize(new stdClass()); // Returns "Object" $redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_PHP); $redis->_serialize("foo"); // Returns 's:3:"foo";' }
public function redisTestAction(){ $redis = new \Redis(); $redis->connect('10.117.8.188',6379); $redis->setOption(\Redis::OPT_SERIALIZER, \Redis::SERIALIZER_PHP); $data = ['it'=>'it','if'=>'kl','ig'=>'gj']; $res = serialize($data); var_dump($res); // string(60) "a:3:{s:2:"it";s:2:"it";s:2:"if";s:2:"kl";s:2:"ig";s:2:"gj";}" $ret = $redis->_unserialize($res); var_dump($ret);//array(3) {["it"]=>string(2) "it" ["if"]=>string(2) "kl" ["ig"]=>string(2) "gj"} }