java仿redis对变量设置过期时间方法setex
在java里的一个线程中如要需要在间隔很短时间内频繁的去调用redis服务读写数据,jedis包有可能会报连接异常错误,因redis本身就有他的局限性,经研究发现,redis的setex这个方法不适合在较短时间内(10秒内)频繁对同一个key写入,否则会报连接异常错误,导致程序中断,因此本人专门针到这一点写了个java变量过期实现类。...
·
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() {
@Override
public 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() {
@Override
public 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!");
}
}
更多推荐
已为社区贡献1条内容
所有评论(0)