您的位置:首页 > 其它

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

2013-06-04 21:19 246 查看
这是一种典型的大并发访问同一个不存在的cache的情形,
因此对于可预先知道的缓存,可以采取在程序启动的时候就生成。
对于这种无法预知key的,以论坛帖子列表为例,可以采取两种策略,
1.第一个发现cache中没有缓存对象时,先放入一个空的临时对象,
比如返回List,可以先生成一个长度为0的ArrayList,同时将生成缓存的操作放到队列中或者由当前线程完成,再将生成的数据替换刚才的临时缓存对象。
这种做法的缺点是,如果生成缓存的时间较长,那么会有一部分请求得到的不是实际数据,影响部分用户体验。且如果当前生成缓存的时候出现异常,需要等刚才的临时缓存失效之后,才会再次触发生成缓存的请求。
优点是编写代码简单,即使该缓存永远无法生成,也不会出发太多的生成缓存的操作。
不怕用户恶意请求来产生过多的无法命中的缓存。
属于牺牲少量用户体验来保障系统的稳定的做法。主要用于重要性较低的业务。

2.用申请锁的方式将生成缓存的操作以同步方式进行,
优点是基本不会出现取到方法1中的那种临时缓存,
缺点是,代码编写稍复杂,生成缓存操作耗时太久或出现问题,或者网络故障等其它原因导致该缓存永远无法生成的时候,
那么每次调用过读取该缓存的请求,都将被拖住,严重的时候整个服务器线程占满被拖垮。
一旦用户恶意请求导致缓存无法名字,服务器很容易被搞挂。

根据实际业务选择吧。

参考:http://xuliangyong.iteye.com/blog/274149
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐