这世界有一种人,从来不遗憾,他们与哪些成功学再无牵手的机会。只是认为当下想这样做,于是就去做了。活在当下,做自己人生的主人公,仅此而已
<h5 align = "right">----------------《不畏将来不恋过去》</h5>
二:背景
最近不是在做redis缓存嘛,之前也用过,但是最近用了发现做时间缓存好麻烦,所以看看是否可以简便点,顺便也记载下来,专门用来写spring-data-redis 中RedisTemplate api使用。
三:问题
3.1最近在做token的验证,那么token就有有效期的问题,对于有效期的问题,每次都是将token当作key,value就是userid_time_,代表其他根据自己需求进行。
3.2自己首先的做法
import java.util.concurrent.TimeUnit;
import javax.annotation.Resource;
import org.springframework.data.redis.core.RedisTemplate;
public class RedisServer {
@Resource(name = "redisTemplate")
RedisTemplate<String, Object> redisTemplate;
/**
* 获取缓存的地址
* @param cacheKey
* @return
*/
public String getCacheValue(String cacheKey){
String cacheValue=(String)redisTemplate.opsForValue().get(cacheKey);
return cacheValue;
}
/**
* 设置缓存值
* @param key
* @param value
*/
public void setCacheValue(String key,String value){
redisTemplate.opsForValue().set(key, value);
}
/**
* 设置缓存值并设置有效期
* @param key
* @param value
*/
public void setCacheValueForTime(String key,String value,long time){
redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
}
/**
* 删除key值
* @param key
*/
public void delCacheByKey(String key){
redisTemplate.opsForValue().getOperations().delete(key);
redisTemplate.opsForHash().delete("");
}
/**
* 获取token的有效期
* @param key
*/
public long getExpireTime(String key){
long time = redisTemplate.getExpire(key);
return time;
}
/**
* 指定时间类型---秒
* @param key
* @return
*/
public long getExpireTimeType(String key){
long time = redisTemplate.getExpire(key,TimeUnit.SECONDS);
return time;
}
/**
*
* @param key---分
* @return
*/
public long getExpireTimeTypeForMin(String key){
long time = redisTemplate.getExpire(key,TimeUnit.MINUTES);
return time;
}
/**
* 设置一个自增的数据
* @param key
* @param growthLength
*/
public void testInc(String key,Long growthLength){
redisTemplate.opsForValue().increment(key, growthLength);
}
}
自己在生成token后,将value=userid_time当作可以,然后使用上述的
public void setCacheValueForTime(String key,String value,long time);
来缓存,其中time我设置的类型是秒。
然后在做验证的时候根据token取出value,再按照"_"进行拆分取到时间,在对时间跟当前时间做对比。
所以这样做是否很麻烦了,当然麻烦了,所以既然我设置了过期时间,那么我是否还可以拿到这个token还剩下多久时间过期
Paste_Image.png
在其API中看到这两个方法,所以就有了上面的
public long getExpireTime(String key){
long time = redisTemplate.getExpire(key);
return time;
}
/**指定秒*/
public long getExpireTimeType(String key){
long time = redisTemplate.getExpire(key,TimeUnit.SECONDS);
return time;
}
/**指定分钟*/
public long getExpireTimeTypeForMin(String key){
long time = redisTemplate.getExpire(key,TimeUnit.MINUTES);
return time;
}
一个是获取有效时间,一个是可以指定时间类型返回。
下面是我做的测试,我设置token的有效期是30分钟也就是1800秒,前面timeTypeMin是指定分钟返回的数据,time是getExpireTime(String key)返回数据,timeType是指定秒返回的数据。
{
"resultCode": "00000",
"resultMsg": "SUCCESS",
"resultMap": {
"result": {
"timeTypeMin": 6,
"time": 396,
"timeType": 395
}
}
}
3.3在linux上查看的方式
可以使用ttl key可以看到剩余时间。如果该key已经过期,将返回"-2"。
linux_Image.png
代码测试返回结果如下:getExpire的方法返回-2,其他返回都是0
{
"resultCode": "00000",
"resultMsg": "SUCCESS",
"resultMap": {
"result": {
"timeTypeMin": 0,
"time": -2,
"timeType": 0
}
}
}
3.4有关incr的用法
在生成token的时候我有考虑使用一串随机数然后在加上一个字增的数据,在redis中可以使用incr的方式实现,那么在redisTemplate的实现方式
public void testInc(String key,Long growthLength){
redisTemplate.opsForValue().increment(key, growthLength);
}
这里如果key不存在则会设置为growthLength大小,如果已经存在,则会在已经存在的基础上加growthLength大小。