脚本使用 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"} }