因为接口任务调用越来越频繁,导致服务器的压力以及出错的概率提高,因此设置了map缓存token,减少出错概率。
一、单例模式
单例模式是Java中最简单的设计模式之一,属于创建型模式,涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。——来自菜鸟教程
通过我的理解来讲,单例模式并不是创建可复用、多场景需求的对象,而是固定的、各个场景共通的对象变量,可以存放共通的、需要多次拿取的重复内容。
二、map缓存
-
首先需要创建一个单例模式的唯一类,在类中需要将类的初始化方法设为private,防止该类被实例化。
private AccessTokenSingleton() {} -
其次给该对象创建一个map变量存储token以及time时间,创建相应的get和set方法以及获取对象的方法。
-
详细代码见参考网址,大神写的很不错。参考网址:blog.csdn.net/weixin_3820…
三、实际运用
- 在实际运用场景中,将时间信息存入对象的map中,每次调用该类获取token的时候进行判断,当前时间减去初次获取token的时间是否符合条件来判断是否该token信息是否过期。
- 这种时间过期的方式更新token信息属于被动更新,只要有接口需要访问数据的时候才会去服务器获取token,相比较于同事给的建议,设置定时任务每一个小时清空一次map的token信息,这属于主动获取token。在实际场景中,这两种方式没有明显的区别,被动更新token的方式请求服务器的次数会更少,因此比较推荐这种更新机制。
public String getToken() {
AccessTokenSingleton atsl = AccessTokenSingleton.getInstance();
Map<String, String> map = atsl.getMap();
String accessToken = map.get("access_token");
String time = map.get("time");
Long nowDate = new Date().getTime();
if (null != accessToken && null != time && nowDate - Long.parseLong(time) < 7200000) {
LOGGER.info("look time:"+ time + "; look access_token"+ accessToken2);
// 从缓存中读取accessToken数据
return accessToken;
} else {
try {
// 获取token
String tokenUrl = "/xxx/xxxx";
Map<String, Object> params = new HashMap<String, Object>();
params.put("client_secret", "");
params.put("signature_code", "");
params.put("sign", "");
String responseBody = HttpClientUtils.sendPost(tokenUrl, params, null, 5);
Map<String, Object> responseMap = jsonString2Object(responseBody, Map.class);
// 在分布式架构中,建议access_token放到共享缓存中
// 不能频繁获取access_token,建议合理使用expires_in值
accessToken = (String) responseMap.get("access_token");
// 将信息保存进缓存
map.put("time",nowDate + "");
map.put("access_token", accessToken);
} catch (Exception e) {
e.printStackTrace();
}
return accessToken;
}
}