Java实现redis缓存效果变量过期
Posted 赵广陆
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java实现redis缓存效果变量过期相关的知识,希望对你有一定的参考价值。
目录
1 实现
redis中的Expire命令用于设置 key 的过期时间,key 过期后将不再可用。不过有些变量我们不需要设置到redis中,只要存到本地就可以了,也需要过期时间,也可以同样方法定义一个全局变量的map之后键是变量,值是时间每次都进行比较。
public class ExpireModel<T>
/**
* 值
*
*/
private T value;
/**
* 值设置时间(时间戳,毫秒)
*
* @author ybwei
*/
private Long setTime;
/**
* 过期时长(毫秒)
*/
private Long expireTime;
/**
* @param value
* @param expireTime
*/
public ExpireModel(T value, Long expireTime)
super();
this.value = value;
this.expireTime = expireTime;
this.setTime = System.currentTimeMillis();
/**
* @Description:
* @return
*/
public T getValue()
T result = null;
if (System.currentTimeMillis() - this.setTime <= this.expireTime)
result = this.value;
return result;
2 测试
/**
* @throws InterruptedException
* @Description:
*/
@Test
public void testExpire() throws InterruptedException
// 失效时间1秒
ExpireModel<String> em = new ExpireModel<>("aa", 1000L);
log.info("value:", em.getValue());
// 休眠时间2秒
TimeUnit.SECONDS.sleep(2);
log.info("value:", em.getValue());
结果展示:
[INFO ] 2022-08-27 11:32:46.680 [main] com.spring.pro.test.model.ExpireTest - value:aa
[INFO ] 2022-08-27 11:32:48.692 [main] com.spring.pro.test.model.ExpireTest - value:null
3 接口
import javax.annotation.PostConstruct;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.spring.pro.model.ExpireModel;
@RestController
public class IndexController
private ExpireModel<String> em = null;
/**
* 失效时间(2秒)
*
*/
private Long expireTime = 10 * 1000L;
private int index = 0;
/**
* @Description:
* @Author: ybwei
* @Date: 2019年12月25日 上午11:14:58
*/
@PostConstruct
public void init()
em = new ExpireModel<String>("aa", expireTime);
/**
* @Description:
* @return
*/
@GetMapping("/getValue")
public String getValue()
String value = em.getValue();
if (value == null)
value="bb" + index;
em = new ExpireModel<String>(value, expireTime);
index++;
return value;
4 使用HashMap方法实现
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;
以上是关于Java实现redis缓存效果变量过期的主要内容,如果未能解决你的问题,请参考以下文章