大并发访问同一个不存在的cache的两个解决方法

来源:互联网 发布:价格监控软件开发 编辑:程序博客网 时间:2024/05/16 06:25

这是一种典型的大并发访问同一个不存在的cache的情形, 

因此对于可预先知道的缓存,可以采取在程序启动的时候就生成。 

对于这种无法预知key的,以论坛帖子列表为例,可以采取两种策略, 

1.第一个发现cache中没有缓存对象时,先放入一个空的临时对象, 

比如返回List,可以先生成一个长度为0的ArrayList,同时将生成缓存的操作放到队列中或者由当前线程完成,再将生成的数据替换刚才的临时缓存对象。 

这种做法的缺点是,如果生成缓存的时间较长,那么会有一部分请求得到的不是实际数据,影响部分用户体验。且如果当前生成缓存的时候出现异常,需要等刚才的临时缓存失效之后,才会再次触发生成缓存的请求。 

优点是编写代码简单,即使该缓存永远无法生成,也不会出发太多的生成缓存的操作。 

不怕用户恶意请求来产生过多的无法命中的缓存。 

属于牺牲少量用户体验来保障系统的稳定的做法。主要用于重要性较低的业务。 


2.用申请锁的方式将生成缓存的操作以同步方式进行, 

优点是基本不会出现取到方法1中的那种临时缓存, 

缺点是,代码编写稍复杂,生成缓存操作耗时太久或出现问题,或者网络故障等其它原因导致该缓存永远无法生成的时候, 

那么每次调用过读取该缓存的请求,都将被拖住,严重的时候整个服务器线程占满被拖垮。 

一旦用户恶意请求导致缓存无法名字,服务器很容易被搞挂。 


根据实际业务选择吧。 


参考:http://xuliangyong.iteye.com/blog/274149


原创粉丝点击