大并发访问同一个不存在的cache的两个解决方法
2013-06-04 21:19
246 查看
这是一种典型的大并发访问同一个不存在的cache的情形,
因此对于可预先知道的缓存,可以采取在程序启动的时候就生成。
对于这种无法预知key的,以论坛帖子列表为例,可以采取两种策略,
1.第一个发现cache中没有缓存对象时,先放入一个空的临时对象,
比如返回List,可以先生成一个长度为0的ArrayList,同时将生成缓存的操作放到队列中或者由当前线程完成,再将生成的数据替换刚才的临时缓存对象。
这种做法的缺点是,如果生成缓存的时间较长,那么会有一部分请求得到的不是实际数据,影响部分用户体验。且如果当前生成缓存的时候出现异常,需要等刚才的临时缓存失效之后,才会再次触发生成缓存的请求。
优点是编写代码简单,即使该缓存永远无法生成,也不会出发太多的生成缓存的操作。
不怕用户恶意请求来产生过多的无法命中的缓存。
属于牺牲少量用户体验来保障系统的稳定的做法。主要用于重要性较低的业务。
2.用申请锁的方式将生成缓存的操作以同步方式进行,
优点是基本不会出现取到方法1中的那种临时缓存,
缺点是,代码编写稍复杂,生成缓存操作耗时太久或出现问题,或者网络故障等其它原因导致该缓存永远无法生成的时候,
那么每次调用过读取该缓存的请求,都将被拖住,严重的时候整个服务器线程占满被拖垮。
一旦用户恶意请求导致缓存无法名字,服务器很容易被搞挂。
根据实际业务选择吧。
参考:http://xuliangyong.iteye.com/blog/274149
因此对于可预先知道的缓存,可以采取在程序启动的时候就生成。
对于这种无法预知key的,以论坛帖子列表为例,可以采取两种策略,
1.第一个发现cache中没有缓存对象时,先放入一个空的临时对象,
比如返回List,可以先生成一个长度为0的ArrayList,同时将生成缓存的操作放到队列中或者由当前线程完成,再将生成的数据替换刚才的临时缓存对象。
这种做法的缺点是,如果生成缓存的时间较长,那么会有一部分请求得到的不是实际数据,影响部分用户体验。且如果当前生成缓存的时候出现异常,需要等刚才的临时缓存失效之后,才会再次触发生成缓存的请求。
优点是编写代码简单,即使该缓存永远无法生成,也不会出发太多的生成缓存的操作。
不怕用户恶意请求来产生过多的无法命中的缓存。
属于牺牲少量用户体验来保障系统的稳定的做法。主要用于重要性较低的业务。
2.用申请锁的方式将生成缓存的操作以同步方式进行,
优点是基本不会出现取到方法1中的那种临时缓存,
缺点是,代码编写稍复杂,生成缓存操作耗时太久或出现问题,或者网络故障等其它原因导致该缓存永远无法生成的时候,
那么每次调用过读取该缓存的请求,都将被拖住,严重的时候整个服务器线程占满被拖垮。
一旦用户恶意请求导致缓存无法名字,服务器很容易被搞挂。
根据实际业务选择吧。
参考:http://xuliangyong.iteye.com/blog/274149
相关文章推荐
- 自己在之前做两个项目中遇到多线程并发访问如何解决的一个简单demo程序
- 项目调试时出现用到的一个组件“访问被拒绝”的解决方法(转载)
- 多进程同时访问文件并发问题解决方法
- [DBNETLIB][ConnectionOpen(connect()).]SQL Server 不存在或拒绝访问解决方法
- 多进程同时访问文件并发问题解决方法
- 两个fragment 同时跳转另外一个fargment ,返回对应的fragment 的解决方法
- sql server 2000:Description: [DBNETLIB][ConnectionOpen (Connect()).]SQL Server 不存在或拒绝访问解决方法
- 不使用mutex设计模式解决并发访问cache
- 瞬时单表高并发访问的解决方法(支持事物)
- 一个解决在非UI线程中访问UI 异常的小方法
- 轻型池不支持执行公共语言运行时(CLR)。禁用以下两个选项中的一个: “clr enabled”或“lightweight pooling”解决方法
- 修改SQL数据库中表字段类型时,报“一个或多个对象访问此列”错误的解决方法
- “Internet连接共享访问被启用时,出现了一个错误” 解决方法
- 网站高并发大流量访问的处理及解决方法
- Playframework - 如何解决两个JPA同时访问一个数据库但是不更新Model的id名字
- 两个或多个域名共用一个空间并可以独立访问的方法
- 网站高并发 大流量访问的处理及解决方法
- 访问共享资源提示“网络不存在或尚未启动”解决方法
- 一个类有两个方法,其中一个是同步的,另一个是非同步的; 现在又两个线程A和B,请问:当线程A访问此类的同步方法时,线程B是否能访问此类的非同步方法?
- 修改SQL数据库中表字段类型时,报“一个或多个对象访问此列”错误的解决方法