java仿redis对变量设置过期时间方法setex
1、应用背景
在java里的一个线程中如要需要在间隔很短时间内频繁的去调用redis服务读写数据,jedis包有可能会报连接异常错误,因redis本身就有他的局限性,经研究发现,redis的setex这个方法不适合在较短时间内(10秒内)频繁对同一个key写入,否则会报连接异常错误,导致程序中断,因此本人专门针到这一点写了个java变量过期实现类。
2、代码实现
CacheService.java
package com.liu.service;import java.util.Date;
import java.util.HashMap;
import java.util.Map;public class CacheService {private Map<String, Map<String, Object>> map = new HashMap<String, Map<String, Object>>();/*** 设置变量值* @param key* @param ex 保存的时间毫秒* @param value 变量值*/public void setex(String key, Long ex, String value){Map<String, Object> m = new HashMap<String,Object>();m.put("ex", ex); //剩余的时间毫秒m.put("extime", new Date().getTime() + ex); //具体过期的时间戳毫秒m.put("value", value);map.put(key, m);}public String get(String key){expor(key);if(map.containsKey(key)){Map<String, Object> obj = map.get(key);return String.valueOf(obj.get("value"));}return null;}/*** 计算剩余时间* @param key*/private void expor(String key){if(map.containsKey(key)){Map<String, Object> obj = map.get(key);Long ex = (Long) obj.get("ex");Long extime = (Long) obj.get("extime");if(extime < new Date().getTime()){map.remove(key);}else{obj.put("ex", extime - new Date().getTime());map.put(key, obj);}}}/*** 获取变量剩余时间* @param key* @return*/public Long ttl(String key){expor(key);if(map.containsKey(key)){return (Long) map.get(key).get("ex");}return null;}
}
测试调用main
package com.liu;import com.liu.service.CacheService;public class Test {public static void main(String[] args) {CacheService cache = new CacheService();cache.setex("liuliu", 20000L, "您好");new Thread(new Runnable() {@Overridepublic void run() {while (true){System.out.println(cache.ttl("liuliu")+", "+cache.get("liuliu")+", "+cache.get("a1"));try{Thread.sleep(1000);}catch (Exception e){e.printStackTrace();}}}}).start();new Thread(new Runnable() {@Overridepublic void run() {while (true){cache.setex("liuliu", 2000L, "哈哈");cache.setex("a1", 3000L, "欧维");try{Thread.sleep(4000);}catch (Exception e){e.printStackTrace();}}}}).start();System.out.println("ok!");}}
java仿redis对变量设置过期时间方法setex相关推荐
- c# redis hashid如何设置过期时间_Redis数据库实现原理(划重点)
Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中,db数组的每一项都是一个redis.h/redisDb结构,每个redisDb结构代表一个数据库, ...
- c# redis hashid如何设置过期时间_Redis中Key过期策略amp;淘汰机制
1. Redis中设置Key过期时间 我们有两种方式设置过期时间 1.1 设置多久后过期 设置一个 key 10s 过期,可以这样 127.0.0.1:6379> SET key value E ...
- redis: string类型设置过期时间后 再进行set操作,会清除过期时间
redis的set操作实际上是: 删除之前的key,再创建一个新的key,所以之前key就会被删除连带赋予的过期时间, 这时我们建议使用setrange 命令进行覆盖操作,避免过期时间被删除. red ...
- redis文档翻译_key设置过期时间
Available since 1.0.0. 使用開始版本号1.01 Time complexity: O(1) 时间复杂度O(1) 出处:http://blog.csdn.net/colum ...
- Sringboot2.x整合Redis缓存,设置过期时间
目录结构: pom.xml <dependencies><!--Spring整合redis包 --><dependency><groupId>org.s ...
- springboot开启redis共享session设置过期时间
开启Redis共享sessions的配置类的注解设置maxInactiveIntervalInSeconds的值,单位为秒,默认值为1800秒 /*** redis-session配置类,默认过期时间 ...
- 利用redis保存验证码并设置过期时间
package com.atguigu.jedis;import redis.clients.jedis.Jedis;import java.util.Random;public class Phon ...
- spring-data-redis 使用pipeline批量设置过期时间的bug
redis没有批量设置过期时间的命令,所以当我们需要为多个key设置过期时间时,只能循环调用expire或pExpire命令为每个key设置过期时间,为了提高性能,我打算使用pipeline来批量操作 ...
- 玩转Redis-干掉钉子户-没有设置过期时间的key
<玩转Redis>系列文章 by zxiaofan主要讲述Redis的基础及中高级应用.本文是<玩转Redis>系列第[15]篇,最新系列文章请前往 公众号"zx ...
最新文章
- 计算机程序的思维逻辑 (43) - 剖析TreeMap
- Javascript中的自执行匿名函数
- spring mvc之HandlerMapping
- 【jetson nano】 aarch64安装pycharm pytorch cuda
- 《SAS编程与数据挖掘商业案例》学习笔记之十二
- 修改MYSQL最大连接数的3种方法
- Java飞机大战敌机消失_Shoot 飞机大战,功能是子弹打在敌机上, 消失 且在内存中 , 小蜜蜂上同理 Games 游戏 247万源代码下载- www.pudn.com...
- java web项目初始化启动一个java方法
- ubuntu php 扩展目录_MacOS搭建PHP开发环境
- Bitset的一些总结
- shell脚本显示颜色的设置
- HDU2030-汉字机内码
- 大气压力换算公式_大气压换算公式(大气压与温度换算公式)
- java毕业设计对外汉语教学辅助平台Mybatis+系统+数据库+调试部署
- Java之HashMap系列--HashMap扩容的原理
- oracle数据库:查询平均分时,保留小数位数
- MP4/MPEG4/3GP转换软件至尊---《MP4/RM转换专家》小记
- 使用CRM客户关系管理系统的好处有哪些?
- google海底光缆图_SubmarineCableMap:世界海底光缆分布图
- 苹果手机咋截屏_苹果手机信号满格但是没网络咋处理