这世界有一种人,从来不遗憾,他们与哪些成功学再无牵手的机会。只是认为当下想这样做,于是就去做了。活在当下,做自己人生的主人公,仅此而已
<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还剩下多久时间过期

stringRedisTemplate 获取对象 stringredistemplate api_redis

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"。

stringRedisTemplate 获取对象 stringredistemplate api_数据_02

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大小。