?????? lua in Redis
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了?????? lua in Redis相关的知识,希望对你有一定的参考价值。
??????????????? foo ?????? ?????? ?????? ???????????? toolbar ?????? ali
????????????
Redis????????????????????????????????????????????????????????????????????????????????????redis???lua???????????????????????????lua?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????lua????????????C???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
??????Lua??????
Lua ???????????????????????????????????????????????????????????????????????????Pontifical Catholic University of Rio de Janeiro?????????????????????????????????Roberto Ierusalimschy???Waldemar Celes ??? Luiz Henrique de Figueiredo???????????????1993???????????? ????????????????????????????????????????????????????????????????????????????????????????????????????????????Lua?????????C?????????????????????????????????????????????????????????????????????????????????Lua?????????????????????????????????????????????????????????????????????Lua???????????????????????????????????????????????????Lua ????????????????????????JIT?????????????????????????????????????????????????????????
Lua???????????????????????????C/C++ ???????????????????????????????????????C/C++?????????????????????Lua?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????XML,ini??????????????????????????????????????????????????? Lua?????????C?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????Lua???????????????200k????????????????????????????????????Lua?????????????????????????????????????????????Lua??????????????????????????????????????????
????????????Lua???????????????
1?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
2????????????????????????Redis???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
3?????????????????????????????????????????????????????????redis?????????????????????????????????????????????????????????????????????????????????
4?????????????????? ??????????????????????????????, ???????????? JIT???????????????????????????????????????????????????; ??????????????????????????????????????????, ???????????????????????????C??????, ??????????????????, ?????????????????????????????????????????????
5??????????????????????????????ANSI C ?????????????????????????????????????????????????????????????????????????????????????????????:??? Windows ???Linux?????????Mac??????????????????, ???????????????????????????????????????????????????????????????????????? (?????????JavaScript).
6??????????????????20000???C????????????????????????182K?????????????????????????????????????????????
??????redis???lua????????????
1?????????Lua??????????????????
$ redis-cli --eval path/to/redis.lua KEYS[1] KEYS[2] , ARGV[1] ARGV[2] ...
--eval?????????redis-cli????????????????????????lua??????
path/to/redis.lua??????lua???????????????
KEYS[1] KEYS[2]????????????????????????????????????????????????lua???????????????KEYS[1], KEYS[2]??????
ARGV[1] ARGV[2]???????????????lua???????????????ARGV[1], ARGV[2]?????????
????????? KEYS???ARGV????????? ???,??? ?????????????????????????????????
redis???????????????Lua?????????
?????? | ?????? |
---|---|
Base | ???????????????????????? |
String | ???????????????????????????????????? |
Table | ?????????????????????????????? |
Math | ???????????????????????? |
Debug | ??????????????????????????? |
2?????????????????????redis??????
????????????????????????redis.call????????????Redis??????
redis.call(???set???, ???foo???, ???bar???)
local value=redis.call(???get???, ???foo???) --value?????????bar
redis.call????????????????????????Redis?????????????????????
Redis?????????????????????5????????????redis.call???????????????5????????????????????????????????????Lua?????????????????????????????????????????????????????????????????????????????????Lua???false???
redis??????????????????Lua????????????????????????
redis??????????????? | Lua???????????? |
---|---|
???????????? | ???????????? |
??????????????? | ??????????????? |
????????????????????? | table??????(????????????) |
???????????? | table??????(????????????ok????????????????????????) |
???????????? | table??????(????????????err????????????????????????) |
redis????????????redis.pcall??????????????????redis.call??????????????????????????????????????????????????????redis.pcall????????????????????????????????????redis.call?????????????????????????????????????????????????????????????????????return???????????????????????????????????????????????????return?????????????????????nil
Lua???????????????redis???????????????????????????
Lua???????????? | redis??????????????? |
---|---|
???????????? | ????????????(Lua??????????????????????????????????????????) |
??????????????? | ??????????????? |
table??????(????????????) | ????????????????????? |
table??????(????????????ok????????????????????????) | ???????????? |
table??????(????????????err????????????????????????) | ???????????? |
3?????????????????????
EVAL????????? eval script numkeys key [key ...] arg [arg ...]
??????key???arg???????????????????????????????????????????????????????????????????????????KEYS???ARGV???????????????????????????????????????
script??? ???lua??????
numkeys??????????????????key????????????KEYS[1],KEYS[2]...????????????????????????numkeys+1???????????????????????????ARGV[1],ARGV[2]...
????????? EVAL??????????????????numkeys???????????????????????????????????????????????????KEYS???ARGV??????table???????????????????????????????????????????????????????????????????????????????????????(??????0)
192.168.127.128:6379>eval "return redis.call(???set???,KEYS[1],ARGV[1])" 1 name liulei OK 192.168.127.128:6379>get name "liulei"
4??? EVALSHA??????
???????????????????????????????????????????????????????????????????????????????????????Redis??????????????????????????????????????????????????????Redis?????????EVALSHA?????????????????????????????????????????????SHA1?????????????????????????????????????????????EVAL????????????????????????????????????????????????????????????SHA1?????????
Redis?????????EVAL???????????????????????????SHA1??????????????????????????????????????????EVALSHA?????????Redis?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????"NOSCRIPT No matching script. Please use EVAL."
??????????????????EVALSHA??????????????????????????????
1????????????????????????SHA1??????????????????EVALSHA?????????????????????
2????????????????????????????????????“NOSCRIPT”???????????????EVAL???????????????????????????
???????????????????????????????????????????????????????????????????????????Redis?????????????????????????????????????????????????????????EVAL???????????????????????????EVALSHA????????????????????????????????????EVAL?????????
SCRIPTLOAD "lua-script" ??????????????????????????????????????? ??????????????????SHA1??????
SCRIPT EXISTS lua-script-sha1 ??????????????????????????????
5??? SCRIPT FLUSH?????????????????????????????????
?????????????????????redis????????????SHA1????????????????????????????????????????????????????????????????????????????????????SCRIPT FLUSH?????????????????????????????????
192.168.127.128:6379>script flush OK 192.168.127.128:6379>SCRIPT FLUSH OK
6???SCRIPT KILL?????????????????????????????????
???????????????????????????????????? ???????????????????????????????????????redis?????????????????????????????????SCRIPT KILL?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
192.168.127.128:6379>script kill (error)NOTBUSY No scripts in execution right now 192.168.127.128:6379>SCRIPT KILL (error)NOTBUSY No scripts in execution right now //?????????????????????????????????????????????????????????
7???lua-time-limit 5000???redis.conf??????????????????
????????????????????????????????????????????????Redis????????????????????????????????????????????????Redis?????????lua-time-limit???????????????????????????????????????????????????5??????????????????????????????????????????????????????Redis????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????“BUSY”?????????
以上是关于?????? lua in Redis的主要内容,如果未能解决你的问题,请参考以下文章
代码分享用redis+lua实现多个集合取交集并过滤,类似于: select key from set2 where key in (select key from set1) and value(代
Lua with nginx in openresty:如果在 redis 缓存中找不到数据,则将请求传递给 FastCGI