版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
OpenResty基于shareddict,你可以实现多个worker之间的缓存和通信,以及限流限速流量统计等功能。你可以把shareddictRedisshareddict在编写OpenRestyLua代码的过程中,你不可避免地会遇到,在一个请求的不同阶段、不同worker之间共享数据的情况,还可能需要在Lua和C代码之间共享数据。所以,在正式介绍shareddict的API之前,先让我们了解一下,OpenResty第一种是Nginx中的变量。它可以在NginxC模块之间共享数据,自然的,也可以在C模块和OpenResty提供的lua-nginx-module之间共享数据,比如下面这段代码:location/fooset$myvar'';#thislineisrequiredtocontentbyluablockngx.var.my_var= 不过,使用Nginx变量这种方式来共享数据是比较慢的,因为它涉及到hash查找和内存分配。同时,这种方法有其局限性,只能用来字符串,不能支持复杂的Lua类型。 个普通的Lua的table,所以速度很快,还可以各种Lua的对象。它的生命周期是请求级别的,当一个请求结束的时候,ngx.ctx也会跟着被销毁 个典型的使用场景,我们用ngx.ctx来缓存Nginx变量这种昂贵的调用,并在不同阶段都可以使用到它location/testrewrite_by_lua_blockngx.ctx.host=4}5accessbyluablock6if 7ngx.ctx.host= 89}{}}这时,如果你使用curl的话curl-i127.0.0.1:8080/test-H ,可以表明ngx.ctx的确是在不同子,保存table等更复杂的对象,而非简单的字符串,看看不过,这里需要特别注意的是,正因为ngx.ctx的生命周如,我在foo.lualocalngx_ctx=2localfunctionngx_ctx.host= localngx=2localfunctionngx_ctx.host= 接着往下看,第三种方法是使用模块级别的变量,在同一个worker内的所有请求之间共享数据。跟前面的Nginx变量和ngx.ctx不一样,这种方法有些不太好理解。不过别着么是模块级别的变量:--local_M=3localdata=dog=cat=pig= 9functionreturn return在nginx.conflocation/luacontent_by_lua_blocklocalmydata=require 在这个示例中,mydata就是一个模块,它只会被worker进程加载一次,之后,这个worker处理的所有请求,都会共享mydata模块的代码和数据。变量,它位于模块的toplevel,也就是模块最开始的位所以,你可以把需要在请求间共享的数据,放在模块的toplevel心了,因为可能会有racecondition,这是非常难以定位的bug。--local_M=3localdata=dog=cat=pig= 9functiondata[name]=data[name]+return return在模块中,我们增加了incrage这个函数, ngx.sleep(5),这个sleep是一个yield操作:location/luacontent_by_lua_blocklocalmydata=requirengx.say(mydata.ngx.sleep(5)--yieldngx.say(mydata. 如果没有这行sleep代码(也可以是其他的非阻塞IO操作,比如Redis等),就不有yield操作,也就不sleep5也很可能就有其他请求调用了mydataincr_age函数,道,在实际的代码中,逻辑不会这么简单,bug所以,除非你很确定这中间没有yield操作,不会把控制权交给Nginx循环,否则,我建议你还是保持对模块级第四种,也是最后法,用shareddict来共享数据,这些数据可以在多个worker之间共享。这种方法是基于树实现的,性能很好,但也有自己的局限性——你必须事先在Nginx的配置文件中,共享内lua_shared_dictdogsshareddictLua数据类型。这也就意味着,当我需要存放table等复杂的数据类型时,我将不得不使用json或者其他的方法,来序能纳闷儿:它们看上去和shareddict没有直接关系,是不事实并非如此,你可以自己想一下,为什么OpenResty中要有shareddict的存在呢?在请求级别,或者单个worker级别。所以,在当前的OpenRestyshareddictworkerworker技术之间的差异和优势,远比你只会熟练调用它提供的API回到共享字典本身,它对外提供了20多个LuaAPI,不过所有的这些API都是原子操作,你不用担心多个worker和这些API都有详细的文档,我就不再一一赘述了。这里再强调一下,任何技术课程的学习,都不能代替对继续看shareddict的API,这些API可以分为下面三个大首先来看字典读写类。在最初的版本中,只有字典读写类的API,它们也是共享字典最常用的功能。下面是一个最简单的示例:$resty--shdict='dogs1m'-e'localdict=dict:set("Tom",除了set外,OpenResty还提供了safe_set、add、safe_add、rece这四种写入的方法。这里safe前缀的含义是,在内存占满的情况下,不根据LRU淘汰旧的数据,而是写入失败并返回nomemory的错误信息。除了get外,OpenResty还提供了get_stale的数据的方法,相比get方法,它多了一个过期数据的返回value,flags,stale=deletekeyset(key,nil)是等价的。了和Redistypedefstructngx_queue_tuint32_tuint8_tu_char}APIPR5API,在文档中并没有对应的代码示145-shdict-list.t这个文件1===TEST1:lpush&lua_shared_dictdogslocation=/testcontent_by_lua_blocklocaldogs=8locallen,err=dogs:lpush("foo",iflenngx.say("pushngx.say("pusherr:",localval,err=ngx.say(val,"",localval,err=ngx.say(val,"",localval,err=ngx.say(val,"",localval,err=ngx.say(val,"", GETpush1bar0nil最后要说的管理类API也是后续新增的,属于社区呼声比较比如,用户申请了100M的空间作为shareddict,那么这100M是否够用呢?里面存放了多少key?具体是哪些key对于这类问题,OpenResty的态度,是希望用户使用火是提供侵入式的API来直接返回结果。但站在使用者友好角度来考虑,这些管理类API还是非常有首先是get_keys(max_count?),它默认也只返回前1024keymax_count0,那就返回所有key。 _space,这两个API都属lua-resty-corerequirerequire2localcats=localcapacity_bytes=local_page_bytes=cats:它们分别返回的,是共享内存的大小(也就是lua_shared_dict中配置的大小)和空闲页的字节数。因为shareddict是按照页来分配的,即使_space返回为0,在的项目中也有对缓存的封装。你能找出来是哪几个项吗?或者你知道一些其他缓存封装的lua-resty库吗? 售卖。页面已增加防盗追踪,上一 17|为什么能成为更好的Web服务器?动态处理请求下一 19|OpenResty的和精髓localngx=localfunctionbar()ngx_ctx.host
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026广东阳江市江城区百越企业管理有限公司招聘3人备考题库及答案详解(必刷)
- 2026年3月浙江嘉兴市海盐县公益性岗位招聘2人备考题库(第三批)含答案详解(考试直接用)
- 2026浙江南湖文化旅游集团有限公司招聘备考题库附答案详解(满分必刷)
- 牛津译林版英语八上《Unit 4 Wild animals》教案
- 2026北京积水潭医院贵州医院高层次人才引进58人备考题库含答案详解(综合题)
- 2026福建福州市第二总医院妇幼保健院自主招聘8人备考题库及完整答案详解一套
- 2026福建厦门工学院制造产线智能优化与控制重点实验室主任招聘1人备考题库含答案详解(夺分金卷)
- 2026广东广州天河区金穗幼儿园招聘编外聘用制专任教师2人备考题库及答案详解(网校专用)
- 2026上海音乐学院虹口区北虹高级中学招聘教师备考题库附答案详解(精练)
- 2026桂林恭城宏源投资集团有限公司招聘1人备考题库及答案详解(夺冠系列)
- 固井质量测井原理
- 五星级酒店客房配置设计要求
- 2023年江西环境工程职业学院高职单招(数学)试题库含答案解析
- GB/T 1420-2015海绵钯
- 《物理(下册)》教学课件-第六章-光现象及其应用
- 焊接技能综合实训-模块六课件
- 苯氨基与硝基化合物中毒
- 下睑内翻、倒睫患者的护理课件
- 联苯二氯苄生产工艺及产排污分析
- 子宫肌瘤中药方
- SPG-12SF6负荷开关说明书
评论
0/150
提交评论