?????? 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的主要内容,如果未能解决你的问题,请参考以下文章

玩转 lua in Redis

?????? 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

redis Lua学习与坑

Redis+Lua实现限流