openresty nginx+lua

  

处理参数接口

复制代码
location /getNameByGender {
  default_type '';
  add_header Content-Type 'text/html; charset=utf-8';
  # default_type 'text/html';
  # charset utf-8;
  set_by_lua $string "
    -- get uri_args
    local uri_args=ngx.req.get_uri_args();
    local name=uri_args.name;
    local gender=uri_args['gender'];
    if gender=='1' then
      return name..'mister 范德萨';
    elseif gender=='0' then
      return name..'mistress 放到';
    else
      return name;
    end
  ";
  header_filter_by_lua "
    -- ccc必须使用引号,因为是在luajit中
    ngx.header.bbb='ccc'
  ";
  return 202 $string;
}
复制代码

 

 

中文会产生乱码, Content-Type 跟上 charset=utf-8 OR 加入配置 charset utf-8;

add_header Content-Type会覆盖charset utf-8;

charset utf-8;必须与default_type配合

 

 

操作redis

复制代码
location /redis {
  default_type 'text/plain';
  resolver 192.168.8.1;
  content_by_lua_block {
    local redis=require 'resty.redis'  -- import redis module
    local obj=redis:new()
    obj:set_timeout(1000)  -- ms
    local res,err=obj:connect('ram2.concerto.com',6379)
    if not res then
      ngx.say('failed to connect redis, ',err)
      return
    end
    res,err=obj:set('username','adorn')  -- 存入数据
    if not res then
      ngx.say('failed to set username')
      return
    end
    local res,err=obj:get('username')  -- read data from redis
    if not res then
      ngx.say('failed to read username from redis')
      return
    end
    ngx.say(res)
    obj:close()
  }
}
复制代码

 

 

操作mysql

 

SQL

复制代码
create database nginx;

use nginx;

create table users(
   id int primary key auto_increment,
   username varchar(30),
   birthday date,
   salary double
);

insert into users(id,username,birthday,salary) values(null,"TOM","1988-11-11",10000.0);
insert into users(id,username,birthday,salary) values(null,"JERRY","1989-11-11",20000.0);
insert into users(id,username,birthday,salary) values(null,"ROWS","1990-11-11",30000.0);
insert into users(id,username,birthday,salary) values(null,"LUCY","1991-11-11",40000.0);
insert into users(id,username,birthday,salary) values(null,"JACK","1992-11-11",50000.0);
复制代码

 

lua

复制代码
location /mysql {
  add_header content-type 'text/plain';
  resolver 192.168.8.1;
  content_by_lua_block {
    local mysql=require 'resty.mysql';
    local db=mysql:new();
    local res,err=db:connect {
      host='ram2.concerto.com',
      port=3306,
      user='root',
      password='aegean',
      database='nginx'
    };
    if not res then
      ngx.say('failed to connect mysql, ',err);
      return;
    end
    db:set_timeout(1000);
    db:send_query('select * from users where id=1');
    local res,err,errcode,sqlstate=db:read_result();
    if not res then
      ngx.say('res is empty, ',err);
      return
    end
    ngx.say(res[1].id..','..res[1].username..','..res[1].birthday..','..res[1].salary);
    db:close();
  }
}
复制代码

 

cjson 返回json

复制代码
location /mysql {
  add_header content-type 'text/plain';
  resolver 192.168.8.1;
  content_by_lua_block {
    local mysql=require 'resty.mysql';
    local cjson=require 'cjson';
    local db=mysql:new();
    local res,err=db:connect {
      host='ram2.concerto.com',
      port=3306,
      user='root',
      password='aegean',
      database='nginx'
    };
    if not res then
      ngx.say('failed to connect mysql, ',err);
      return;
    end
    db:set_timeout(1000);
    --db:send_query('select * from users where id=1');
    db:send_query('select * from users');
    local res,err,errcode,sqlstate=db:read_result();
    if not res then
      ngx.say('res is empty, ',err);
      return
    end
    ngx.say(cjson.encode(res));
    for i,v in ipairs(res) do
      ngx.say(v.id..','..v.username..','..v.birthday..','..v.salary);
    end
    db:close();
  }
}
复制代码

 

 

CRUD

复制代码
location /mysql {
  add_header content-type 'text/plain';
  resolver 192.168.8.1;
  content_by_lua_block {
    local mysql=require 'resty.mysql';
    local cjson=require 'cjson';
    local db=mysql:new();
    local res,err=db:connect {
      host='192.168.8.1',
      port=3306,
      user='b',
      password='b',
      database='nginx',
      max_packet_size=1024,
      compact_arrays=false
    };
    if not res then
      ngx.say('failed to connect mysql, ',err);
      return;
    end
    db:set_timeout(1000);
    local res,err,errcode,sqlstate=db:query("insert into users (id,username,birthday,salary) values (null, 'adorn', '2022-1-22', 12311)"); --insert
    local res,err,errcode,sqlstate=db:query('update users set username="vvbb" where id=2')  --update
    local res,err,errcode,sqlstate=db:query('delete from users where id=3');  --delete
    local res,err,errcode,sqlstate=db:query('select * from users');
    if not res then
      ngx.say('res is empty, ',err);
      return
    end
    ngx.say(cjson.encode(res));
    for i,v in ipairs(res) do
      ngx.say(v.id..','..v.username..','..v.birthday..','..v.salary);
    end
    db:close();
  }
}
复制代码

 

 

使用ngx_lua模块完成Redis缓存预热。

分析:

(1)先得有一张表(users)

(2)浏览器输入如下地址

 http://191.168.200.133?username=TOM

(3)从表中查询出符合条件的记录,此时获取的结果为table类型

(4)使用cjson将table数据转换成json字符串

(5)将查询的结果数据存入Redis中

 

复制代码
init_by_lua_block {  # location http
  redis=require 'resty.redis'
  mysql=require 'resty.mysql'
  cjson=require 'cjson'
}

location /cache {
  default_type 'text/html';
  resolver 192.168.8.1;

  content_by_lua_block {
    -- acquire request arg username
    local param=ngx.req.get_uri_args()['username']
    local db=mysql:new()
    local res,err=db:connect {
      host='192.168.8.1',
      port=3306,
      user='root',
      password='aegean',
      database='nginx'
    }
    if not res then
      ngx.say('failed connect mysql: ',err)
      return
    end

    db:set_timeout(1000)
    local sql=''
    if not param then
      sql='select * from users'
    else
      sql='select * from users where username='..'"'..param..'"'
    end

    local res,err,errcode,sqlstate=db:query(sql)
    if not res then
      ngx.say('failed to query from mysql: ',err)
    end

    local obj=redis:new()
    result,err=obj:connect('ram2.concerto.com',6379)
    if not result then
      ngx.say('failed to connect to redis: ',err)
      return
    end
    obj:set_timeout(1000)

    for i,v in ipairs(res) do
      obj:set("user_"..v.username,cjson.encode(v))
    end
    ngx.say(cjson.encode(res))
    obj:close()
    db:close()
  }
}
复制代码

 

posted @   ascertain  阅读(40)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2020-10-08 python-----craftsmanship
2020-10-08 异常处理
2020-10-08 python 索引技巧
2020-10-08 property装饰器的实现 & 描述器的深入思考
2020-10-08 DoubleLinkedList双向链表容器化
点击右上角即可分享
微信分享提示