首页 >汽车

浅谈阅读器缓存ehcache缓存淘汰浅析

2019-05-14 21:35:09 | 来源: 汽车

1 : ehcache缓存淘汰浅析

近要设计个缓存系统,所以到处看了看,简单看了ehcache,不能不感叹源码太多了,能写成这样也I服了Y,还是像google的guava看齐吧,固然ehcache号称支持散布式

1简单使用

记录下简单使用,主要是看源码的时候可以找到入口

http://passo

?xmlversion="1.0"encoding="UTF⑻"?

ehcache

diskStorepath=""/

defaultCache

maxElementsInMemory="10000"

eternal="false"

timeToIdleSeconds="120"

timeToLiveSeconds="120"

overflowToDisk="true"

diskPersistent="false"

diskExpiryThreadIntervalSeconds="120"

memoryStoreEvictionPolicy="LRU"

/

cachename="sample"

maxElementsInMemory="5"//缓存中允许创建的对象数

maxElementsOnDisk="5"

eternal="false"//缓存中对象是不是为的,如果是,超时设置将被忽视,对象从不过期。

timeToIdleSeconds="1440"//缓存数据的钝化时间,也就是在1个元素灭亡之前,两次访问时间的时间间隔值

diskPersistent="false"

timeToLiveSeconds="2880"//缓存数据的生存时间,也就是1个元素从构建到灭亡的时间间隔值

overflowToDisk="false"//内存不足时,是否是启用磁盘缓存

memoryStoreEvictionPolicy="FIFO"//缓存满了以后的淘汰算法

statistics="true"

/

/ehcache

publicclassEhcacheTest{

privatestaticfinalLoggerlogger=(ass);

privatestaticCachesampleCache=null;

publicstaticvoidmain(String[]args){

init();

test();

}

privatestaticvoidtest(){

());

for(inti=0;i10;i++){

//写入缓存

t(newElement(i,"v"+i));

//打印当前缓存的所有值

());

//读取缓存

Elemente=(i);

(tValue());

}

//打印命中统计

());

}

privatestaticvoidinit(){

CacheManagermanager=();

//dCache("sample");//已在配置文件定义过了

sampleCache=("sample");

}

}

另外一种使用方式:

Stringname="Namespace";

intcapacity=500;

intrefreshPeriod=5000;

//InitializeEhCache

Cachecache=newCache(name,capacity,false,false,refreshPeriod,0);

itialise();

intln(

"InitializeEhCache:"+

"name:"+name+

"capacity:"+capacity+

"expire:"+refreshPeriod

);

//SetdataintoEhCache

Stringkey1="Key";

Stringvalue1="Value";

Elementelement1=newElement(key1,value1);

t(element1);

intln("Set("+key1+","+value1+")intoEhCache.");

//GetdatafromEhCache

Elementelement2=(key1);

Stringkey2=(String)();

Stringvalue2=(String)();

intln("Get("+key2+","+value2+")fromEhCache.");

//RemovedatafromEhCache

if(key2)){

intln("Removedatawithkey="+key2+"successfully.");

}

//GetEhCachesize

intln("EhCachesizeis"+());

重要的入口就是CacheManager和Cache,Manager起到类似工厂的作用,主要还是看Cache

2CacheManager

CacheManager,默许会去找l和l等文件,创建的是1个Cache对象

privatevoidaddConfiguredCaches(ConfigurationHelperconfigurationHelper){

//根据配置创建缓存Cache对象

SetunitialisedCaches=();

for(Iteratoriterator=erator();

sNext();){

EhcacheunitialisedCache=(Ehcache)();

//调用Cache的init方法

addCacheNoCheck(unitialisedCache,true);

......

}

}

}

============================================================

//在Cache的init方法中,会根据不同的淘汰策略,选择不同的Store

if(useClassicLru

().equals(

U)){

//老的LRU策略,选择LruMemoryStore

Storedisk=createDiskStore();

store=newLegacyStoreWrapper(newLruMemoryStore(this,disk),disk,registeredEventListeners,configuration);

}else{

//可以存到磁盘,DiskBackedMemoryStore(Memory和DiskStore的整合)

//新的淘汰机制,貌似会有些问题

-lru-evicting-recently-used-entries

if(OverflowToDisk()){

store=(this,onHeapPool,onDiskPool);

}else{

//只在内存上,MemoryOnlyStore

store=(this,onHeapPool);

}

}

store可以有很多实现,包括DiskBackedMemory(使用DiskStore)或MemoryOnlyStore(使用MemoryStore)或

LocalTransactionStore/JtaLocalTransactionStore之类的,散布式的靠Listener去实现,cache的put、update、remove、evict等操作都会发失事件,然后由listener去实现,比如RMISynchronousCacheReplicator

这些store的实现都和ConcurrentHashMap类似,也是分段,默许分64个段即64个锁

3淘汰机制

LFU 不常常使用,计算频率,也就是get的次数

FIFO 先进先出,计算下写入时间

LRU 近少使用,有些使用链表,有些只是记录1个访问时间

是不是要淘汰都是根据容量,超过容量后,就会根据指定的策略淘汰数据,先看看新的淘汰算法吧

3.1新的Store

主要看看MemoryStore,在Store内部,有1个SelectableConcurrentHashMap,和ConcurrentHashMap很像,也是采取分段机制,但是他的淘汰机制好像非常不好,没有使用链表的情势,而是在所有元素中遍历,

//先找到要淘汰的个数

intevict=n(ickSize()-maximumSize,MAX_EVICTION_RATIO);

for(inti=0;ievict;i++){

//每次随机选出几个,再肯定应当淘汰的1个,效力不高removeElementChosenByEvictionPolicy(elementJustAdded);

}

publicElement[]getRandomValues(finalintsize,ObjectkeyHint){

ArrayListElementsampled=newArrayListElement(size*2);

//pickarandomstartingpointinthemap

intrandomHash=();

finalintsegmentStart;

if(keyHint==null){

segmentStart=(randomHashsegmentShift)segmentMask;

}else{

segmentStart=(hash(shCode())segmentShift)segmentMask;

}

intsegmentIndex=segmentStart;

do{

finalHashEntry[]table=segments[segmentIndex].table;

finalinttableStart=randomHash(ngth⑴);

inttableIndex=tableStart;

do{

for(HashEntrye=table[tableIndex];e!=null;e=xt){

Elementvalue=lue;

if(value!=null(!(nnedelementPinningEnabled)||Expired())){

d(value);

}

}

if(ze()=size){

retur(newElement[ze()]);

}

//movetonexttableslot

tableIndex=(tableIndex+1)(ngth⑴);

}while(tableIndex!=tableStart);

//movetonextsegment

segmentIndex=(segmentIndex+1)segmentMask;

}while(segmentIndex!=segmentStart);

retur(newElement[ze()]);

}

整了半天,貌似是为了随机定位到某个段,然后随机从某个元素开始遍历,直到找到指定个数的需要淘汰的数量,没仔细去想并提问题了,觉得效率比较低,不管了,还是

侧重看下他的淘汰策略吧:

publicElementselectedBasedOnPolicy(Element[]sampledElements,ElementjustAdded){

//edgeconditionwhenMemoryStoreconfiguredtosize0

if(ngth==1){

returnsampledElements[0];

}

ElementlowestElement=null;

for(Elementelement:sampledElements){

if(element==null){

continue;

}

if(lowestElement==null){

if(!uals(justAdded)){

lowestElement=element;

}

}elseif(

compare(lowestElement,

element)!uals(justAdded)){

lowestElement=element;

}

}

returnlowestElement;

}

LRULFUFIFO的核心就在对compare的实现,

LRU:比较访问时间

publicbooleancompare(Elementelement1,Elementelement2){

retur()&l();

}

LFU:比较get次数(在get的时候会累加)

publicbooleancompare(Elementelement1,Elementelement2){

retur()&l();

}

FIFO:创建/修改时间

publicbooleancompare(Elementelement1,Elementelement2){

retur()

();

}

3.2老的LruMemoryStore

新的那种随机定位的方式让人感觉很怪,老的LRU实际使用的是SpoolingLinkedHashMap,

他在LinkedHashMap上增加了,他的put/get/remove是synchronized的,,所以没有并发安全性问题,但是感觉效率也不太高。。就是LinkedHashMap的同步版本了

4总结

没有发现啥亮点,代码太多了,看的几部分也没啥参考价值。。。。

()

2 : 浅谈阅读器的用户运营

直到现在我们每天在电脑上上,常常都离不开PC真个阅读器,不论是IE还是各种第3方阅读器,而且每一个人的电脑上常常都会有两个或两个以上的阅读器。一样地,在端上我们也能够需要使用阅读器,有人可能会说我只有怎样需要使用阅读器呢?本身打开的某个页面利用的还是本身提供的页阅读器,所以阅读器对上用户来讲10分重要也非常关键。在移动端,阅读器也愈来愈多,在PC端有的阅读器在的App利用商店也基本上可以找到,对阅读器的认识和PC阅读器会有相同也有差异,特别是从运营的角度上看,我们应当更加重视阅读器上的用户运营。

第1,阅读器不单单是1个阅读器。现在很多的互联公司,特别是有阅读器产品的公司常常都会在移动端也开发出相应的阅读器。但他们都有1个共同点,就是都不甘心只是做1个阅读器,而是将阅读器,不论是还是PC阅读器,都是将阅读器当作用户的1个入口,通过阅读器将络流量引导到自己的产品上,然后再利用这些用户流量来做增值服务等方式来实现盈利,否则互联上的各种阅读器现在越来越多,为何明明有那么多功能一样的产品还会相继出现各种版本的阅读器。

第2,阅读器应更加重视用户体验。阅读器由于天生就具有在移动真个缺点,屏幕尺寸小,信息显示不全等容易给阅读器带来用户体验上的不足。特别是之前早期出的3寸左右的智能上运行部份阅读器,常常容易在屏幕上出现触摸点位不准,单手操作不方便和由于操作系统的版本不同带来的阅读器各种不兼容问题也会在用户体验上给阅读器大大降分。另外,阅读器有个10分重要的方面就是响应速度和流量消耗方面。为什么越来越多的智能用户明明操作系本身都有自带的阅读器,还要去下载个第3方的阅读器来用,缘由就在于第3方的阅读器有很多都是经过不断优化,在用户响应时间和流量节省方面会优于本身自带的阅读器好几倍,所以1款阅读器若是想赢得用户的青睐,这这两个方面没有较大的优势的话常常不能吸援引户。

第3,阅读器应重视用户账号的重要性。这里谈到的用户账号指的是和PC端1样的,用户登录某个站或系统需要实用通行证。之所以谈到账号的重要性,是由于阅读器的用户有很大的1部份可以通过PC端导入进来,而实现用户导入的钥匙就是用户账号,否则PC真个用户数据根本没有办法直接和移动真个用户数据关联上。现在的阅读器基本上都有提供云端服务,也就是将用户在阅读器上相干的数据保存在云端,这个时候用户的阅读器账号就相当重要。阅读器收藏夹(书签)、定制阅读器首页、阅读历史等都需要通过用户的账号来进行关联。另外,阅读器的账号还可以被后续增值服务所共用。

第4,阅读器中整合游戏平台。既然阅读器是移动端用户上的重要入口,那末在阅读器中整合游戏平台则对提升阅读器的服务层次和吸援用户将发挥重要的作用。我们知道,很多时候用户在游戏中扮演的角色常常和现实中有几分类似,缘由就在于用户更想在游戏中寻觅到现实中不能得到满足的东西,这也是为何络游戏让很多人都入迷的缘由。这里,我们主要谈的是用户在游戏中能够由于具有喜怒哀乐和愿望,这样就有了在游戏中产生消费的冲动。同时,对阅读器来讲,游戏平台可以在内容上更加灵活多样,供用户选择的范围也会更大,再加上阅读器上的大多数是页游戏,具有大众用户的操作习惯,所以阅读器中整合游戏平台可以提升用户的虔诚度。这或许就是UC阅读器中还集成了游戏、视频、影音都服务的缘由。总之,利用阅读器中的游戏可以容易留住阅读器的用户。

本文由石景山电脑培训原创,如有转载请注明出处,谢谢!

3 : 浅谈外链因何而存在

seo优化总的可以分为站内优化和站外优化两部份,站内优化的触及到的流程和细节非常的多,优化的好坏直接可以从用户的体验中体现出来;而站外的优化无疑就是外链这1块,它可以提升站的权重,带动关键词的排名,站内站外优化都是seo优化中不可缺少的。

站内优化作用无庸置疑,搜索引擎也给予我们正确的优化思路,随着搜索引擎优化指南2.0和百度站长平台推出的优化知识,无疑让我们在站内优化有了1个全新的认识。在站内优化这1块有了1个明确的方向,在未来或许不是1个酒香不怕巷子深的时期了,由于每一个人对站内容和架构都有全新的了解,在质量上也会提升1个台阶,未来的优势可能在于谁有好的产品、好的思路,更多的在于对用户的研究上。

而对外链,目前在seo中作用不容忽视,Seoer也对这1块特别敏感,通过论坛论坛帖子的视察发现,凡是跟外链有关系的文章点击率都比其它帖子要高,看来外链在人们心中的地位还是非常高的;外链存在对站究竟是不是成心义呢?搜索引擎并没有鼓励我们去做外链,也没有给予我们正确的外链发布思路。

个人认为搜索引擎并不是鼓励我们去发外链,特别是那些质量低的垃圾链接,链接存在的真正意义在于给站投票,而这些投票都是顺其自然的投票,比如A站发现B站非常不错,对用户有帮助,那末A站给B站做1个链接,那末A站就给B站投上了1票,投票并不是是随便的,比如我们是做婚纱摄影的站,1般来站的用户都是对婚纱摄影有需求的,而如果我们做1个链接指向茶叶站,那末对用户来说也是毫无意义的,并没有真正满足婚纱摄影用户的需求和直接的帮助,因此为何说相干性强的友谊链接质量会更高,缘由就在于此。

那末我们应当如何去认识高质量链接和1般性的链接呢?我们可以以美国总统选举为例,美国本土的选票每票都是很重要的,而我们中国公民投的票是没有作用的,而对中国的士投1票可能对他的选举有很大的影响,这就是为何说相干性的链接质量高,权威性的链接虽不相干但质量仍然很高。

外链应当如何去做?在做外链之前要明白外链的投票原理,为什么而投票,然后在细分用户的直接需求和间接需求,比如我们是卖茶叶的,直接需求就是那些跟我们茶叶相干的站,而间接需求就是1些卖茶具、茶文化、茶知识的站,乃至还可以再进1步拓展,比如1些健康类型的站、1些休闲类型的站,这些站发外链对用户才是有需求的,在链接质量上也比其它的更好。

这就是为何二者的外链发布在同1个站,他人的关键词排名就那末好,而自己的却没效果。比如我们分析1些排名好的站,很多外链都是发布在分类信息的站上,我们跟随模仿,却没有好的效果,事实上可能跟我们的站类型和针对的用户有所差别而导致的(固然除外链,还有其他1些因素)。

百度百科的说法是这样的如图:

总结百度外链的投票原理应当遵守4要素:1、自然 2、相干(直接需求)3、间接需求 4、权威站,以上均为个人看法。希望大家多多指教,: 文章由曾育文(武夷山茶叶)原创,转载请注明文章来源。

4 : 浅谈中国民阅读页的行动习惯

民实际使用络的方式,完全不是你想象的那样。特别是当你正在设计页的时候。大的不说,就来说说我们的博客吧,我们认为用户打开页以后都会仔细浏览每个文字、思考每张图片的含义。

但实际上用户们使用站的方式和我们的想象有很大的差距。他们只是在每一个页面上瞥上1眼,眼光无顺序的扫过1些文字,然后点击第1个令他们感兴趣的链接。通常来讲,页面上很多部分他们都不看,也不感兴趣。

比如我曾在上引以为傲的那些博文插图,在普通民的头脑中,只是关注着他们来到这个博客所到达的目的,所以欣赏站本身、或是看你的博文插图其实不是他们的目的(固然学习站设计、图片制作的时候除外)。

(曾引以为傲的博文插图)

当我们要找资料的时候,就像上图中这样使用google或百度来查询,然后从海量的搜索结果中1项1项地点击可能符合要求的站链接。这类情况下,其实用户并没有心情去仔细浏览你博客中的所有内容。他们都很忙,而且他们清楚,在大多数博文中,只有很少的1部份内容是他们感兴趣的。

(大部份时间里,人们都是这样使用络的)

我的意思其实不是说你就能够放弃细节、随便设计。清晰的结构、美观的图片和没有歧义的文字都能帮助用户快速找到自己感兴趣的东西。如果用户略微不顺心,他们极可能马上就关闭你的博客。有时候他们就像1些脾气不好的顾客,对待他们稍有不慎就再也没法挽回。

经期延长不能吃什么
月经经期延长吃什么
月经经期延长怎么办

猜你喜欢