1. 程式人生 > >[Redis]對快取的一些思考

[Redis]對快取的一些思考

1.為什麼要使用快取技術
高併發:單機快取支援每秒QPS十幾萬 遠遠超過資料庫
高效能:快取使用記憶體讀寫效能遠超磁碟

2.Redis對比memcached
redis支援多種資料結構儲存
redis支援原生叢集在3版本以上
redis支援持久化有更好的可靠性
因redis只使用單核memcached多核所以redis效能弱一些(大量資料時)

3.redis的5中資料結構
String 最基本的結構 set key value; get key
hash 類似map hset key field value ; hget key filed
list 類似雙端佇列 lpush key value1, value2
lpop rpop
set 無序集合 可去重複
sorted set 有序集合

4.redis持久化
詳見部落格

5.redis過期策略和記憶體淘汰機制
定期刪除+惰性刪除
noeviction: 當記憶體不足以容納新寫入資料時,新寫入操作會報錯,這個一般沒人用吧,實在是太噁心了。
allkeys-lru:當記憶體不足以容納新寫入資料時,在鍵空間中,移除最近最少使用的key(這個是最常用的)
allkeys-random:當記憶體不足以容納新寫入資料時,在鍵空間中,隨機移除某個 key,這個一般沒人用吧,為啥要隨機,肯定是把最近最少使用的key給幹掉啊。
volatile-lru:當記憶體不足以容納新寫入資料時,在設定了過期時間的鍵空間中,移除最近最少使用的 key(這個一般不太合適)
volatile-random:當記憶體不足以容納新寫入資料時,在設定了過期時間的鍵空間中,隨機移除某個 key。
volatile-ttl:當記憶體不足以容納新寫入資料時,在設定了過期時間的鍵空間中,有更早過期時間的 key 優先移除。
LRU演算法

class LRUCache<K, V> extends LinkedHashMap<K, V> {
    private final int CACHE_SIZE;

    /**
     * 傳遞進來最多能快取多少資料
     *
     * @param cacheSize 快取大小
     */
    public LRUCache(int cacheSize) {
        // true 表示讓 linkedHashMap 按照訪問順序來進行排序,最近訪問的放在頭部,最老訪問的放在尾部。
        super((int) Math.ceil(cacheSize / 0.75) + 1, 0.75f, true);
        CACHE_SIZE = cacheSize;
    }

    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        // 當 map中的資料量大於指定的快取個數的時候,就自動刪除最老的資料。
        return size() > CACHE_SIZE;
    }
}

6.redis叢集
https://blog.csdn.net/drdongshiye/article/details/84204392

7.穿刺和雪崩