前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于HashMap的过期时间类的设计与应用

基于HashMap的过期时间类的设计与应用

作者头像
小诸葛
发布2020-04-14 15:53:57
1.3K0
发布2020-04-14 15:53:57
举报
文章被收录于专栏:方法论方法论

前言

在日常开发中,经常会遇到调用第三方接口以实现某些功能的需求,在调用此类接口时,一般都需要传递一个接口调用凭据(通常称作token),这个token一般都会有个过期时间,token每天可生成的次数都是有限的,并且重复获取将导致上次获取的token失效。

为了使这个token的使用次数最大化,我们最好能在token过期之前重复使用已生成的token,在token过期时再去调用生成新的token,而这样简单的功能如果借助数据库去存储就显得有点麻烦并且也没有必要,因而想到设计一个工具类,来实现对含有过期时间的对象的保存。

需求:

先来整理下需求

1.此工具类保存的数据结构类型为键值对型(key-value);

2.通过key可以获取对应的value;

3.保存的数据含有过期时间,当数据过期时,通过key获取到的值应为null;

4.过期时间可自定义。

代码实现:

代码语言:javascript
复制
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;
        }
    }
}

实际应用:

代码语言:javascript
复制
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");
        }
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小诸葛的博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档