zoukankan      html  css  js  c++  java
  • 缓存预热的实现

    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。

    image-20201119223227931

    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:
    image-20201120000015735

    安装nginx
    默认已经安装好了nginx,在目录:/usr/local/openresty/nginx 下。
    修改/usr/local/openresty/nginx/conf/nginx.conf ,将配置文件使用的根设置为root,目的就是将来要使用lua脚本的时候 ,直接可以加载在root下的lua脚本。

    image-20201119235251074

    image-20201119235423092
    实现思路:
    定义请求:用于查询数据库中的数据更新到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文件:
    代码如下:

    image-20201119235558094

    测试,发送请求:

    image-20201119235624588

    image-20201119235636877

    image-20201119235647232

  • 相关阅读:
    Median Value
    237. Delete Node in a Linked List
    206. Reverse Linked List
    160. Intersection of Two Linked Lists
    83. Remove Duplicates from Sorted List
    21. Merge Two Sorted Lists
    477. Total Hamming Distance
    421. Maximum XOR of Two Numbers in an Array
    397. Integer Replacement
    318. Maximum Product of Word Lengths
  • 原文地址:https://www.cnblogs.com/dalianpai/p/14008752.html
Copyright © 2011-2022 走看看