缓存简单实现

时间和次数触发更新;有缓存雪崩的情况,更新有更新锁,还是有点并发问题,不适用于高并发,不严谨,简单实现.

    /**
     * 有一个更新就可以了,不要都更新  <br/>
     * 切记:获取锁后在finally里释放该锁!!!否则将导致无法获取到锁来更新缓存。<br/>
     * eg:<br/>
     * if(refreshLock.tryLock(1, TimeUnit.SECONDS)){try{}finally{refreshLock.unlock();}}
     */
    private static volatile Lock refreshLock = new ReentrantLock();
    private Map<String,List<String>> cacheXXobjMap = new Hashtable<String,List<String>>();
    private volatile boolean isRefreshSuccess = false;
    private volatile boolean isRefreshing = false;
    private volatile long refreshDateTime = 0;
    private volatile int requestCount = 0; 
    private Stirng key = "xxKey";
    @RequestMapping("/getXXXObjList")
    @ResponseBody
    public List<String> getXXXObjList(HttpSession session, HttpServletRequest request,@RequestParam Map<String, Object> params) {

    	boolean isrequestTooMuch = requestCount > 100;
    	if(isrequestTooMuch) {
    		requestCount = 0;
    	}
    	requestCount++;
    	//如果刷新时间小于1小时且访问次数小于100且已经刷新完成可以直接从缓存中取,否则从数据库中查询并更新缓存
    	if(System.currentTimeMillis()-refreshDateTime<3600000&&!isrequestTooMuch&&isRefreshSuccess&&!isRefreshing) {
    			return cacheXXobjMap.get(key);
    	}
    	isRefreshing = true;
      List<Object> objs = new ArrayList<Object>();
    	try {
	    	objs = jobService.getXXXObjList(params);

			try {
				if (refreshLock.tryLock(500, TimeUnit.MILLISECONDS)) {
					//更新缓存
					try {
							cacheXXobjMap.put(key, objs);
					} finally {
						refreshLock.unlock();
					}
					refreshDateTime=System.currentTimeMillis();
					isRefreshSuccess = true;
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
    		return objs
		}  finally {
			isRefreshing = false;
		}
    }
    

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值