【Java】单例模式map缓存token

1,415 阅读2分钟

因为接口任务调用越来越频繁,导致服务器的压力以及出错的概率提高,因此设置了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;
		}
	}