缓存预热的实现
lua是什么
Lua 是一个小巧的脚本语言。它是巴西里约热内卢天主教大学( Pontifical CatholicUniversity of Rio de Janeiro)里的一个由Roberto Ierusalimschy、Waldemar Celes 和Luiz Henrique de Figueiredo三人所组成的研究小组于1993年开发的。 其设计目的是为了通过灵活嵌入应用程序中从而为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。Lua并没有提供强大的库,这是由它的定位决定的。所以Lua不适合作为开发独立应用程序的语言。Lua 有一个同时进行的JIT项目,提供在特定平台上的即时编译功能。
简单来说:
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
lua 语言具有以下特性
-
支持面向过程 (procedure-oriented)编程和函数式编程(functional programming);
-
自动内存管理;只提供了一种通用类型的表( table),用它可以实现数组,哈希表,集合,对象;
-
语言内置模式匹配;闭包 (closure);函数也可以看做一个值;提供多线程(协同进程,并非操作系统所支持的线程)支持;
-
通过闭包和 table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等。
应用场景
游戏开发
独立应用脚本
Web 应用脚本
扩展和数据库插件如: MySQL Proxy 和 MySQL WorkBench
安全系统,如入侵检测系统
redis 中嵌套调用实现类似事务的功能
web 容器中应用处理一些过滤 缓存等等的逻辑,例如nginx。
lua的安装
有linux版本的安装也有mac版本的安装。。我们采用linux版本的安装,首先我们准备一个linux虚拟机。
安装步骤,在linux系统中执行下面的命令。
yum install ‐y gcc
yum install libtermcap‐devel ncurses‐devel libevent‐devel readline‐devel
curl ‐R ‐O http://www.lua.org/ftp/lua‐5.3.5.tar.gz
tar ‐zxf lua‐5.3.5.tar.gz
cd lua‐5.3.5
make linux test
make install
我之前也简单的写过lua的博客,常用的语法,有兴趣的可以看看。
OpenResty介绍
OpenResty(又称:ngx_openresty) 是一个基于 NGINX 的可伸缩的 Web 平台,由中国人章亦春发起,提供了很多高质量的第三方模块。
OpenResty 是一个强大的 Web 应用服务器,Web 开发人员可以使用 Lua 脚本语言调动Nginx 支持的各种 C 以及 Lua 模块,更主要的是在性能方面,OpenResty可以 快速构造出足以胜任 10K 乃至1000K以上并发连接响应的超高性能 Web 应用系统。360,UPYUN,阿里云,新浪,腾讯网,去哪儿网,酷狗音乐等都是 OpenResty 的深度用户。
OpenResty 简单理解,就相当于封装了nginx,并且集成了LUA脚本,开发人员只需要简单的其提供了模块就可以实现相关的逻辑,而不再像之前,还需要在nginx中自己编写lua的脚本,再进行调用了。
OpenResty安装
linux安装openresty:
安装nginx
默认已经安装好了nginx,在目录:/usr/local/openresty/nginx 下。
修改/usr/local/openresty/nginx/conf/nginx.conf ,将配置文件使用的根设置为root,目的就是将来要使用lua脚本的时候 ,直接可以加载在root下的lua脚本。
实现思路:
定义请求:用于查询数据库中的数据更新到redis中。
(1)连接mysql ,按照广告分类ID读取广告列表,转换为json字符串。
(2)连接redis,将广告列表json字符串存入redis 。
在/root/lua目录下创建ad_load.lua ,实现连接mysql 查询数据 并存储到redis中
[root@localhost ~]# cat /root/lua/ad_load.lua
ngx.header.content_type="application/json;charset=utf8"
local cjson = require("cjson")
local mysql = require("resty.mysql")
local uri_args = ngx.req.get_uri_args()
local user_id = uri_args["user_id"]
local db = mysql:new()
db:set_timeout(1000)
local props = {
host = "192.168.1.104",
port = 3306,
database = "user_db",
user = "root",
password = "root"
}
local res = db:connect(props)
local select_sql = "select * from t_user where user_id="..user_id
res = db:query(select_sql)
db:close()
local redis = require("resty.redis")
local red = redis:new()
red:set_timeout(2000)
local ip ="192.168.1.104"
local port = 6379
red:connect(ip,port)
red:set("id_"..user_id,cjson.encode(res))
red:close()
ngx.say("{\"flag\":true,\"user_id\":\""..user_id.."\"}")
[root@localhost ~]#
修改/usr/local/openresty/nginx/conf/nginx.conf文件:
代码如下:
测试,发送请求: