Java的Spring内实现的mini版内存"计数器"功能
工期紧急,不让用Redis,自己实现了一个Spring内的mini版内存"计数器"功能,很简陋,和业务耦合太紧密,需要改进。
public Long getCreationCounter() { String attributeNameCreationCounter = "CreationCounter"; Long attributeValueCreationCounter = 0L; boolean containsCreationCounter = false; String attributeNameExpirationDateTime = "ExpirationDateTime"; Long attributeValueExpirationDateTime = 0L; boolean containsExpirationDateTime = false; Enumeration<String> attributeNames = ContextUtil.servletContext.getAttributeNames(); while(attributeNames.hasMoreElements()) { String name = attributeNames.nextElement(); if(!containsCreationCounter && name.equals(attributeNameCreationCounter)){ containsCreationCounter = true; } if(!containsExpirationDateTime && name.equals(attributeNameExpirationDateTime)){ containsExpirationDateTime = true; } if(containsCreationCounter && containsExpirationDateTime){ break; } } boolean isExpired = false; if(containsExpirationDateTime){//包含超期时间 Object attributeValueExpirationDateTimeObj = ContextUtil.servletContext.getAttribute(attributeNameExpirationDateTime); if(attributeValueExpirationDateTimeObj == null || attributeValueExpirationDateTimeObj.equals("")){//超期时间为空 isExpired = true; } else{//超期时间非空 attributeValueExpirationDateTime = (Long)ContextUtil.servletContext.getAttribute(attributeNameExpirationDateTime); Long nowDateTime = (new Date()).getTime(); if(nowDateTime < attributeValueExpirationDateTime ){//当前时间小于超期时间,未超期 isExpired = false; }else{//已超期 isExpired = true; } } }else{//不含超期时间 isExpired = true; } if (isExpired) {//已超期 attributeValueCreationCounter = getCreationCounter(attributeNameCreationCounter); getExpirationDateTimeNew(attributeNameExpirationDateTime); } else {//未超期 if(containsCreationCounter){//包含计数器 Object attributeValueCreationCounterObj = ContextUtil.servletContext.getAttribute(attributeNameCreationCounter); if(attributeValueCreationCounterObj == null || attributeValueCreationCounterObj.equals("")){//计数器为空 attributeValueCreationCounter = getCreationCounter(attributeNameCreationCounter); } else{//计数器非空 attributeValueCreationCounter = (Long)ContextUtil.servletContext.getAttribute(attributeNameCreationCounter); } } else {//不含计数器 attributeValueCreationCounter = getCreationCounter(attributeNameCreationCounter); } } return attributeValueCreationCounter; } //生成新的超期时间,并存入上下文。 private void getExpirationDateTimeNew(String attributeNameExpirationDateTime) { Long attributeValueExpirationDateTime = 0L; Date date= new Date(); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.DAY_OF_MONTH, 1);//增加1天 attributeValueExpirationDateTime= calendar.getTime().getTime(); ContextUtil.servletContext.setAttribute(attributeNameExpirationDateTime, attributeValueExpirationDateTime); } //从数据库查询存证量计数器,并存入上下文。 private Long getCreationCounter(String attributeNameCreationCounter) { Long attributeValueCreationCounter; attributeValueCreationCounter = 0L; //从数据库读取数据到存证量计数器 Long creationCounter = ((CreationMapper)storageMapper).getCreationCounter(); attributeValueCreationCounter = attributeValueCreationCounter + creationCounter; ContextUtil.servletContext.setAttribute(attributeNameCreationCounter, attributeValueCreationCounter); return attributeValueCreationCounter; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2011-09-19 我是怎么想着干混事的