1. 程式人生 > 其它 >java原生 簡單快取工具類

java原生 簡單快取工具類

作者:wangbingchen

工具類編寫環境,作者為小公司開發,一個小專案,功能中使用到簡訊驗證登入功能,使用快取,可以有很多,第一個想到的是redis,但是如果整個專案只是為了這一個小小的簡訊驗證來使用redis,感覺有點大材小用,再其次是使用資料庫,但是使用資料庫效能肯定沒有使用記憶體來得好。於是就有了這個小巧的快取,直接複製到專案中就可以使用,無需新增第三方依賴。

如果好用記得好評,謝謝_

package com.utils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * @author wangbingchen
 * @Description
 * @create 2021-11-23 14:12
 * 簡易的快取工具,用於做簡訊驗證碼校驗
 * 此類為常駐記憶體工具
 */
public class CacheUtil {

    public static void main(String[] args) throws InterruptedException {
        CacheUtil.set("name","zhangsan",2000);
        CacheUtil.set("name","lisi",2000);
        CacheUtil.set("name","ww",500);
        CacheUtil.set("name1","qweqwe",4000);
        Thread.sleep(1000);
        String name = CacheUtil.get("name");
        String name1 = CacheUtil.get("name1");
        System.out.println(name);
        System.out.println(name1);
        Thread.sleep(1000);
        System.out.println(CacheUtil.get("name"));
        System.out.println(CacheUtil.get("name1"));
        Thread.sleep(1000);
        System.out.println(CacheUtil.get("name"));
        System.out.println(CacheUtil.get("name1"));
        Thread.sleep(1000);
        System.out.println(CacheUtil.get("name"));
        System.out.println(CacheUtil.get("name1"));
        Thread.sleep(1000);
        System.out.println(CacheUtil.get("name"));
        System.out.println(CacheUtil.get("name1"));

    }

    private CacheUtil(){}

    private static final Map<String, CacheUtilBean> CACHE_MAP = new HashMap<String, CacheUtilBean>();

    public static void set(String key,String value,long exprTime){
        //將傳入的毫秒數 轉換為 將來的時間戳
        CACHE_MAP.put(key,new CacheUtilBean(value,System.currentTimeMillis()+exprTime));
    }

    private static final long DEFAULT_EXPR_TIME = 24*60*60*1000L;
    public static void set(String key,String value){
        set(key,value, DEFAULT_EXPR_TIME);
    }

    public static String get(String key){
        //獲取之前先刪除時間點之前的
        removeExp();
        CacheUtilBean cacheUtilBean = CACHE_MAP.get(key);
        if(cacheUtilBean==null){
            return "";
        }
        return cacheUtilBean.getValue();
    }

    private static void removeExp() {
        List<String> removeKey = new ArrayList<>();
        for (Map.Entry<String, CacheUtilBean> entry : CACHE_MAP.entrySet()) {
            Long exprTime = entry.getValue().getExprTime();
            if(System.currentTimeMillis()>exprTime){
                removeKey.add(entry.getKey());
            }
        }

        for (String s : removeKey) {
            CACHE_MAP.remove(s);
        }
    }
    static class CacheUtilBean {
        //存的值
        private String value;
        //過期時間戳 set的時候計算好
        private Long exprTime;

        public CacheUtilBean(String value, Long exprTime) {
            this.value = value;
            this.exprTime = exprTime;
        }

        public String getValue() {
            return value;
        }

        public void setValue(String value) {
            this.value = value;
        }

        public Long getExprTime() {
            return exprTime;
        }

        public void setExprTime(Long exprTime) {
            this.exprTime = exprTime;
        }
    }

}