一、jvm 堆內(nèi)存大小 (減少full gc)
二、靜態(tài)資源分離
將靜態(tài)資源數(shù)據(jù)加載至nginx或者其他服務(wù)提升系統(tǒng)吞吐量
三、數(shù)據(jù)庫索引,減少讀寫io次數(shù) 統(tǒng)一查詢處理
四、緩存
本地緩存(緩存不一致)
設(shè)計(jì)一個本地內(nèi)存需要有什么功能
存儲;并可以讀、寫;
原子操作(線程安全),如ConcurrentHashMap
可以設(shè)置緩存的最大限制;
超過最大限制有對應(yīng)淘汰策略,如LRU、LFU
過期時間淘汰,如定時、懶式、定期;
持久化
統(tǒng)計(jì)監(jiān)控
缺點(diǎn):使用本地緩存如果存在多臺服務(wù)器會使每臺服務(wù)器都需要緩存,而且需要保證并發(fā)安全需要加鎖,這樣導(dǎo)致每臺服務(wù)器都得進(jìn)行一次搶占操作影響速度
redis緩存:
分布式鎖和同步器 · redisson/redisson Wiki · GitHub
springboot2.0以后默認(rèn)lettuce作為操作redis的客戶端,它使用netty進(jìn)行網(wǎng)絡(luò)通信
lettuce的bug導(dǎo)致netty推外內(nèi)存溢出
1>使用jedis 2>升級lettuce
緩存穿透:空結(jié)果緩存
緩存雪崩 :設(shè)置過期時間(進(jìn)行隨機(jī)過期)
緩存擊穿:加鎖
鎖:
本地鎖 :JUC
分布式鎖: Redis中間鎖
Redis鎖:可重入鎖、讀寫鎖、信號量, 閉鎖
緩存一致性:
雙寫模式:數(shù)據(jù)發(fā)生改變的話,刪除緩存重新寫入緩存
失效模式:數(shù)據(jù)發(fā)生改變,直接刪除緩存 等待下一次查詢緩存在寫入
解決方案:
1.加過期時間,保存讀多寫少的數(shù)據(jù),處理并發(fā)可以加讀寫鎖
2.canal:模擬mysql從表使用binlog日志記錄實(shí)時監(jiān)控更新redis,數(shù)據(jù)異構(gòu)
總結(jié):都會出現(xiàn)臟數(shù)據(jù)
SpringCache
@Cacheable: 觸發(fā)保存緩存數(shù)據(jù).
@CacheEvict: 觸發(fā)刪除緩存數(shù)據(jù).
@CachePut: 更新緩存數(shù)據(jù).
@Caching: 重新組合緩存.
@CacheConfig: 在類級別共享一些與緩存相關(guān)的常見設(shè)置.