nginx+lua+redis实现缓存总结

您所在的位置:网站首页 nginx缓存原理 nginx+lua+redis实现缓存总结

nginx+lua+redis实现缓存总结

2024-07-09 04:58:50| 来源: 网络整理| 查看: 265

场景: 对于一个网站首页,访问量一般是巨大的,如果每次用户请求访问都去请求服务器,服务器再查询数据库,当访问量巨大的时候,无疑对服务器和数据库产生巨大的压力,利用缓存机制就能有效减轻对数据库请求的压力

1.分析步骤

步骤一:缓存lua脚本实现缓存预热(将mysql里的数据查询出来存入redis) 在这里插入图片描述 步骤二:编写lua脚本实现二级缓存读取 在这里插入图片描述

2.OpenResty介绍

OpenResty由中国 人章亦春发起,提供了很多高质量的第三方模块。OpenResty 是一个强大的 Web 应用服务器,OpenResty可以快速构造出 足以胜任10K 乃至1000K以上并发连接响应的超高性能 Web 应用系统。 360,UPYUN,阿里云,新浪,腾讯网,去哪儿网,酷狗音乐等都是 OpenResty 的深度 用户。

简单理解:OpenResty 封装了ngnix 集成了lua脚本,为开发人员提供了模板实现了相关的逻辑 3.环境配置

1.在linux上安装nginx,lua,redis, 本案例指定nginx的配置文件根目录为root 权限为root 目的就是将来要使用lua脚本的时候 直接可以加载在root下的lua脚本。(lua脚本存放在root下)

修改/openresty/nginx/conf/nginx.conf,

#user nobody; 配置文件第一行原来为这样, 现改为下面的配置 user root root; 4.缓冲预热 4.1代码分析

需求:需要在页面上显示轮播图(有不同位置)的信息。 1.定义请求,用于查询数据库更新到redis

连接mysql,按照广告分类ID读取广告列表,转换json字符串连接redis,将广告列表json字符串存入redis

定义请求

请求/ad_update参数position(指定的广告位置)值json

2.在/root/lua目录下(配置了nginx加载的根目录)创建ad_load.lua,实现mysql查询数据并存储到redis

ngx.header.content_type="application/json;charset=utf8" local cjson = require("cjson") --引入模块 local mysql = require("resty.mysql") --引入mysql模块 local uri_args = ngx.req.get_uri_args() local position = uri_args["position"] --指定参数,position是广告的位置 local db = mysql:new() --初始化数据库 db:set_timeout(1000) --设置超时时间 local props = { host = "192.168.xxx.xxx", --mysql ip地址 port = 3306, --mysql 端口 database = "changgou_business", --mysql 数据库 user = "root", password = "root" --用户名密码 } local res = db:connect(props) --获得mysql连接 local select_sql = "select url,image from tb_ad where status ='1' and position='"..position.."' and start_time= NOW()" --一条查询语句 res = db:query(select_sql) db:close() --执行 local redis = require("resty.redis") --引入redis local red = redis:new() red:set_timeout(2000) --初始化 设置超时时间 local ip ="192.168.200.128" local port = 6379 red:connect(ip,port) red:set("ad_"..position,cjson.encode(res)) --存储到redis ..为拼接符 key:ad_广告位置 value:json串 red:close() ngx.say("{flag:true}")

修改openresty/nginx/conf/nginx.conf

#user nobody; user root root; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet‐stream; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost; charset utf‐8; #access_log logs/host.access.log main; # 添加 location /ad_update { content_by_lua_file /root/lua/ad_update.lua; } # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }

3.最后重启 nginx 在sbin目录下 ./nginx -s reload

小结

预热缓存的具体过程,首先定义好一条请求,访问nginx,会查询数据库,然后返回给ngnix, 存入到redis.具体nginx会执行lua脚本中的脚本,先引入数据库模块,再配置数据库信息获得连接, 执行sql语句,再引入redis模块,配置信息,存储到redis中,当然需要在nginx的配置文件中配置好请求路径需要执行的lua脚本 5.轮播图缓存读取

实现思路: 通过lua脚本直接从redis中获取数据即可 1.定义请求

请求:/ad_read 参数:position 返回值:json

2.在/root/lua目录下创建ad_read.lua

ngx.header.content_type="application/json;charset=utf8" local uri_args = ngx.req.get_uri_args(); local position = uri_args["position"]; local redis = require("resty.redis"); local red = redis:new() red:set_timeout(2000) local ok, err = red:connect("192.168.200.128", 6379) local rescontent=red:get("ad_"..position) ngx.say(rescontent) red:close()

在/usr/local/openresty/nginx/conf/nginx.conf中server下添加配置

location /ad_read { content_by_lua_file /root/lua/ad_read.lua; }

小结:

定义一个查询请求, 在nginx配置文件中配置请求路径需要执行的lua脚本, 在/root/lua中目录,在lua脚本中引入redis,配置信息,参数作为key查询数据 6.二级缓存

当请求都到redis中,redis压力也会很大,一般采取多级缓存,减少下游服务器压力,

先查询openresty本地缓存,如果没有再查询redis中的数据

openresty本地缓存的操作

1.修改/root/lua目录下ad_read.lua文件

ngx.header.content_type="application/json;charset=utf8" local uri_args = ngx.req.get_uri_args(); local position = uri_args["position"]; local cache_ngx = ngx.shared.dis_cache; local adCache = cache_ngx:get('ad_cache_'..position); if adCache == "" or adCache == nil then local redis = require("resty.redis"); local red = redis:new() red:set_timeout(2000) local ok, err = red:connect("192.168.200.128", 6379) local rescontent=red:get("ad_"..position) ngx.say(rescontent) red:close() cache_ngx:set('ad_cache_'..position, rescontent, 10*60); else ngx.say(adCache) end

说明:ngx.shared.dis_cache;表示开启本地缓存,在本地缓存中没有数据就会查询redis,如果有就直接放回

2.修改nginx配置文件vi /usr/local/openresty/nginx/conf/nginx.conf ,http节点下添加配置:

#包含redis初始化模块 lua_shared_dict dis_cache 5m; #共享内存开启

说明:该配置是指开启内存

小结

实现本地缓存,是为了减轻redis的压力,配置了每10分钟会去redis进行数据同步,实现本地缓存, 首先在本地缓存中查找数据,没有就去查询redis,有就直接返回


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭