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相关推荐

  1. c# redis hashid如何设置过期时间_Redis数据库实现原理(划重点)

    Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中,db数组的每一项都是一个redis.h/redisDb结构,每个redisDb结构代表一个数据库, ...

  2. c# redis hashid如何设置过期时间_Redis中Key过期策略amp;淘汰机制

    1. Redis中设置Key过期时间 我们有两种方式设置过期时间 1.1 设置多久后过期 设置一个 key 10s 过期,可以这样 127.0.0.1:6379> SET key value E ...

  3. redis: string类型设置过期时间后 再进行set操作,会清除过期时间

    redis的set操作实际上是: 删除之前的key,再创建一个新的key,所以之前key就会被删除连带赋予的过期时间, 这时我们建议使用setrange 命令进行覆盖操作,避免过期时间被删除. red ...

  4. redis文档翻译_key设置过期时间

    Available since 1.0.0.    使用開始版本号1.01 Time complexity: O(1)  时间复杂度O(1) 出处:http://blog.csdn.net/colum ...

  5. Sringboot2.x整合Redis缓存,设置过期时间

    目录结构: pom.xml <dependencies><!--Spring整合redis包 --><dependency><groupId>org.s ...

  6. springboot开启redis共享session设置过期时间

    开启Redis共享sessions的配置类的注解设置maxInactiveIntervalInSeconds的值,单位为秒,默认值为1800秒 /*** redis-session配置类,默认过期时间 ...

  7. 利用redis保存验证码并设置过期时间

    package com.atguigu.jedis;import redis.clients.jedis.Jedis;import java.util.Random;public class Phon ...

  8. spring-data-redis 使用pipeline批量设置过期时间的bug

    redis没有批量设置过期时间的命令,所以当我们需要为多个key设置过期时间时,只能循环调用expire或pExpire命令为每个key设置过期时间,为了提高性能,我打算使用pipeline来批量操作 ...

  9. 玩转Redis-干掉钉子户-没有设置过期时间的key

      <玩转Redis>系列文章 by zxiaofan主要讲述Redis的基础及中高级应用.本文是<玩转Redis>系列第[15]篇,最新系列文章请前往 公众号"zx ...

最新文章

  1. 计算机程序的思维逻辑 (43) - 剖析TreeMap
  2. Javascript中的自执行匿名函数
  3. spring mvc之HandlerMapping
  4. 【jetson nano】 aarch64安装pycharm pytorch cuda
  5. 《SAS编程与数据挖掘商业案例》学习笔记之十二
  6. 修改MYSQL最大连接数的3种方法
  7. Java飞机大战敌机消失_Shoot 飞机大战,功能是子弹打在敌机上, 消失 且在内存中 , 小蜜蜂上同理 Games 游戏 247万源代码下载- www.pudn.com...
  8. java web项目初始化启动一个java方法
  9. ubuntu php 扩展目录_MacOS搭建PHP开发环境
  10. Bitset的一些总结
  11. shell脚本显示颜色的设置
  12. HDU2030-汉字机内码
  13. 大气压力换算公式_大气压换算公式(大气压与温度换算公式)
  14. java毕业设计对外汉语教学辅助平台Mybatis+系统+数据库+调试部署
  15. Java之HashMap系列--HashMap扩容的原理
  16. oracle数据库:查询平均分时,保留小数位数
  17. MP4/MPEG4/3GP转换软件至尊---《MP4/RM转换专家》小记
  18. 使用CRM客户关系管理系统的好处有哪些?
  19. google海底光缆图_SubmarineCableMap:世界海底光缆分布图
  20. 苹果手机咋截屏_苹果手机信号满格但是没网络咋处理

热门文章

  1. php作业批改系统源码,在线|WEB作业批改系统
  2. 记录-老联想笔记本安装 centos8
  3. Ubuntu20.04LTS R语言安装和RStudio配置
  4. 史上最全电子元器件实物外形图+电路符号
  5. 西方情人节前一天的话
  6. 南昌大学计算机导师林振荣,南昌大学各学院研究生导师介绍
  7. 面向对象开发期末复习概述(三)
  8. 用Python爬虫获取NBA球员的生涯数据
  9. java校验中文姓名合法性(需要支持生僻字与分隔符·)
  10. 搞计算机的真的不配拥有爱情吗。这是她给我留下的最后一段话