[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.穿刺和雪崩