缓存简单实现
老翟笔记今日分享的是:缓存简单实现
时间和次数触发更新;有缓存雪崩的情况,更新有更新锁,还是有点并发问题,不适用于高并发,不严谨,简单实现. /*** 有一个更新就可以了,不要都更新 <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")@ResponseBodypublic 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;}}本文结束,感谢您的阅读和支持,希望以上内容能给你带来帮助。本文章来自网络,由老翟笔记小编团队整理发布。
- 随机文章
- 热门文章
- 热评文章
- 微信公众号开通流量主门槛降至100粉丝
- 比亚迪杀疯了!宋PLUS DM-i荣耀版价格出炉:起售仅12.98万
- 《王者荣耀》全新玩法“变身大作战”今日上线:可变身白菜狗、辣椒鸡等
- 首例厂商担责的无人驾驶:路特斯发布“平行车手”功能
- 泰山队中超首战不留力,2将复出+小德替费南多,贾德松斗冤家中锋
- 内燃机不死!布加迪官宣全新V16发动机:声如天籁
- 中纪委:强化以案促改以案促治,推动重塑健康清爽足球联赛环境
- 33.98万元起!2024款理想L8发布:全系空悬+十点按摩