什么是ESI

部署运行你感兴趣的模型镜像

什么是ESI
ESI的全称是Edge Side Includes,是一个基于XML的标记语言,目的是在HTTP中组装各种资源。是由Oracle和Akamai等公司提议的,在W3C的网站也可以找到相关规格说明,最新的是2001年的了,也不是什么新东西。传统的cache技能基本都已页面为单位进行缓存,问题就是页面部分的动态内容可能比较多,而且是每个客户端的内容都不一样(比如个人的登录信息,欢迎xxx等。),缓存比较困难。ESI为了能把页面的一部分进行缓存,使用基于XML的标记语言,来描述对page内个内容的缓存情况。这样,服务器(缓存部分)就可以只缓存共同部分了。
ESI有点类似SSI,但是它比SSI功能更丰富。
目前支持/实现ESI的开源服务器包括Squid,Mongrel-ESI等,商用的有Oracle和Akamai的服务器。

要在Rails里支持ESI需要安装两个插件,一个是Mongrel用的插件Mongrel-ESI,一个是Rails用来处理ESI标记(tag)的fragmentFu。两个软件都可以在http://mongrel-esi.googlecode.com找到。
如何安装一下Mongrel-ESI我就不说了,因为我也没有装过,下面的代码我都没有试验过。
下面来看一下ESI的代码,下面是一个测试的例子(转自http://blog.tkmr.org/tatsuya/show/368-rails-10-esi,日文

  1. cd /home/my/rails/app/path
  2. ----index.html-----
  3. <h1>Welcome ESI!!</h1>
  4. <p><esi:include src="/welcome/now" max-age="45"/></p>

esi标记里的就是ESI的内容了,应该比较好理解,max-age的意思就是页面缓存保留的时间,这里的话每45秒缓存就会被更新一次。

再来看看控制器里的代码:

  1. ./script/generate controller welcome now
  2. ----welcome_controller.rb----
  3. def now
  4.   render :text => "#{Time.now}"
  5. end

启动Mongrel_esi:

  1. mongrel_esi start
  2.   ** Starting Mongrel listening at 0.0.0.0:2000

然后就可以去浏览器里看看了,是不是45秒那个显示的时间才更新一次。

上面的例子是标准的ESI写法,当然Rails中这样写就有点累了,这个时候就需要fragmentFu这个Rails的plugin了。

在ERB里,写法是这样的:

  1. ./script/plugin install http://mongrel-esi.googlecode.com/svn/trunk/plugin/fragment_fu
  2. ----/app/view/welcome/index.html.erb----
  3. <h1>Welcome ESI!!</h1>
  4. <p><%= render :esi => {:action => "now"}, :ttl => 45.seconds %> </p>

ttl这个名字比较亲切。

当然,ESI里面也能使用Cookie或者Http的request数据:

  1. #query string
  2. <p><%= render :esi => "/users/name/$(QUERY_STRING{my_name})" %> </p>
  3. #Cookie
  4. <p><%= render :esi => "/users/home/$(HTTP_COOKIE{UserID})" %> </p>

除此之外,ESI还有异常处理机能。因为ESI指令的include可以指向别的地址,所以,取得cache内容也可能失败。

比如下面的代码(来自http://revolutiononrails.blogspot.com/2007/08/advanced-rails-caching-on-edge.html

  1. <esi:try>
  2.   <esi:attempt>
  3.     <esi:include src="/latest" max-age="5" timeout="1"/>
  4.   </esi:attempt>
  5.   <esi:except>
  6.     <esi:include src="http://static.foo.com/latest" max-age="5" timeout="1"/>
  7.   </esi:except>
  8. </esi:try>

这个也应该比较好理解,如果尝试1秒内取得不到/latest的话,cache服务器就会放弃,而去取静态页面的内容。

另一不错的功能就是Invalidation,就是使已有的cache的内容失效,因为它cache的内容已经被更新过了。在Rails自带的cache功能里需要在action调用失效方法的,或者用sweeper回调。ESI则有invalidate指令:

  1. <esi:invalidate>
  2.   <?xml version="1.0"?>
  3.   <!DOCTYPE INVALIDATION SYSTEM "internal:///WCSinvalidation.dtd">
  4.   <INVALIDATION VERSION="WCS-1.1">
  5.     <OBJECT>
  6.       <BASICSELECTOR URI="/foo/bar/baz"/>
  7.       <ACTION REMOVALTTL="0"/>
  8.     </OBJECT>
  9.   </INVALIDATION>
  10. </esi:invalidate>

参考链接:

http://revolutiononrails.blogspot.com/2007/08/fragmentfu-fun-with-fragments.html
http://revolutiononrails.blogspot.com/2007/08/advanced-rails-caching-on-edge.html
http://www.w3.org/TR/esi-lang
http://blog.tkmr.org/tatsuya/show/368-rails-10-esi

Related posts for the current post:

您可能感兴趣的与本文相关的镜像

Dify

Dify

AI应用
Agent编排

Dify 是一款开源的大语言模型(LLM)应用开发平台,它结合了 后端即服务(Backend as a Service) 和LLMOps 的理念,让开发者能快速、高效地构建和部署生产级的生成式AI应用。 它提供了包含模型兼容支持、Prompt 编排界面、RAG 引擎、Agent 框架、工作流编排等核心技术栈,并且提供了易用的界面和API,让技术和非技术人员都能参与到AI应用的开发过程中

### x86 ESI 寄存器 的定义与功能 ESI 是 x86 架构中的一个寄存器,全称为 **Extended Source Index**。它是一个 32 位的通用寄存器,在早期的 16 位处理器中对应的是 SI(Source Index),后来随着架构的发展扩展到了 32 位[^1]。 #### 主要作用 ESI 寄存器的主要用途是在字符串操作和数据传输过程中作为源地址指针。具体来说: - 它通常用来存储源数据的内存地址,特别是在涉及重复字符串操作的指令中(如 `MOVSB` 或 `CMPSB`)。这些指令会自动更新 ESI 的值以指向下一个数据项。 - 在现代编程环境中,ESI 可以作为一个普通的通用寄存器使用,程序员可以根据需求将其当作任意类型的变量或指针处理[^3]。 #### 使用场景 以下是几个常见的应用场景: 1. 字符串复制:通过 `REP MOVSB` 指令实现高效的数据块拷贝,其中 ESI 提供源地址,EDI 提供目标地址。 2. 数据比较:利用 `REP CMPSB` 对两个缓冲区的内容逐字节进行对比,同样依赖 ESI 来定位源位置。 3. 高级语言编译优化:某些高级语言编译器可能会将局部变量或者临时计算结果保存到 ESI 中以便快速访问[^2]。 下面展示一段简单的汇编代码示例演示如何使用esi参与字符串移动过程: ```asm section .data source db 'Hello, world!',0 ; 初始化源字符串 dest times 14 db 0 ; 准备足够的空间给目的字符串 section .text global _start _start: mov esi,source ; 将源字符串起始地址加载至esi lea edi,[dest] ; 计算并装载目的字符串首地址到edi cld ; 设置DF=0,确保每次操作后si/di都增加而不是减少 mov ecx,13 ; 循环计数设置为字符长度加终止符'\0' rep movsb ; 执行循环直到ecx降为零为止 ``` 此程序片段展示了怎样运用esi配合其他寄存器完成基本的任务——这里是从一个地方搬运一系列连续字节到另一个地方去。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值