1. 程式人生 > >java物件本地快取機制的實現

java物件本地快取機制的實現

本地快取機制,利用java.util.concurrent,很好的管理本地記憶體儲存的物件內容。

建立屬性:

 /**
     * 具體內容存放的地方
     */
    private ConcurrentHashMap<String, Object>[] caches;
    /**
     * 超期資訊儲存
     */
    private ConcurrentHashMap<String, Long> expiryCache;

    /**
     * 清理超期內容的服務
     */
    private ScheduledExecutorService scheduleService;


    /**
     * 清理超期資訊的時間間隔,預設10分鐘
     */
    private int expiryInterval = 5;


    /**
     * 內部cache的個數,根據key的hash對module取模來定位到具體的某一個內部的Map,
     */
    private int moduleSize = 10;

建立構造器:    

  public MyLocalCache() {
        caches = new ConcurrentHashMap[moduleSize];
        for (int i = 0; i < moduleSize; i++) {
            caches[i] = new ConcurrentHashMap<String, Object>();
        }
        expiryCache = new ConcurrentHashMap<String, Long>();


        scheduleService = Executors.newScheduledThreadPool(1);
        //後臺定時維護執行緒
        scheduleService.scheduleAtFixedRate(getRemoveLocalCacheTask(), 0, 60L * expiryInterval, TimeUnit.SECONDS);
    }

定義快取的get和put方法:

  /**
     * 將資料放入快取中
     * @param key
     * @param value
     * @param TTL 秒
     * @return
     */
    public Object put(String key, Object value, int TTL) {
        Object result = null;
        ConcurrentHashMap<String, Object> cache = getCache(key);
        if (cache != null && cache.size() < 10240) {
            result = cache.put(key, value);
            Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.SECOND, TTL);
            expiryCache.put(key, calendar.getTime().getTime());
        }
        return result;
    }


    public Object get(String key) {
        checkValidate(key);
        return getCache(key).get(key);
    }

//根據key獲取cache容器
    private ConcurrentHashMap<String, Object> getCache(String key) {
        long hashCode = (long) key.hashCode();
        if (hashCode < 0) {
            hashCode = -hashCode;
        }
        int moudleNum = (int) (hashCode % moduleSize);
        return caches[moudleNum];
    }

校驗key是否過期,如果過期了,就要移除

 private void checkValidate(String key) {
        if (key != null) {
            Long expiryTime = expiryCache.get(key);
            if (expiryTime != null && expiryTime != -1
                    && new Date(expiryTime).before(new Date())) {
                ConcurrentHashMap<String, Object> cache = getCache(key);
                if (cache != null) {
                    cache.remove(key);
                }
                expiryCache.remove(key);
            }
        }
    }

清除所有的快取:    key和內容  全部清空

 public boolean clear() {
        if (caches != null) {
            for (ConcurrentHashMap<String, Object> cache : caches) {
                cache.clear();
            }
        }


        if (expiryCache != null) {
            expiryCache.clear();
        }
        return true;
    }

定時器:  檢查過期內容

 public Runnable getRemoveLocalCacheTask() {
        return new Runnable() {
            @Override
            public void run() {
                try {
                    for (ConcurrentHashMap<String, Object> cache : caches) {
                        Iterator<String> keys = cache.keySet().iterator();
                        while (keys.hasNext()) {
                            String key = keys.next();
                            if (expiryCache.get(key) == null) {
                                continue;
                            }
                            long date = expiryCache.get(key);
                            if ((date > 0) && (new Date(date).before(new Date()))) {
                                expiryCache.remove(key);
                                cache.remove(key);
                            }
                        }
                    }
                    logger.debug("MingpinLocalCache CheckService check() is run!");
                } catch (Exception ex) {
                    logger.error(ex);
                }
            }
        };
    }

相關推薦

java物件本地快取機制實現

本地快取機制,利用java.util.concurrent,很好的管理本地記憶體儲存的物件內容。 建立屬性:  /**      * 具體內容存放的地方      */     private ConcurrentHashMap<String, Object>

Java自動過期本地快取簡單實現

實際專案中常常需要用到本地快取,特別是一些固定不變的資料,不想頻繁調介面,因為http請求本身需要耗時,下面幾個類對本地快取作了簡單實現,支援自動過期功能LocalCache.javainterface LocalCache { public void refresh()

如何利用快取機制實現JAVA類反射效能提升30倍

一次效能提高30倍的JAVA類反射效能優化實踐 文章來源:宜信技術學院 & 宜信支付結算團隊技術分享第4期-支付結算部支付研發團隊高階工程師陶紅《JAVA類反射技術&優化》 分享者:宜信支付結算部支付研發團隊高階工程師陶紅 原文首發於宜信支付結算技術團隊公號:野指標 在實際工作中的一些特定

java物件序列化機制

1.定義 java物件序列化機制允許實現了Serializable/Externalizable介面的java物件永久性地儲存到計算機的磁碟中,或則允許java物件直接在網路中傳輸,擺脫平臺的限制。反序列化即使將IO流中的位元組序列轉化為java物件。 2.原理 3.使用 序列化: 1)一個實現了S

java 中間變數快取機制(i++,++i)

public class Test { public static void main(String[] args) { int i = 0; i = i ++ ; System.out.println(i); }

java呼叫本地攝像頭,實現人臉識別

package com.lw.test; import java.awt.Graphics; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.imag

Java物件的強、軟、弱和虛引用原理+結合ReferenceQueue物件構造Java物件快取記憶體器

轉自:http://blog.csdn.net/lyfi01/article/details/6415726 1.Java物件的強、軟、弱和虛引用 在JDK 1.2以前的版本中,若一個物件不被任何變數引用,那麼程式就無法再使用這個物件。也就是說,只有物件處於可觸及(re

java物件快取

先了看一段非常有意思的程式碼 public class TestIntegerCache { public static void main(String[] args) { Integer a = 12; In

Java 物件序列化機制詳解

物件序列化的目標:將物件儲存到磁碟中,或允許在網路中直接傳輸物件。 物件序列化機制允許把記憶體中的Java物件轉換成平臺無關的二進位制流,從而允許把這種二進位制流持久的儲存在磁碟上,通過網路將這種二進位制流傳輸到另一個網路節點。其他程式一旦獲得了這種二進位制流,都可以講這種

Java物件構建快取記憶體器

Java物件引用+ReferenceQueue實現Java物件的快取記憶體 Java物件的強、軟、弱和虛引用(使程式能更加靈活地控制物件的生命週期): 1.強引用(StrongReference):最普遍的引用,物件具有強引用,記憶體空間不足,JVM寧願丟

前端幾種本地快取機制

2. Session 說到Cookie就不能不說Session。 Session機制。session機制是一種伺服器端的機制,伺服器使用一種類似於散列表的結構(也可能就是使用散列表)來儲存資訊。當程式需要為某個客戶端的請求建立一個session時,伺服器首先檢查這個客戶端的請求裡是否已包含了一個se

常見面試題之作業系統中的LRU快取機制實現

LRU快取機制,全稱Least Recently Used,字面意思就是最近最少使用,是一種快取淘汰策略。換句話說,**LRU機制就是認為最近使用的資料是有用的,很久沒用過的資料是無用的,當記憶體滿了就優先刪除很久沒有使用的資料**。 基於LeetCode146,可以使用**雜湊連結串列**或者**自定義雙

LeetCode 146. LRU快取機制java實現)

參考解答 總結:這道題主要要知道選取何種資料結構並且在 O(1) 時間複雜度內完成這兩種操作? O(1) 的get方法肯定要用到HashMap() LinkedList(雙向連結串列)可以以O(1)時間複雜度,很方便地實現資料的插入和刪除 所以,將兩個資料結構聯合使用,Ha

java物件中的三種狀態和髒檢查及重新整理快取機制

瞬時狀態   瞬時狀態又稱臨時狀態.如果java物件與資料庫中的資料沒有任何的關聯,即此java物件在資料庫中沒有相關聯的記錄,此時java物件的狀態為瞬時狀態,session對於 瞬時狀態的ava物件是一無所知的,當物件不再被其他物件引用時,它的所有資料也就丟失了,物件將會被java虛擬機器按照垃圾回收

Java ConcurrentHashmap實現Localcache本地快取

很多場景下,有些請求的資料,是不會經常改變的,這種時候,為了減少資料庫的查詢壓力,可以將這一部分資料放入快取中,直接從快取中讀取。除了一些像Redis等快取外,還可以通過本地記憶體,作為快取。下邊將使用ConcurrentHashMap來實現本地快取。 >相關的技術:

利用Java反射機制實現物件相同欄位的複製

一、如何實現不同型別物件之間的複製問題? 1、為什麼會有這個問題? 近來在進行一個專案開發的時候,為了隱藏後端資料庫表結構、同時也為了配合給前端一個更友好的API介面文件(swagger API文件),我採用POJO來對應資料表結構,使用VO來給傳遞前端要展示的資料,同時使用DTO來進行請求

(小工具)Java反射機制實現任意物件集合按指定任意欄位進行分組通用程式實踐

在應用開發的時候,我們有時候會遇到需要對一個給定集合進行分組的情況。如果該集合的資料記錄是從資料庫的獲取,通常我們最簡單的方案是直接在sql層面select後group by完成。 但是,假如某些場景下該資料不是從資料庫獲取呢?那就需要在應用程式層面進行分

(小工具)Java反射機制實現任意物件集合排序並且獲取排列名次的通用程式實踐

在應用開發的時候,我們有時候會遇到需要對一個給定集合進行排序的情況。如果該集合的資料記錄是從資料庫的獲取,通常我們最簡單的方案是直接在sql層面select後order by完成。 但是,假如某些場景下該資料不是從資料庫獲取呢?那就需要在應用程式層面進行排

mybatis實現物件之間的關係(一對一、一對多、多對多)以及mybatis的快取機制

一、業務需求中物件之間的關係在實際的開發當中,不僅要對錶與表之間的關係進行的詳細分析,也要針對在業務意義上物件之間的關係,通常的關係為:一對一、一對多、多對多;二、針對使用mybatis處理這三種關係1、業務模型說明這裡用用使用者表、訂單表、訂單詳情表、商品表著四張表之間,說

java實現本地快取

這裡本地快取的含義是 多個執行緒公用的一個靜態的Map物件 作用是減少db或cache的查詢次數。 使用場景為靜態或者非敏感資料。 也可以使用google的guava cache等 快取類 import lombok.AllArgsConstructor; import