cookie 占带宽吗?

分布式计算中为减轻服务端压力,有时将信息存储在cookie中。但是cookie是要通过http header传送的,它的大小不能超过4K(各浏览器不同http://www.cnblogs.com/sdjxcolin/archive/2009/02/16/1391272.html)。

所以cookie是占带宽的,主要看应用的场景了,对于一般小型应用,这点带宽可以忽略,而对于大型网站,还需要对此做专门的优化。

见:

杜绝Cookie传送提高网站访问速度

Continue reading cookie 占带宽吗?

选择web的图片格式

GIF最高支持8位彩色,分为GIF87a和GIF89a两种类型,其中GIF89a支持"透明""交错""动画"三个特性!而GIF图片之所以被广泛使用,就是因为这三个特性。GIF存在压缩算法专利问题。开源情况下,会逐渐被png代替。

JPEG(Joint Photographic Experts Group,联合图片专家组)格式,最大可支持32位彩色。由于存储技术的特别,JPEG格式的图片比较小,并且它还采用了有损图片压缩技术,允许用户以百分比形式选择图片的质量,从而让用户在图片大小和图片质量之间权衡。

PNG是无损压缩格式,但是有个问题是ie6不支持!也可以显示预览图。

但GIF和JPEG哪个更好一点呢?回答是,要根据图形的情况而定。需要考虑图形的尺寸及下载速率两个方面。

你的一个基本考虑是所用图形的类型。如果图形使用了很多颜色,特别是不同颜色相互交叉,最好是采用JPEG格式。如果所用图形的颜色比较简单,应采用GIF格式。

多颜色图形采用JPEG格式的原因是,JPEG可以保存几百万种颜色,而GIF只局限于256种颜色。另一个重要的问题是文件的尺寸。JPEG允许压缩比大一些。GIF的压缩比小一些。对于比较大的图形,宜采用JPEG。JPEG几乎能保持图形的原貌。

GIF可以做到一些JPEG不能做到的事情。比如,你可以对GIF进行交织处理。交织处理的GIF图形可以先以低清晰度全部下载,然后再慢慢变清晰。这样,读者就可以先快速看到是一个什么图形。而JPEG则智能一行一行地下载,直到全图下载完毕,才可以看到整个图形。

 

一般不是照片效果的,直接用gif就行了。

参见:

http://www.turnkeylinux.org/blog/png-vs-jpg

http://www.pyslc.com/cl/Article/HTML/447.html

Continue reading 选择web的图片格式

tomcat session引出的问题

这次碰到一个奇怪的问题,为测试要求,将同一个应用A部署到两个端口的tomcat中,访问地址如下:

http://localhost:10001/A

http://localhost:10002/A

结果单独打开一个没问题,同时打开两个就都运行不了。

查看服务端日志,认定是session过期。

从客户端看,发现这两个A应用的sessionid交替变换!

这才明白,由于session是基于cookie的,cookie按照domain+path来找,是不区分端口号的!所以两个应用的sessionid冲突了!

所以流程就变成了这样:

浏览器请求10001 A-->服务端 java:getSession()->创建cookie[name=sessionid,domain=localhost,path=A,value=c1]

浏览器请求10002 A-->服务端 java:getSession()->创建cookie[name=sessionid,domain=localhost,path=A,value=c2]

浏览器请求10001 A,在http请求头中请求发送cookie[sessionid=c2](这里就冲突了,sessionid被10002 A改了)->服务端 java:getSession()(使用name=c2找不到,于是创建新的)->创建cookie[name=sessionid,domain=localhost,path=A,value=c3]

浏览器请求10002 A,在http请求头中请求发送cookie[sessionid=c3](这里又冲突了,sessionid被10001 A改了)->服务端 java:getSession()(使用name=c3找不到,于是创建新的)->创建cookie[name=sessionid,domain=localhost,path=A,value=c4]

周而复始的互相刷sessionid,两个服务器就在那不停地清过期session,又创建新的session。

这种情况在web应用中一般不会出现,但是在内部测试环境中可能出现!

Continue reading tomcat session引出的问题

缓存算法和缓存策略

缓存算法

缓存法通过设计良好的数据分块、预取、顺序预取、缓存替换等算法来提高对缓存内容的命中率。缓存算法可以分为

  • 基于访问时间的策略
  • 基于访问频率的策略
  • 访问时间与频率兼顾策略
  • 时间距离分布策略等类型
  • 另有基于数据访问模式、基于VoD系统架构的策略等。

 

缓存策略:

缓存策略主要三方面:

  • ①缓存什么内容;
  • ②何时进行缓存;
  • ③当缓存空间已满时如何进行替换,即缓存替换算法。

对于第二方面,大部分缓存算法使用预取策略来提前将部分磁盘数据放入缓存,以进一步减少磁盘I/O,加大缓存命中率。通过记录、分析以往的数据请求模式来预测将来可能被请求到的数据段,将访问可能性大的数据段放入缓存。

缓存策略的分类:

由于不同系统的数据访问模式不尽相同,同一种缓存策难以在各种数据访问模式下均取得满意性能,

研究人员提出不同缓存策略以适应不同需求。缓存策略可分为以下几类:

  • 基于访问时间:此类算法按各缓存项的被访问时间来组织缓存队列,决定替换对象。如LRU。
  • 基于访问频率:此类算法用缓存项的被访问频率来组织缓存。如LFU、LRU-2、2Q、LIRS。
  • 访问时间与频率兼顾:通过兼顾访问时间与频率,使得在数据访问模式变化时缓存策略仍有较好性能。如FBR、LRFU、ALRFU。多数此类算法具有一个可调或自适应参数,通过该参数的调节使缓存策略在基于访问时间与频率间取得一定平衡。
  • 基于访问模式:某些应用有较明确的的数据访问特点,进而产生与其相适应的缓存策略。如专为VoD系统设计的A&L缓存策略,同时适应随机、顺序两种访问模式的SARC策略。

 

比较:

  • 基于访问时间的缓存策略:

LRU (LeastRecentlyUsed,最近最少使用)是一种应用广泛的缓存算法。该算法维护一个缓存项队列,队列中的缓存项按每项的最后被访问时间排序。当缓存空间已满时,将处于队尾,即删除最后一次被访问时间距现在最久的项,将新的区段放入队列首部。

但LRU算法仅维护了缓存块的访问时间信息,没有考虑被访问频率等因素,在某些访问模式下无法获得理想命中率。例如对于VoD系统,在没有VCR操作的情况下,数据被由前至后顺序访问,已访问过的数据不会被再次访问。所以LRU算法将最新被访问的数据最后被替换不适用于VoD系统。

  • 基于访问频率的缓存策略:

LFU (LeastFrequentlyUsed,最小频率使用)按每个缓存块的被访问频率将缓存中的各块排序,当缓存空间已满时,替换掉缓存队列中访问频率最低的一项。与LRU的缺点类似, LFU仅维护各项的被访问频率信息,对于某缓存项,如果该项在过去有着极高的访问频率而最近访问频率较低,当缓存空间已满时该项很难被从缓存中替换出来,进而导致命中率下降。

LRU-2[2, 3]算法记录下每个缓存页面最后两次被访问的时间。替换页面时替换掉倒数第二次访问时间距现在最久的一项。

在IRM (IndependentReferenceModel)访问模式下,LRU-2有着最好的预期命中率,由于LRU-2算法要维护一个优先级队列,所以该算法复杂度为logN(N为缓存队列中缓存项的数量)。

2Q[4](2 Queues)使用LRU队列替换了LRU-2中的优先级队列,将算法时间复杂度由logN降为常数,且维护缓存项的各信息所需空间比LRU-2小。

LIRS[5](Low Inter-ReferenceRecency Set)维护一个变长的LRU队列,该队列的LRU端为最近至少被访问过2次的第Llirs项(Llirs为算法参数)。LIRS算法在IRM访问模式下可以获得很高的命中率,但对于SDD访问模式效率明显下降。

对于VoD系统,基于访问频率的策略可以捕捉到热点影片片段,使得对热点片段的大量请求免于进行缓慢的磁盘I/O。但影片热点会随时间不断变化,且此类策略无法利用VoD的顺序访问模式,所以纯粹以访问频率为度量来进行替换操作不适合VoD系统。

  • 兼顾访问时间与频率:

FBR[6](Frequency Based Replacement)维护一个LRU队列,并将该队列分为New、Middle、Old三段。对队列中的每一缓存项均维护一个计数值。当缓存中的一项被命中时,被命中的缓存项被移至New段的MRU端,如果该项原本位于Old或Middle段,则其计数值加1,原位于New段则计数值不变。当进行替换操作时,删除Old段计数值最小的一项(LRU端)。

LRFU[7](LeastRecently FrequentlyUsed)为每一个缓存项维护一个权值C(x),其初始值为0, C(x)按以下公式变化。

在t时刻, C(x) =1+2-λC(x): x被访问到2-λC(x) : x未被访问进行替换操作时,C(x)值最小的一项被删除。当时, LRFU算法行为类似于LFU;而当时,该算法行为逼近LRU算法。该算法通过选用合适的λ值来获得时间与频率因素的平衡。

LRFU虽然通过一个值来兼顾访问时间与频率因素,但由于值固定,当访问模式变化时,该算法无法做出相应的调整而造成性能下降。ALRFU[8](Adaptive LRFU)在此方面对LRFU进行了改进。通过对数据访问模式的历史进行监控,ALRFU动态调整值来适应数据访问模式的改变,表现出比LRFU更好的适应性。

  • 基于访问模式的缓存策略:

文献[9]针对VoD系统的特点提出A&L算法。该算法通过记录每个缓存项的历史访问时间与访问数量来估计该项的未来被访问频率。以该频率值为度量,在进行缓存替换时替换掉该值最小的一项。由于该算法考虑了VoD系统的数据访问特点,所以广泛应用于VoD系统。

但A&L算法通过直接计算缓存区段生成以来的总的访问数量、频率来生成缓存权值,没有考虑VoD影片的访问热点会随时间不断变化。当某些缓存区段历史访问频率较高但最近访问频率下降时,仍保持较大权值,影响新的热点片段的缓存,无法适应影片热点的动态变化。

IBM提出的SARC[10]是针对于大型服务器的缓存算法,可在随机访问与顺序访问的数据访问模式下做出动态适应。SARC通过将随机访问与顺序访问分为两个队列分别管理来实现对两种不同访问模式的适应。并通过分析缓存大小-命中率的仿真试验数据曲线,得出对随机队列与顺序队列项分别进行替换的代价函数。当进行缓存替换时,通过两队列的代价函数来对代价小的队列进行替换。

 

常用的算法是LRU(最经最少使用),FIFO(先进先出),随机

从oscache来看:

OSCache支持多种类型的缓存添加策略:LRU,FIFO,无限制,自定义
OSCache支持多种类型的缓存过期策略:时间,cron表达式,编程计算

OSCache支持基于事件的触发机制:增加,修改,刷新,移除
OSCache支持开辟多个缓存区域,每个区域可以有不同的缓存策略
OSCache的刷新不单可以作用于单个对象,还可以作用于所有和对象相关的其它缓存数据

 

参见:

 http://blog.csdn.net/zhghost/article/details/5344962

http://aguang520.iteye.com/blog/1016072

Continue reading 缓存算法和缓存策略

Pagination


Total views.

© 2013 - 2020. All rights reserved.

Powered by Hydejack v6.6.1