0 0

缓存更新相关问题15

一个考试系统,组卷的时候用遗传算法,很耗CPU(因为要把数据库里面的几百题全弄出来计算特定策略下该题目的适应性,组卷策略可定制),而远程学习的同学们有个特点,都是在布置的作业快结束时才一起上线作作业,导致机器平时很闲,忙时负载太高,甚至导致组卷出错。


现在有3台机器A,B,C,打算A,B对外提供服务,作负载均衡,C专门作更新用,系统是用hibernate,struct1,spring,tomcat开发。
cache放在memcached里面

系统工作流程如下:
client---->进入系统做自测(每个策略里面有个策略id)----->查找cache里面是否有该缓存-->如果有中取出,没有则在该机器上生成一份
		Hashtable praxisTable = paperCacheManager.getStrategyCache(strategyId);
		if (praxisTable == null) {
			// 调用更新服务器生成对应的strategy cache,每个strategy生成
	        } else {
                 // 正常生成一份卷子返回给client
                }


现在如果是A机器调用C机器上的更新方法:
	public ActionForward trigger(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		String cmd = request.getParameter("cmd");
		String type =  request.getParameter("type");
		String data =  request.getParameter("data");
	
		
		if(cmd!=null & type!=null && data!=null) {
				if(cmd.equals("create")) {
					
					if(type.equals("simulate")) { //模拟考试的cache
						....
					} else if(type.equals("strategy")) { //自测的cache
						paperCacheManager.generateStrategyCache(data);
					}
					
				} else if(cmd.equals("flush")) {
					
				}else if(cmd.equals("update")) {
		........
		}


问题:
1,C机器上的该方法太多的if else,如何改进?
2,C机器上该方法要求登录系统执行,我在A机器上调用C机器上的该方法,要3台机器共享session.
如何执行好?
3,如果多个客户由于strategyId不同则都要调用该方法,并发太多C机器也可能出错。我该弄个命令队列?把该方法做成singleton模式?
命令队列有什么标准没?还是我直接把我参数变成相应的command对象,放到一个queue里面




问题补充:
#  if(AppConstant.useCache()) { 
#              praxisTable = paperCacheManager.getStrategyCache(strategyId); 
#  
#             if (praxisTable == null) { 
#                 // 调用更新服务器生成对应的strategy cache 
#                 new UpdateCacheThread("create","strategy",strategyId).run(); 
#             } else { 
#                 logger.info(" no cache availabe !"); 
#                 praxisTable = paperPublish.generate(strategyInfo); 
#             } 
#          
#         } else { 
#              praxisTable = paperPublish.generate(strategyInfo); 
#              
#         } 

我现在是在C机器上开了个servlet,把要操作的action发给该servelet,该servlet把执行的放任队列后返回,执行队列定时执行。
但是现在存在个问题:比如说
我现在的action是http://domain/cache.go?cmd=create&type=strategy&data=xxxxxx,我在B机器上的ACTION调用该servlet后,structs的action就不继续往下执行了
#             if (praxisTable == null) { 
#                 // 调用更新服务器生成对应的strategy cache 
                  URL u = new URL(action);
                          u.open....或者新开一个线程
#                 new UpdateCacheThread("create","strategy",strategyId).run(); 
#             }
他们访问该servlet后来,structs的action就此中止,不继续往下执行
2008年7月16日 10:30

3个答案 按时间排序 按投票排序

0 0

c如果通过struts和http暴露服务,那么建议定义多几个action还减掉if else,少了自己弄一个command pattern.
使用队列是个方法,另外是否存在可以去掉的无效请求。

2008年7月17日 23:01
0 0

另外就是A,B调用的参数可以传入command的完整类名,在c中利用反射生成command对象。当然也可以不用完整类名这样的方式,搞查表也行。

2008年7月17日 15:41
0 0

我想到的方案就是在C系统中采用command模式来消除if..else
例如分类为CreateCommand,UpdateCommand等。A,B调用C接口可以通过WebService或者一般的RPC调用,甚至最简单的就是HTTP调用,做IP验证。session共享可以考虑也采用memcached。A、B的调用都是new一个command加到c系统中的command处理队列,队列可以采用BlockingQueue(java5),c系统中根据实际情况(产生的快,还是处理的快)搞多线程或者单线程从队列中取出command进行execute。

2008年7月17日 15:38

相关推荐

    面试中缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级怎么解答?.docx

    在面试中,对于缓存相关的知识点,面试官可能会考察你对缓存雪崩、缓存穿透、缓存预热、缓存更新以及缓存降级的理解和处理策略。以下是这些概念的详细解释: 1. **缓存雪崩** 缓存雪崩是指大量缓存在同一时刻过期...

    asp.net缓存更新

    实际应用中,开发者需要确保缓存更新策略适应业务需求,避免因数据不一致导致的问题。 总的来说,理解并掌握ASP.NET缓存更新的原理和策略对于优化Web应用程序的性能至关重要。合理的缓存更新不仅可以提高用户体验,...

    spring-cache(通过key值更新缓存)

    5. **条件式缓存更新**:在某些情况下,我们可能希望有条件地更新缓存,而不是每次调用方法都更新。这可以通过在`@CacheEvict`上设置`condition`属性实现。例如: ```java @CacheEvict(value = "myCache", key = ...

    web项目页面缓存清除,不用每次刷新浏览器

    本资源包提供了关于"web项目页面缓存清除"的操作手册和相关资源,帮助开发者解决因缓存导致的问题,确保用户每次都能看到最新的网页内容,而无需手动刷新浏览器。以下是一些关键知识点: 1. **HTTP缓存机制**:HTTP...

    spring简单的缓存

    6. **缓存更新**: 当数据库中的数据发生变化时,可能需要同步更新缓存。Spring提供了一种基于事件的更新策略,或者可以使用缓存 provider 提供的监听机制来实现。 7. **分布式缓存**: 在多节点环境中,通常需要...

    UrlRewriter 缓存问题及一系列的相关探索

    这个问题的原因是由于浏览器缓存机制导致的,因为即使服务器上的资源已经更新,浏览器仍然可能会从本地缓存中加载旧的资源,而不是重新从服务器获取。特别是当页面结构复杂,例如存在多个iframe嵌套时,刷新机制和...

    asp.net缓存 缓存

    1. 数据访问频繁但变化不频繁:如果某个数据经常被请求,但更新频率不高,将该数据缓存可以显著提高响应速度。 2. 计算成本高:如果处理某个请求需要进行复杂的计算,将结果缓存可避免重复计算。 3. 减轻数据库压力...

    redis本地缓存与redis缓存

    此外,Redis还提供了“Cache Aside”和“Write Behind”等缓存更新策略,可以根据具体需求选择。 在分布式环境中,Redis通过主从复制保证数据冗余,主节点负责读写,从节点负责备份和读取。若主节点故障,可以快速...

    THINKPHP缓存清理器

    需要注意的是,清理缓存可能会导致用户短暂失去缓存中的数据,因此在生产环境中执行此操作时,应选择低峰时段或者配合合理的缓存更新策略。 总的来说,理解并熟练掌握ThinkPHP的缓存机制,以及合理利用"THINKPHP...

    缓存、缓存算法和缓存框架简介 - 文章 - 伯乐在线.pdf

    面试官提出的问题主要集中在缓存的基本概念、算法以及替代策略(缓存淘汰机制)上,而programmerone无法给出满意的答案,暴露出他在缓存方面的知识盲区。 从文档内容来看,面试官试图评估面试者在缓存方面的专业...

    MyBatis缓存(一级缓存、二级缓存)

    因此,对于频繁更新的操作,二级缓存可能不是最佳选择,因为它可能引入数据不一致的问题。为了保证数据一致性,MyBatis提供了一些策略,如清空缓存、刷新缓存等。 总结来说,MyBatis的一级缓存和二级缓存是提高...

    Redis用作二级缓存

    - 数据一致性:由于缓存和数据库可能存在数据不一致,需要权衡更新策略,如Write-Behind(异步更新)、Write-Through(同步更新)等。 - 过期策略:设置合理的缓存过期时间,避免长时间未使用的数据占用资源。 - 键...

    缓存架构设计细节二三事

    1. **数据一致性管理**:引入更加完善的机制来确保缓存与数据库之间的一致性,例如使用更高级别的缓存更新策略或分布式事务管理方案。 2. **智能缓存策略**:根据数据的访问模式和变化频率自动调整缓存策略,比如...

    实时更改图层过滤条件及更新地图缓存

    总的来说,这个范例展示了如何利用SuperMap iObject Java组件在GIS应用中实现实时过滤和缓存更新,这对于大数据量、高动态性的地图服务尤其重要。通过这种方式,开发者可以构建出响应快速、信息准确的地图系统,满足...

    解决IBatis缓存动态字段问题

    ### 解决IBatis缓存动态字段问题 #### 背景与问题描述 在使用IBatis框架处理数据库操作时,可能会遇到动态数据表名、动态字段名的情况。这种情况下,由于IBatis的缓存机制,可能导致字段找不到的问题。具体表现为...

    分页缓存

    5. **缓存更新策略**:考虑到数据的实时性,我们需要定义一种缓存更新策略。比如,当数据发生变化时,可以监听数据库的变更事件,或者在更新数据后手动清除相关的缓存条目。 6. **并发控制**:在多线程环境下,要...

    Cache 缓存数据和删除缓存的简单示例

    例如,当数据库中的数据发生变化时,可以触发一个事件,调用`Cache.Remove`来清除相关的缓存项。 在实际开发中,为了提高缓存的效率和可维护性,可以采用缓存策略设计,如Least Recently Used (LRU)、First In ...

    Hibernate一级缓存和二级缓存

    2. **缓存同步**:数据库和缓存的数据同步是挑战,需要处理好缓存失效和更新的问题。 3. **性能优化**:不是所有的数据都适合缓存,需要评估成本和收益,避免缓存成为性能瓶颈。 **源码和工具** 在深入理解...

    springMybatis+redis三级缓存框架

    这通常需要在更新数据库时同步清除或更新相关的缓存项。 2. **缓存穿透**:防止无效请求穿透到数据库,可以设置布隆过滤器来过滤掉不可能存在的数据请求。 3. **缓存雪崩**:多个缓存同时过期可能导致大量请求涌向...

    查看缓存 清除缓存

    对于不常更新的内容,如离线地图,清除缓存可能意味着需要重新下载。 9. **注意事项**:在清理系统重要应用的缓存前,如系统设置或邮件应用,确保了解清理可能带来的影响,因为某些应用的缓存数据可能会影响其正常...

Global site tag (gtag.js) - Google Analytics