暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Nginx+Lua 从Nginx和Redis缓存获取数据案例 详解

猿人课堂 2018-05-20
1194

在 Nginx、Redis、Ehcache 三级缓存中,Nginx 分发层 和 应用层。在分发层 Nginx,通过 Lua,将商品id、商品店铺id,都转发到后端的应用nginx


可以通过 Nginx 指令重新加载所有配置包括 Lua 脚本


1> 应用 Nginx 的 Lua脚本接收到请求

2> 获取请求参数中的商品id,以及商品店铺id

3> 根据 商品id 和 商品店铺id,在 Nginx 本地缓存中尝试获取数据

4> 如果在 Nginx本地缓存中没有获取到数据,那么就到 Redis分布式缓存中获取数据,如果获取到数据,还要设置到 Nginx本地缓存中


这里有个问题,建议不要用 Nginx+Lua 直接去获取 Redis数据,因为 OpenResty 没有太好的 redis cluster 的支持包,所以建议是发送http请求到缓存数据生产服务,由该服务提供一个 http接口。缓存数生产服务可以基于 redis cluster api 从 Redis 中直接获取数据,并返回给 Nginx。


在 OpenResty 编译文件中,引入 lua http lib包(一个网络请求的库)

GitHub访问地址 : https://github.com/pintsized/lua-resty-http



5> 如果缓存数据生产服务没有在 Redis分布式缓存中没有获取到数据,那么就在本地 Ehcache 中获取数据,返回数据给 Nginx,也要设置到 Nginx本地缓存中

6> 如果 Ehcache 本地缓存都没有数据,那么就需要去原始的服务中拉去数据,该服务会从 MySQL 中查询,拉去到数据之后,返回给 Nginx,并重新设置到 Ehcache和 Rdis 中

注 : 这里存在一个问题,那就是分布式缓存重建并发冲突问题

7> Nginx 最终利用获取到的数据,动态渲染网页模板

在 OpenResty 编译文件中,引入lua-resty-template库

GitHub 访问地址 : https://github.com/bungle/lua-resty-template



在 lua.conf 也就是 Nginx 配置中引入的配置文件,在该文件的 server 标签中配置模板位置


创建产品 HTML 模板



8> 将渲染后的网页模板作为 http 响应,返回给 分发层Nginx

修改 Lua 缓存大小


添加产品访问监控,并设置产品 Lua 脚本

第一次访问的时候,其实在 Nginx本地缓存中是取不到的,所以会发送 http请求到后端的缓存服务里去获取,会从 Redis 中获取。拿到数据以后,会放到 Nginx 本地缓存里面去,过期时间是 10分钟,然后将所有数据渲染到模板中,返回模板,以后再来访问的时候,就会直接从 Nginx本地缓存区获取数据 :

缓存数据生产 -> 有数据变更 -> 主动更新两级缓存(ehcache+redis) -> 缓存维度化拆分

分发层Nginx + 应用层Nginx -> 自定义流量分发策略提高缓存命中率

nginx shared dict缓存 -> 缓存服务 -> redis -> ehcache -> 渲染html模板 -> 返回页面


还差最后一个很关键的要点,就是如果数据在 nginx -> redis -> ehcache 三级缓存都不在,可能就是数据通过 LRU 算法给清理掉了,这个时候缓存服务会重新拉去数据,去更新到 ehcache 和 redis中,这里存在 分布式的缓存重建的并发问题,这个问题可以通过分布式锁解决 


文章转载自猿人课堂,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论