前言
在日常开发中,经常会遇到调用第三方接口以实现某些功能的需求,在调用此类接口时,一般都需要传递一个接口调用凭据(通常称作token),这个token一般都会有个过期时间,token每天可生成的次数都是有限的,并且重复获取将导致上次获取的token失效。
为了使这个token的使用次数最大化,我们最好能在token过期之前重复使用已生成的token,在token过期时再去调用生成新的token,而这样简单的功能如果借助数据库去存储就显得有点麻烦并且也没有必要,因而想到设计一个工具类,来实现对含有过期时间的对象的保存。
需求:
先来整理下需求
1.此工具类保存的数据结构类型为键值对型(key-value);
2.通过key可以获取对应的value;
3.保存的数据含有过期时间,当数据过期时,通过key获取到的值应为null;
4.过期时间可自定义。
代码实现:
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
public class ExpireDataUtil {
private static Map<String,ExpireData> map = new HashMap();
//添加一个键值对
public static void add(String key,String value,long expireSeconds){
ExpireData expireData = new ExpireData(key,value,expireSeconds);
map.put(key,expireData);
}
//根据key获取value
public static String get(String key){
ExpireData expireData = map.get(key);
if(expireData == null){
return null;
}
long nowTime = System.currentTimeMillis() / 1000;
if(nowTime < expireData.getEndTime()){
return expireData.getValue();
}else{
return null;
}
}
//保存数据的内部数据类
@Data
static class ExpireData{
private String key;
private String value;
private long expireSeconds;//过期时长
private long startTime;//保存时间
private long endTime;//过期时间
public ExpireData(String key, String value, Long expireSeconds) {
this.key = key;
this.value = value;
this.expireSeconds = expireSeconds;
this.startTime = System.currentTimeMillis() / 1000;
this.endTime = startTime + expireSeconds;
}
}
}
实际应用:
public static String getAccessToken() {
// API Key
String clientId = "******";
// Secret Key
String clientSecret = "******";
String token = ExpireDataUtil.get("baiduToken");
if(null == token){
String tempToken = getAccessToken(clientId, clientSecret);
ExpireDataUtil.add("baiduToken",tempToken,2591000);
return tempToken;
}else{
return ExpireDataUtil.get("baiduToken");
}
}