LUA - 技术教程文章

使用Haproxy+lua代理Mongodb副本集【代码】【图】

一般情况下,使用mongo客户端,或者其他语言的mongo客户端驱动程序连接mongodb副本集的时候,只需要指定副本集名称,就可以实现当mongodb副本集主备切换时的高可用目标。 但是总有一些特殊的场合,连接到副本集的客户端与副本集所在的网络是隔离的,只能通过副本集所在网络的代理访问副本集,比如说,mongodb副本集被部署到k8s上,当k8s集群外的客户端想访问副本集时,只能通过代理进行访问,如通过haproxy访问副本集。 那么问题来...

redis生产环境下部署lua脚本

加载到redisredis-cli script load "$(cat test.lua)" 得到sha1值 执行redis-cli evalsha "7a2054836e94e19da22c13f160bd987fbc9ef146" 0 点赞 收藏分享文章举报学亮编程手记发布了910 篇原创文章 · 获赞 390 · 访问量 79万+他的留言板 关注

redis lua限流脚本【代码】

lua限流脚本:local key_local = redis.call(setnx,KEYS[1],0)if tonumber(key_local) == 0 thenif tonumber(redis.call(get,KEYS[1]))>=tonumber(ARGV[2]) thenreturn falseelseredis.call(incr,KEYS[1])return trueend elseredis.call(incr,KEYS[1])redis.call(pexpire,KEYS[1],ARGV[1])return true endjava调用代码:import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.Class...

Lua mysql,需要一种逃避数据的方法【代码】

我需要一种方法来逃避lua中mysql语句的数据.我习惯在php中做类似mysql_real_escape_string()的东西但是在lua中使用mysql找不到等价物(con:escape()在我使用sqlite3时工作).我已经读过准备好的陈述是一个解决方案,但它似乎对我不起作用.我究竟做错了什么?require "luasql.mysql" env = assert (luasql.mysql()) con = env:connect("db_name", "user", "pass", "localhost") local stmt = con:prepare([[SELECT * FROM `user` WHER...

redis+lua分布式高并发--限流算法【代码】

lua脚本 limit.lua local key = KEYS[1] local limit = tonumber(ARGV[1]) local current = tonumber(redis.call('get', key) or '0') if current + 1 > limit thenreturn 0 elseredis.call("INCRBY", key,"1")redis.call("expire", key,"30000")return 1 endjava代码// redis serverprotected static final String HOST_NAME = "192.168.1.29";//redis 端口protected static final int PORT = 6379;public RedisTemplate<String, ...

Lua操作mysql【代码】

原文链接:http://www.cnblogs.com/xuxu8511/p/3402964.html 1 require "luasql.mysql"2 3 --创建环境对象4 env = luasql.mysql()5 6 --连接数据库7 conn = env:connect("数据库名","用户名","密码","IP地址",端口)8 9 --设置数据库的编码格式 10 conn:execute"SET NAMES GB2312" 11 12 --执行数据库操作 13 cur = conn:execute("select * from role") 14 15 row = cur:fetch({},"a") 16 17 --文件对象的创建 18 file = io.open...

MySQL查询顺序由Cluase花费太多时间【代码】

我有一个查询,只有.001秒,没有按部分排序.但是当我在查询中添加订单时,它需要大约.736秒的时间.太多时间了.我已将该列编入索引,但其未按预期工作. 这是查询:SELECT DISTINCT n0_.id AS id0, n0_.published_at AS published_at1 FROM news n0_INNER JOIN news_translations n1_ ON n0_.id = n1_.translatable_id WHERE ((n0_.unpublished_at IS NOT NULLAND (CURRENT_TIMESTAMP >= n0_.published_atAND CURRENT_TIMESTAMP < n0_.un...

Redis执行lua脚本,key不存在的返回值【代码】

Redis执行lua脚本,如果key不存在,则对应返回值为 false(boolean)local val = redis.call(get, KEYS[1])print(val) Redis 到 Lua 的转换表。Redis integer reply -> Lua number / Redis 整数转换成 Lua 数字 Redis bulk reply -> Lua string / Redis bulk 回复转换成 Lua 字符串 Redis multi bulk reply -> Lua table (may have other Redis data types nested) / Redis 多条 bulk 回复转换成 Lua 表,表内可能有其他别的 Redis ...

Redis使用Lua脚本【代码】

1. 基本用法 <style></style> 1.1 EVAL script numkeys key [key ...] arg [arg ...] numkeys 是key的个数,后边接着写key1 key2... val1 val2....,举例127.0.0.1:6379> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 val1 val2 1) "key1" 2) "key2" 3) "val1" 4) "val2"<style></style> 1.2 SCRIPT LOAD script 把脚本加载到脚本缓存中,返回SHA1校验和。但不会立马执行,举例127.0.0.1:6379> SCRIPT LOAD ...

Redis 集群 lua 实现【代码】

二话不说,直接上货.多多交流哈,谢谢各路大神..重点就是下面这段: Object object = redisTemplate.execute(redisUpdateOrderScript, //这里有key 要像官网说的那样加个"{}",不然就报错了,这里3个key都要前缀一致 Arrays.asList(hkey, amountKey, key), //值无要求 amount.longValueExact(),price.doubleValue(),price.doubleValue()); 我自己的理解是,执行脚本和执行hget 是一样的,只是lua脚本内容由Redis执行,但发送命令的要求是一...

使用RedisTemplate+Lua脚本实现Redis分布式锁

分布式锁一般有三种实现方式:1. 数据库乐观锁;2. 基于Redis的分布式锁;3. 基于ZooKeeper的分布式锁。本篇博客将介绍第二种方式,基于Redis实现分布式锁。首先,为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下四个条件:互斥性。在任意时刻,只有一个客户端能持有锁。 不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。 具有容错性。只要大部分的Redis节点正常运行,...

node.js怎么调用lua脚本操作redis

1、首先要知道redis是怎么eval lua 脚本的:eval "local cap=10 if(redis.call(ARGV[1],KEYS[1])+0 < cap) then return redis.call(INCR,KEYS[1]) end return cap" 1 test geteval 是命令 local cap=10 if(redis.call(ARGV[1],KEYS[1])+0 < cap) then return redis.call(INCR,KEYS[1]) end return cap 是 脚本 1 是你要跳过几个key名字test就是这个key名get就是参数要是要传俩key就是 2 key1 key2 然后就是参数 也可以跟多个-...

基于redis+lua实现高并发场景下的秒杀限流解决方案【图】

转自:https://blog.csdn.net/zzaric/article/details/80641786 应用场景如下: 公司内有多个业务系统,由于业务系统内有向用户发送消息的服务,所以通过统一消息系统对外暴露微服务接口供外部业务系统调用,所有公司内业务系统的消息(短信,APP,微信)推送都由统一消息系统去推送,短信推送需要走外部短信通道商去发送短信,APP和微信走内部系统的push服务器,但是不管是短信通道商还是内部push服务器都会有每秒上限的控制。在这假...

像调试java一样来调试Redis lua

高并发的系统中,redis的使用是非常频繁的,而lua脚本则更是锦上添花。因为lua脚本本身执行的时候是一个事务性的操作,不会掺杂其他外部的命令,所以很多关键的系统节点都会用redis+lua来实现一致性的操作请求。但是在实际开发过程中,由于redis lua脚本调试难的问题,导致大量的时间耗费在了这上面。如果有什么方案能够让我们像利用IDEA调试java一样简便去调试redis lua脚本,那该是很幸福的事儿了。 通过不断的寻找,终于也找到了...

欲求不满之 Redis Lua 脚本的执行原理【图】

Redis 提供了非常丰富的指令集,但是用户依然不满足,希望可以自定义扩充若干指令来完成一些特定领域的问题。Redis 为这样的用户场景提供了 lua 脚本支持,用户可以向服务器发送 lua 脚本来执行自定义动作,获取脚本的响应数据。Redis 服务器会单线程原子性执行 lua 脚本,保证 lua 脚本在处理的过程中不会被任意其它请求打断。图片比如在《Redis 深度历险》分布式锁小节,我们提到了 del_if_equals 伪指令,它可以将匹配 key 和删...

LUA 插入access数据库问题【代码】

下面的代码,就是把日期写到,ECU1里面去,结果一直报下面错:ERROR - insert into ECU1 (vin, Date) values(vin123456654321, 2018-09-28); ERROR - [Microsoft][ODBC Microsoft Access Driver] INSERT INTO 语句的语法错误。 luasql=require("luasql.odbc")IALogger = require("IALogger") local con = nillocal errstr = "" function insertDB(vin,judge, system) local env = luasql.odbc() local con = nil local err...

通过Nginx和lua实现对请求体的修改【代码】

Nginx+Lua实现对post请求参数的修改,json格式的 Nginx配置 location / { ...if ($request_method = "POST") { access_by_lua_file /xxx/xxx/test.lua;} }Lua配置 test.lua function set_Request_body()ngx.req.read_body()local retTable = {}local jsonStr = nillocal ok = nillocal json = require("cjson")local oldData = ngx.req.get_body_data() --获取原先的请求体,字符串格式if (oldData ~= nui...

通过lua将nginx请求状态码转变为自定义状态码【代码】

背景:安全组同学使用固定user-agent去扫描我们的网站,造成告警误报,需要将相关扫描资源的状态码修改,避免无效告警 思路:在nginx请求的header_filter_by_lua阶段,将请求状态码修改为自定义状态码 直接上代码,将以下代码写入配置文件xxx.lua,在相对应的域名下引用就可以了:header_filter_by_lua_file "xxx.lua"; local log_time = os.date("%Y-%m-%d %X",os.time()) local ngx_lua_ua_log = "/data/nginx/log/sec.lua.log" loc...

nginx lua阶段处理流程【图】

Nginx 的作者 Igor Sysoev 在公开场合曾不止一次地强调,Nginx 配置文件所使用的语言本质上是“声明性的”,而非“过程性的”(procedural)。 ngx_lua模块的原理: 1)、每个worker(工作进程)创建一个Lua VM,worker内所有协程共享VM;2)、将Nginx I/O原语封装后注入 Lua VM,允许Lua代码直接访问;3)、每个外部请求都由一个Lua协程处理,协程之间数据隔离;4)、Lua代码调用I/O操作等异步接口时,会挂起当前协程(并保护上下文...

Ubuntu 安装 lua【代码】

获取 lua 源码 可以到官网获取最新一份 curl -R -O http://www.lua.org/ftp/lua-5.3.3.tar.gz tar zxf lua-5.3.3.tar.gz编译安装 cd lua-5.3.3 make linux test遇到的报错 gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX -c -o lua.o lua.c lua.c:80:10: fatal error: readline/readline.h: No such file or directory80 | #include <readline/readline.h>| ^~~~~~~~~~~~~~~~~~~~~ compilation t...

nginx编译安装支持lua脚本【代码】

一、准备编译环境1、操作系统:CentOS7.6   2、安装编译所需安装包     yum install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel -y       gcc 编译环境       pcre是一个perl库,包括perl兼容的正则表达式库,nginx的http模块使用pcre来解析正则表达式。       zlib库提供了很多种压缩和解压缩方式,nginx使用zlib对http包的内容进行gzip。       openossl是一个开放源代码的软件库...

在Nginx使用Lua扩展功能

什么是LUALua从一开始就是作为一门方便嵌入(其它应用程序)并可扩展的轻量级脚本语言来设计的,因此她一直遵从着简单、小巧、可移植、快速的原则,官方实现完全采用ANSI C编写,能以C程序库的形式嵌入到宿主程序中。Lua脚本是一个很轻量级的脚本,也是号称性能最高的脚本,用在很多需要性能的地方,比如:游戏脚本,Nginx,Wireshark的脚本。什么是Nginx_Lua_ModuleNginx_Lua_Module是由淘宝的工程师清无(王晓哲)和春来(章亦春)所开...

lua os.execute() 在windows下 斜杠和反斜杠的坑【代码】

lua os.execute() 在windows下 斜杠和反斜杠的坑 首先: 了解一下 windows 和 unix 下的区别 windows下: 斜杠 / 代表调用参数, 反斜杠 \ 代表路径分隔符 unix 下: 斜杠 / 代表路径分隔符, 反斜杠 \ 代表转化参数 所以: 路径的表达,在 两个系统是相反的 然而: lua中用 os.execute(),用到路径时,不管是 windows 还是 unix 统一都用, 斜杠 / 做路径分隔符 windows 示例如下: // 斜杠用法 print(os.execute('mkdir "C:/test5/...

lua+nginx做代理请求时,返回非200状态码内容时会提示跨域【代码】

今天解决错误主要是跨域的问题,这个跨域在nginx上配置add_header什么的都不够,遇到非200的请求就会出现跨域问题,还得在lua上对后端服务器返回非200的请求添加跨域配置。 跨域问题详情可以参考这篇文章 前端产生的现象是: No Access-Control-Allow-Origin header is present on the requested resource. lua日志打印的如下: 2020/12/04 20:30:06 [error] 8643#0: *39 [lua] front_proxy.lua:119: do_request(): 开始请求,url:...

centos 编译lua【代码】

要编译的项目有三个:Lua, ToLua,lfs(luafilesystem) Lua编译 到网站https://www.lua.org/ftp/下载lua代码,github上的lua源码编译脚本不完善,很大的可能编译不成功,不想花时间研究的还是选择下载源码包吧,因要与tolua配合使用,之前使用的是5.3.5,这次还是下载5.3.5版解压代码,进入解压出来的目录,执行make linux,报错unkown <readline/readline.h>执行yum install readline-devel,安装readline库再次执行make linux执...

OpenResty入门之使用Lua开发Nginx插件【代码】【图】

记住一点:nginx配置文件很多坑来源自你的空格少了或多了。OpenResty OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。 OpenResty 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开...

高并发 Nginx+Lua OpenResty系列(2)——Nginx Lua API【代码】【图】

高并发 Nginx+Lua OpenResty系列(2)——Nginx Lua API https://www.cnblogs.com/babycomeon/p/11109500.html Nginx Lua API 和一般的Web Server类似,我们需要接收请求、处理并输出响应。而对于请求我们需要获取如请求参数、请求头、Body体等信息;而对于处理就是调用相应的Lua代码即可;输出响应需要进行响应状态码、响应头和响应内容体的输出。因此我们从如上几个点出发即可。 接收请求 1. openResty.conf配置文件 server {lis...

52_基于OpenResty部署应用层nginx以及nginx+lua开发hello world

我们这里玩儿nginx,全都会在nginx里去写lua脚本,因为我们需要自定义一些特殊的业务逻辑 比如说,流量分发,自己用lua去写分发的逻辑,在分发层nginx里去写的 再比如说,要用lua去写多级缓存架构存取的控制逻辑,在应用层nginx里去写的 后面还要做热点数据的自动降级机制,也是用lua脚本去写降级机制的,在分发层nginx里去写的 因为我们要用nginx+lua去开发,所以会选择用最流行的开源方案,就是用OpenResty nginx+lua打包在一起,...

OpenResty:Nginx与lua基础【图】

OpenResty 的两个基石:NGINX 和 LuaJIT。 在 OpenResty 的开发中,我们需要注意下面几点:要尽可能少地配置 nginx.conf; 避免使用if、set 、rewrite 等多个指令的配合; 能通过 Lua 代码解决的,就别用 NGINX 的配置、变量和模块来解决。这样可以最大限度地提高可读性、可维护性和可扩展性。 下面这段 NGINX 配置,就是一个典型的反例,可以说是把配置项当成了代码来使用,在使用 OpenResty 进行开发时需要避免。location ~ ...

17. Nginx与Lua开发【代码】

安装 Lua 和 Lua for nginx #安装lua yum install -y lua lua -v安装更高效的 Lua 语言解释器 LuaJIT wget http://luajit.org/download/LuaJIT-2.0.2.tar.gz tar -zxvf LuaJIT-2.0.2.tar.gz cd LuaJIT-2.0.2 make install PREFIX=/usr/local/LuaJIT/2.0.2 export LUAJIT_LIB=/usr/local/LuaJIT/2.0.2/lib export LUAJIT_INC=/usr/local/LuaJIT/2.0.2/include/luajit-2.0 echo "/usr/local/LuaJIT/2.0.2/lib" >> /etc/ld.so.conf ld...