美文网首页我爱编程
Nginx+Lua+Redis实现高性能缓存数据读取

Nginx+Lua+Redis实现高性能缓存数据读取

作者: 码农老K | 来源:发表于2017-10-31 22:16 被阅读0次

不采用lua之前,我们从redis获取数据的路径与采用lua之后获取数据的路径对比,明显可以看出效率的提升。

安装OpenResty

参考官方给出的yum安装步骤,各种系统均有支持,也可采用源码安装的形式,安装完成后默认路径是/usr/local/openresty,新版本的OpenResty自带Redis操作模块,所以无须我们自己重新安装。

配置nginx

在http模块下面增加如下配置

lua_package_path "/usr/local/openresty/lualib/?.lua;;"; #lua 模块

lua_package_cpath "/usr/local/openresty/lualib/?.so;;"; #c模块

为更好的配置lua配置,独立lua.conf文件,不与nginx.conf搅合一起, lua.con文件中配置如下:

#lua.conf

server {

listen 80;

server_name _;

}

在nginx.conf文件中http模块将其引入

include lua.conf;

简单测试

编写简单的lua脚本文件test.lua,存储目录位于conf/lua下面

ngx.say("hello lua world");

修改lua.conf

location /lua {

default_type 'text/html';

lua_code_cache off;

content_by_lua_file conf/lua/test.lua;

}

测试配置是否正确

./nginx -t #检测配置文件是否正确 , 显示如下日志即表示成功

nginx: [alert] lua_code_cache is off; this will hurt performance in /usr/local/nginx/conf/lua.conf:7nginx: [alert] lua_code_cache is off; this will hurt performance in /usr/local/nginx/conf/lua.conf:13nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is oknginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

在浏览器输入//192.168.1.105/lua,页面正常输出“hello lua world ”

支持JSON

脚本地址//lua-users.org/wiki/JsonModules

正常的获取string类型值没有问题,在我们获取json格式的key值就需要JSON的支持才能正常显示。下载脚本将其放置在/usr/local/openresty/lualib目录下面,以便在lua脚本中引用

获取redis数据

编写连接redis的测试脚本,并从redis中获取指定key的值。脚本内容如下:

local redis = require("resty.redis")

local json = require ("dkjson")

--创建实例

local redis_instance = redis:new()

--设置超时(毫秒)

redis_instance:set_timeout(3000)

--建立连接

local host = "127.0.0.1"

local port = 6679

local ok, err = redis_instance:connect(host, port)

if not ok then

ngx.say("connect to redis error : ", err)

return close_redis(redis_instance)

end

local resp, err = redis_instance:eval("return redis.call('get', KEYS[1])", 1, "alibaba");

ngx.say("redis data = ",resp);

ngx.say("redis data = ",resp); ngx.say("json data = ",json.encode(resp))

--正常情况理应有关闭redis,这里仅简单测试下,未做关闭

配置lua.conf,内容如下

location /lua_redis_test {

default_type 'text/html';

lua_code_cache off;

content_by_lua_file /usr/local/nginx/conf/lua/json_test.lua;

}

向redis中写入alibaba键的值,这里使用jedis简单写入即可

Jedis redis = new Jedis("192.168.1.105", 6679);

JSONObject object = new JSONObject();

object.put("aaaa", 123);

object.put("bbbbb", 23234);

redis.set("alibaba", object.toString());

测试配置无误后,重启nginx。浏览器输入//192.168.1.105/lua_redis_test,应当输出redis中alibaba键的值。

redis data = {"aaaa":123,"bbbbb":23234}json data = "{"aaaa":123,"bbbbb":23234}

至此基于nginx,通过lua脚本即可简单从redis获取数据,大大提高的数据请求响应的效率。

扩展阅读

在github中发现有很多实用的lua插件,比如lua-resty-limit-traffic、lua-resty-jwt、lua-resty-kafka等等,有场景的时候确实可以考虑一下。

相关文章

  • Nginx+Lua+Redis实现高性能缓存数据读取

    不采用lua之前,我们从redis获取数据的路径与采用lua之后获取数据的路径对比,明显可以看出效率的提升。 安装...

  • 面试题之redis篇

    为什么要用redis?高性能 从数据库读取是从硬盘上读取,操作缓存直接操作内存中读取,速度快高并发 缓存的请求...

  • Android 本地缓存ACache的简单使用和工具类

    设置缓存数据: 获取缓存数据: 举个栗子? 存数据 读取数据:判断当下缓存是否为空,若是则不再读取,否则读取数据

  • Spring Boot集成cache

    缓存简介 工作机制是:先从缓存中读取数据,如果没有再从慢速设备上读取实际数据(数据也会存入缓存);缓存什么:那些经...

  • 链表(上):如何实现LRU缓存淘汰算法?

    链表(上):如何实现LRU缓存淘汰算法? 我们都知道缓存可以提高数据读取的性能,但是缓存的大小有限,当缓存被填满时...

  • Spring Cache

    缓存理解 让数据更接近使用者 基本机制:先从缓存中读取数据,如果没有再从慢速设备上读取实际数据(数据也会存入缓存)...

  • Spring 缓存框架

    缓存是让数据更接近于使用者;工作机制是先从缓存中读取数据,如果没有再从慢速设备上读取实际数据(数据也会存入缓存);...

  • 亿级流量网站架构核心技术【笔记】(二)

    九、应用级缓存 A.缓存简介 1.先从缓存中读取数据,如果没有,再从慢速设备上读取实际数据并同步到缓存 2.经常读...

  • Redis基本使用

    Redis数据库 Redis 是一个高性能的key-value数据库 主要用Redis实现缓存数据的存储,可以设置...

  • Redis作用

    Redis数据库Redis 是一个高性能的key-value数据库。主要用Redis实现缓存数据的存储,可以设置过...

网友评论

    本文标题:Nginx+Lua+Redis实现高性能缓存数据读取

    本文链接:https://www.haomeiwen.com/subject/cqmipxtx.html