自定義注解:
自定義注解中有三個元注解@Target,@Retention,@Document
/*** 系統日志注解** @author Mark sunlightcs@gmail.com*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLog {String value() default "";
}
@Target(ElementType.METHOD) 表示只能在方法上聲明
@Retention 元注解 注解標記其他的注解用于指明標記的注解保留策略
首先要明確生命周期長度 SOURCE < CLASS < RUNTIME ,所以前者能作用的地方后者一定也能作用。
一般如果需要在運行時去動態獲取注解信息,那只能用 RUNTIME 注解,比如@RestController使用RUNTIME注解
如果要在編譯時進行一些預處理操作,比如生成一些輔助代碼(如 ButterKnife),就用 CLASS注解;
如果只是做一些檢查性的操作,比如 @Override 和 @SuppressWarnings,使用SOURCE 注解。
注解@Deprecated,用來表示某個類或屬性或方法已經過時,不想別人再用時,在屬性和方法上用@Deprecated修飾
@Documented注解標記的元素,Javadoc工具會將此注解標記元素的注解信息包含在javadoc中。默認,注解信息不會包含在Javadoc中。
instanceof
- ?instanceof 是 Java 的保留關鍵字。
- ?作用是:測試它左邊的對象是否是它右邊的類的實例,返回 boolean 的數據類型。
- ?instanceof是Java中的二元運算符,左邊是對象,右邊是類;當對象是右邊類或子類所創建對象時,返回true;否則,返回false。
@XmlRootElement
便于對象與xml文件之間的轉換
@XmlRootElement( name="doc" )
public class Document {@XmlElementprotected Foo foo;// ...
}
<?xml version="1.0" encoding="UTF-8"?>
<doc><foo>...</foo>
</doc>
Java Document 工具類
Java 對本地HTML文件的讀取和寫入的工具類,可以用來修改靜態HTML的內容
@Deprecated 說明
- 若類、方法、屬性加上該注解之后,表示不再建議使用,調用時會出現刪除線,但并不代表不能用,只是不推薦使用,因為有更好的替代
二級緩存
Redis+Guava
Guava Cache?是其中的一個專門用于處理本地緩存的輕量級框架,是全內存方式的本地緩存,而且是線程安全的
和 ConcurrentMap 相比,Guava Cache 可以限制內存的占用,并可設置緩存的過期時間,可以自動回收數據,而 ConcurrentMap 只能通過靜態方式來控制緩存,移除數據元素需要顯示的方式來移除。
先去查看緩存,若緩存中沒有數據則去訪問數據庫,同時將數據更新至緩存
優點:
- 保證最小的緩存量滿足精確查詢業務,避免冷數據占用寶貴的內存空間
- 對增刪改查業務入侵小、刪除即同步
- 可插拔,對于老系統升級,歷史數據無需在啟動時初始化緩存
缺點:
- 數據量需可控,在無限增長業務場景不適用
- 在微服務場景不利于全局緩存應用
微服務場景下,多個微服務使用一個大緩存,流數據業務下,高頻讀取緩存對 Redis 壓力很大,最終導致緩存雪崩,進而引發我們的服務雪崩。我們使用本地緩存結合 Redis 緩存使用,降低 Redis 壓力,同時本地緩存沒有連接開銷,性能更優
把熱點數據(熱key)放到我們JVM的本地緩存中,本地緩存可以使用caffeine,ehcache,guava。本文介紹Guava進行實現。
如果是通過redis集群來實現的,我們可以通過一致性hash算法構建一個hash環,主要是防止某一個或者某些個redis結點宕機或者下線而導致數據丟失的問題以及我們后面動態進行擴容的問題
?hash取模算法,實際上對目標表或者目標數據庫進行hash取模,一旦目標表或者數據庫發生數量上的變化,就會導致所有數據都需要進行遷移,為了減少這種大規模的數據影響,才引入了一致性hash算法。
一致性哈希將整個哈希值空間組織成一個虛擬的圓環,取模運算不是直接對這四個表來完成,而是對2^32來實現,
?
?
guava的數據回收策略
對于guava的數據刪除分為被動移除和主動移除兩種
被動移除
基于大小的移除
看字面意思就知道就是按照緩存的大小來移除,如果即將到達指定的大小,那就會把不常用的鍵值對從cache中移除。
guava提供了兩個基于時間移除的方法:
- expireAfterAccess(long, TimeUnit) 這個方法是根據某個鍵值對最后一次訪問之后多少時間后移除
- expireAfterWrite(long, TimeUnit) 緩存項在給定時間內沒有被寫訪問(創建或覆蓋),則回收。如果認為緩存數據總是在固定時候后變得陳舊不可用,這種回收方式是可取的
基于引用的移除
- 這種移除方式主要是基于java的垃圾回收機制,根據鍵或者值的引用關系決定移除。
主動移除數據
主動移除有三種方法:
- 單獨移除 Cache.invalidate(key)
- 批量移除 Cache.invalidateAll(keys)
- 移除所有 Cache.invalidateAll()
?
參考:千萬級并發架構下,如何進行關系型數據庫的分庫分表_ZNineSun的博客-CSDN博客
Redis+Guava實現高性能的二級緩存_guavacache和redis結合使用_ZNineSun的博客-CSDN博客