java 线程实时更新缓存

废话不多说,直接上代码

spring+jdbc框架

第一步:配置spring文件,当web程序运行时,初始化一个类(为了让实习生能更好地理解,我就通俗点说:意思就是当程序运行时,便执行一个类里面的所有方法,大神们别喷,我也是新手)

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
    <span style="white-space:pre">	</span>http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    <span style="white-space:pre">	</span>http://www.springframework.org/schema/context
    <span style="white-space:pre">	</span>http://www.springframework.org/schema/context/spring-context-2.5.xsd
	http://www.springframework.org/schema/tx
	http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
	http://www.springframework.org/schema/aop
	http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop">
	
	<!-- 初始化系统参数 -->
	<bean id="initialization" class="com.xtown.smartcity.Initialization"
		scope="singleton" init-method="init"> 
	</bean>
	
</beans>

第二步:初始化的

Initialization类,此类继承了ServletContextAware是为了能获得里面的一些接口方法,至于有什么用,请实习生们详细查询ServletContext是什么,有什么作用,或者看spring文档,当程序运行,便会通过spring配置文件初始化Initialization类里面的方法,通常是需要实现一些程序一开始运行便要实现的一些功能,例如实时更新,线程之类的。

/**
 * 
 * 项目名称:SEAutoBizshow <br />
 * 类名称:InitializationService <br />
 * 类描述: 初始化系统参数 <br />
 * 创建人:panpan <br />
 * 创建时间:2013-7-24 下午07:42:58 <br />
 * 修改人:panpan <br />
 * 修改时间:2013-7-24 下午07:42:58 <br />
 * 修改备注: <br />
 * 
 * @version
 */
public class Initialization implements ServletContextAware {
	ServletContext context;
	@Resource
	AdminUserService adminUserService;
	
	public void setServletContext(ServletContext context) {
		this.context = context;
	}

	public void init() { //大家着重看这里,这里就是程序开始就必须要初始化的一些方法,方法体可以直接写在本类,或者自己封装类来调用。
		initContentPath();
		initRes();
		initAdminUser();
		CacheManager.RunTask();//这个便是本人封装的类,也是本人需要程序一开始便要执行的方法,里面有一些静态方法供本人调用的,下面会贴出来给大家看的。
	}

	/**
	 * 初始化项目路径
	 */
	public void initContentPath() {
		/** 设置项目名 */
		String contextPath = context.getContextPath().replace('\\', '/');
		context.setAttribute("path", contextPath);
		context.setAttribute("webpath", Global.WebPath);
	}

	/**
	 * 
	 * 方法名: initRes <br />
	 * 描述: 初始化菜单资源<br />
	 * 参数:<br />
	 * <br />
	 * 
	 * @return void <br />
	 * @throws
	 */
	public void initRes() {
		ResXmlParser.getInstance().getUriResources();
	}

	/**
	 * 创建后台超级管理员
	 */
	public void initAdminUser() {
		adminUserService.doInitUser();
	}

}

第三步:这是本人封装的缓存类,里面封装了一些处理缓存的方法,也是第一步的spring配置文件初始化、第二步的类里面调、第三步的封装类的方法。

package com.xtown.web.util.cache;

import java.util.HashMap;


public class CacheManager {
	
	public static HashMap cacheMap = new HashMap();   
	  
    //得到缓存。同步静态方法   
    public static Object getCache(String key) {   
        return (Object) cacheMap.get(key);   
    }  
    //载入json缓存
    public static void putCache(String key, Object obj) {   
        cacheMap.put(key, obj);   
    }
  
    //判断是否存在一个缓存   
    public synchronized static boolean hasCache(String key) {   
        return cacheMap.containsKey(key);   
    }   
  
    //清除所有缓存   
    public synchronized static void clearAll() {   
        cacheMap.clear();   
    }   
  
    //清除指定的缓存   
    public synchronized static void clearOnly(String key) {   
        cacheMap.remove(key);   
    }   

  
    //获取缓存中的大小   
    public static int getCacheSize() {   
        return cacheMap.size();   
    }   
    public static void RunTask(){//这就是第二步初始化的类要调用的方法。
		new ClearCacheTask().start();
	}
    
}

第四步:这是第三步调用另一个类里面的方法,这个类就是线程类,当程序运行后,这个线程便会执行,而且一直执行下去,设置好时间就可以实现实时更新缓存了。

package com.xtown.web.util.cache;


public class ClearCacheTask extends Thread{//继承线程类<span style="font-family: Arial, Helvetica, sans-serif;">Thread</span>

<span style="white-space:pre">	</span>        //重写线程类run方法
		@Override
		public void run() {
			try {
				while (true) {//循环,当为true是便会执行下面的代码块
					System.out.println("********************cacheMap*******************");
					Thread.sleep(5*60*1000);//设置时间,这里是设置5分钟,格式是:24*60*60*1000(时*分*秒*毫秒)
					CacheManager.cacheMap.clear();//这个就是调用封装类里面的清理缓存的方法
				}
				
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
		}
    }

第五步:就是要实现的逻辑功能,当用户输入参数,就会执行下面方法。

package com.xtown.smartcity.controller.mobile;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.xtown.smartcity.DataTypes;
import com.xtown.smartcity.DeviceInfo;
import com.xtown.smartcity.Globals;
import com.xtown.smartcity.XpsActionParams;
import com.xtown.smartcity.info.App;
import com.xtown.smartcity.info.City;
import com.xtown.smartcity.info.Content;
import com.xtown.smartcity.info.Favorites;
import com.xtown.smartcity.info.Msgready;
import com.xtown.smartcity.info.Service;
import com.xtown.smartcity.info.Topics;
import com.xtown.smartcity.info.Topicstyle;
import com.xtown.smartcity.info.UserInfo;
import com.xtown.smartcity.info.Usermsg;
import com.xtown.smartcity.service.MobileApiService;
import com.xtown.smartcity.service.MobileSsoService;
import com.xtown.web.util.DateTimeUtil;
import com.xtown.web.util.NumberUtil;
import com.xtown.web.util.StringUtil;
import com.xtown.web.util.cache.CacheManager;

/**
 * 接口
 * @author liangli
 *
 */
@Controller
@RequestMapping("/mobile/city/*")
public class CityController extends BaseMobileController {

	@Resource
	MobileApiService service;
	@Resource
	MobileSsoService sso;

	/**
	 * 城市公共信息
	 * @param request
	 * @param response
	 * @return
	 */
	@RequestMapping("public")
	public void publicInfos(HttpServletRequest request, HttpServletResponse response) throws Exception {
		//判断是否存在缓存
		if(!CacheManager.hasCache(key)){
			
//这里就是你要实现逻辑的地方,你需要缓存什么数据,就去查,查出来的数据,就调用CacheManager封装类里面的方法,把数据缓存起来,缓存里面没有数据,就会执行这里
CacheManager.putCache(key, jo.toString());//封装类里面的载入需要缓存起来的json数据。
		}else{
		//这里就是如果缓存里面有数据,就会一直从缓存里面拿数据,至于怎么写,就看你自己了,一般都是先从缓存里面拿出json数据,然后再输出到客户端去。
outputJson((String)CacheManager.getCache(key), response)//这句代码就是输入json数据,里面的第一个参数就是从缓存里面get出你之前缓存起来的数据,第二个参数就不用说,意思很明显,就是响应,这是新手中的新手都会的一个参数,我就不多说了,不懂就去找度娘查HttpServletResponse
}

	}
}

整体实现一个java 实时更新缓存数据的问题就是这样了,我为那些实习生,还有刚毕业出来工作的程序员,重新整理下思路,当初本人做的不是这样,本人做的有够复杂的,就是在spring配置文件里面配一大堆,然后又写一大堆代码才能实现,结果到最后还是给经理劈头盖脑地狠骂一顿,然后对我说出用线程方法,一步一步实现,到最后,我才明白,简单,很简单,只需要自己写的不到30句代码就搞定,比我配置spring文件配生配死,然后写一大堆代码才能实现的好得多,有开发经验的经理就是不同,放的屁都香过人的。好了,废话说多了,下面我整理下:

第一步配置spring文件,初始化Initialization,第二步创建一个Initialization实现ServletContextAware,调用第三步的封装类里面的方法。第三步封装一个缓存类,里面写一些载入缓存,清除缓存的方法,供调用。第四步建一个ClearCacheTask类 继承Thread类,重写run方法,run方法里面实现一些需要实现的功能,例如需要清除缓存,就在里面调用第三步缓存类里面的方法就可以了。第五步,也是最后一步,实现逻辑,出自己需要查的数据,然后调用封装缓存类里面的方法。