Nginx+Redis 搭建高性能缓存利器
一. OpenResty
OpenResty是一个根据 Nginx与 Lua的高性能 Web渠道,其内部集成了大量精良的 Lua库、第三方模块以及大多数的依赖项。用于方便地建立可以处理超高并发、扩展性极高的动态Web 运用、Web 服务和动态网关。
接入层缓存技能便是运用OpenResty的技能用Lua言语进行二次开发。
二.Nginx +redis
下图左面是常用的架构,http恳求经过nginx负载均衡转发到tomcat,tomcat再从redis读取数据,整个链路过程是串行的,当tomcat挂掉或者tomcat线程数被消耗完,就无法正常回来数据。
运用OpenResty的lua-resty-redis模块使nginx具备直接访问redis的才能,不占用tomcat线程,Tomcat暂时挂掉仍可正常处理恳求,减少呼应时长,进步体系并发才能。
三.紧缩减少带宽
数据大于1K,nginx紧缩再保存到redis:
- 进步redis的读取速度
- 减少带宽的占用
紧缩会消耗cpu时刻,小于1K的数据不紧缩tps更高。
OpenResty并没有提供redis连接池的完成,需求自己用lua完成redis的连接池,在网上已有完成的比方http://wiki.jikexueyuan.com/project/openresty/redis/out_package.html,直接参照运用。
Redis的value值用json格局保存{length:xxx,content:yyy},content是紧缩后的页面内容,length是content紧缩前的巨细,length字段是为了在读取redis时,根据length的巨细来判别是否要解紧缩content的数据。
运用lua-zlib库进行紧缩。
四. 守时更新
按下图第1和第2步守时执行,nginx lua守时器守时恳求tomcat页面的url,回来的页面html保存在redis。
缓存有效期可设置长些,比方1个小时,可确保1个小时内tomcat挂掉,仍可运用缓存数据回来,缓存的守时更新时刻可设置短些,比方1分钟,确保缓存快速更新
五.恳求转发
浏览器翻开页面:
- nginx先从redis获取页面html
- redis不存在数据时,从tomcat获取页面,一起更新redis
- 回来页面HTML给浏览器
六. 单进程守时更新
Nginx的一切worker进程都可以处理前端恳求转发到redis,只要nginx worker 0才运转守时使命守时更新redis,lua脚本中经过ngx.worker.id()获取worker进程编号。
七 . 可装备化
经过办理后台装备需求缓存的URL,可装备缓存URL、缓存有效期、守时更新时刻,比方modify?url=index&&expire=3600000&&intervaltime=300000&sign=xxxx,sign的值是办理后台secretkey对modify?url=index&&expire=3600000&&intervaltime=300000签名运算得到的,nginx端用相同的secretkey对modify?url=index&&expire=3600000&&intervaltime=300000签名运算,得到的值与sign的值相同则鉴权经过,允许修正nginx的装备。
我有话说: