一:浩句
這世界有一種人,從來不遺憾,他們與哪些成功學(xué)再無牽手的機(jī)會空闲。只是認(rèn)為當(dāng)下想這樣做,于是就去做了÷腔遥活在當(dāng)下,做自己人生的主人公钝凶,僅此而已
<h5 align = "right">----------------《不畏將來不戀過去》</h5>
二:背景
最近不是在做redis緩存嘛,之前也用過,但是最近用了發(fā)現(xiàn)做時間緩存好麻煩甫何,所以看看是否可以簡便點(diǎn)出吹,順便也記載下來,專門用來寫spring-data-redis 中RedisTemplate api使用辙喂。
三:問題
3.1最近在做token的驗證,那么token就有有效期的問題,對于有效期的問題捶牢,每次都是將token當(dāng)作key,value就是userid_time_,代表其他根據(jù)自己需求進(jìn)行鸠珠。
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;
}
/**
* 設(shè)置緩存值
* @param key
* @param value
*/
public void setCacheValue(String key,String value){
redisTemplate.opsForValue().set(key, value);
}
/**
* 設(shè)置緩存值并設(shè)置有效期
* @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;
}
/**
* 設(shè)置一個自增的數(shù)據(jù)
* @param key
* @param growthLength
*/
public void testInc(String key,Long growthLength){
redisTemplate.opsForValue().increment(key, growthLength);
}
}
自己在生成token后,將value=userid_time當(dāng)作可以秋麸,然后使用上述的
public void setCacheValueForTime(String key,String value,long time);
來緩存,其中time我設(shè)置的類型是秒渐排。
然后在做驗證的時候根據(jù)token取出value,再按照"_"進(jìn)行拆分取到時間,在對時間跟當(dāng)前時間做對比竹勉。
所以這樣做是否很麻煩了,當(dāng)然麻煩了飞盆,所以既然我設(shè)置了過期時間,那么我是否還可以拿到這個token還剩下多久時間過期
在其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;
}
一個是獲取有效時間,一個是可以指定時間類型返回次乓。
下面是我做的測試,我設(shè)置token的有效期是30分鐘也就是1800秒,前面timeTypeMin是指定分鐘返回的數(shù)據(jù)吓歇,time是getExpireTime(String key)返回數(shù)據(jù),timeType是指定秒返回的數(shù)據(jù)。
{
"resultCode": "00000",
"resultMsg": "SUCCESS",
"resultMap": {
"result": {
"timeTypeMin": 6,
"time": 396,
"timeType": 395
}
}
}
3.3在linux上查看的方式
可以使用ttl key可以看到剩余時間票腰。如果該key已經(jīng)過期,將返回"-2"城看。
代碼測試返回結(jié)果如下:getExpire的方法返回-2,其他返回都是0
{
"resultCode": "00000",
"resultMsg": "SUCCESS",
"resultMap": {
"result": {
"timeTypeMin": 0,
"time": -2,
"timeType": 0
}
}
}
3.4有關(guān)incr的用法
在生成token的時候我有考慮使用一串隨機(jī)數(shù)然后在加上一個字增的數(shù)據(jù),在redis中可以使用incr的方式實(shí)現(xiàn),那么在redisTemplate的實(shí)現(xiàn)方式
public void testInc(String key,Long growthLength){
redisTemplate.opsForValue().increment(key, growthLength);
}
這里如果key不存在則會設(shè)置為growthLength大小,如果已經(jīng)存在,則會在已經(jīng)存在的基礎(chǔ)上加growthLength大小杏慰。
四:浩語
__
__ _ ____ __| |__ _____ ___
\ \/ \/ / | \ | \\__ \ / _ \
\ /| | / Y \/ __ \( <_> )
\/\_/ |____/|___| (____ /\____/
\/ \/
任何事情都是要靠努力和用心测柠。