單例設計模式全局緩存accessToken

  使用微信JS-SDK開發的小夥伴們,看文檔常常會看到這樣一句話:(下面是微信開發文檔的一部分原話截圖) 數據庫

這句話就是:開發者必須在本身的服務全局緩存access_token,jsapi_ticket設計模式

下面就使用單例模式進行全局緩存。(固然你也能夠存入數據庫,即所謂的實例化。而後每次從數據庫取,而後弄個定時器定時刷新,樓主之前使用的這種方式,可是發現實在在浪費時間,浪費精力,不建議使用。就把下面這種不錯的方式提供給你們。)api

單例模式:顧名思義,就是系統中的一個類只有一個實例。不管有多少個類在調用它,它都是一個。這樣在各個類進行調用的時候,取到的數據是共用的。緩存

/**
 * @author xulei
 * @description 單例設計模式 緩存 accessToken Jsapi_ticket
 */
public class Singleton {
    
    //緩存accessToken 的Map,map中包含 一個accessToken 和 緩存的時間戳
    private Map<String, String> map = new HashMap<String,String>();

    private Singleton() {
        
    }

    private static Singleton single = null;

    // 靜態工廠方法
    public static Singleton getInstance() {
        if (single == null) {
            single = new Singleton();
        }
        return single;
    }

    public Map<String, String> getMap() {
        return map;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

    public static Singleton getSingle() {
        return single;
    }

    public static void setSingle(Singleton single) {
        Singleton.single = single;
    }
    
    /**
     * 獲取 accessToken Jsapi_ticket 已加入緩存機制
     * @param appid
     * @param appsecret
     * @return
     */
    public Map<String,Object> getAccessTokenAndJsapiTicket(String appid, String appsecret) {
        Map<String,Object> result = new HashMap<String,Object>();
        Singleton singleton = Singleton.getInstance();
        Map<String, String> map = singleton.getMap();
        String time = map.get("time");//從緩存中拿數據
        String accessToken = map.get("access_token");//從緩存中拿數據
        String jsapiticket = map.get("jsapiticket");//從緩存中拿數據
        Long nowDate = new Date().getTime();
        //這裏設置過時時間 3000*1000就行了
        if (accessToken != null && time != null && nowDate - Long.parseLong(time) < 3000 * 1000) {
            System.out.println("-----從緩存讀取access_token:"+accessToken);
            //從緩存中拿數據爲返回結果賦值
            result.put("access_token", accessToken);
            result.put("jsapiticket", jsapiticket);
        } else {
            Map<String,Object> info = JsdkUtil.getJsapiticket(appid, appsecret);//實際中這裏要改成你本身調用微信接口去獲取accessToken和jsapiticket
            //將信息放置緩存中
            map.put("time", nowDate + "");
            map.put("access_token", String.valueOf(info.get("access_token")));
            map.put("jsapiticket", String.valueOf(info.get("jsapiticket")));
            //爲返回結果賦值
            result.put("access_token", info.get("access_token"));
            result.put("jsapiticket", info.get("jsapiticket"));
            }
        return result;
    }

}


而後在用到的地方直接:Singleton.getInstance().getAccessTokenAndJsapiTicket(appID,appsecret);微信

相關文章
相關標籤/搜索