更好用 更簡單的Java快取框架 jscache

peachyy發表於2020-08-21

比Spring Cache 更好用 更簡單的快取工具 jscache 取名意義為 java simple cache,基於AOP實現,支援註解到介面 自定義單個快取過期時間配置 ttl,輕鬆擴充套件快取實現,預設實現了jedis,spring-data-redis,還有一個基於本地記憶體的map

原始碼倉庫 https://github.com/peachyy/jscache.git

註解API

@Cacheable

設定/獲取快取 如果當前KEY對應的快取存在就直接返回,不存在則呼叫服務後 再對結果進行快取。

配置項

  • prefix 快取字首
  • key key 是 el 表示式 預設生成後的快取key為 prefix+key
  • ttl 快取存活時間(過期時間) 需要具體的快取實現支援 如常用的redis是支援的
  • argCondition 前置條件過濾 針對引數過濾 滿足則執行表示式邏輯
  • returnCondition 後置條件過濾 只有前置條件為true的情況下才能到達後置過濾 為true才會把結果放入快取中
  • allowNullValue 返回值為空的情況下是否快取 防止快取穿透可以支援為true

  @Cacheable(prefix = "user:",key = "#p0",ttl = 60,returnCondition = "#result!=null")
  public User getUserById(Integer userId) {
      User user=new User();
      user.setId(userId);
      user.setName("xxx");
      log.info("GET getUserById");
      return user;
  }

  

@CachePut

只是設定(put)快取 無論快取是否存在 這裡支援設定(put)多個快取

配置項 與 cacheable類似

  • prefix 快取字首
  • key key 是 el 表示式 預設生成後的快取key為 prefix+key
  • ttl 快取存活時間(過期時間) 需要具體的快取實現支援 如常用的redis是支援的
  • argCondition 前置條件過濾 針對引數過濾 滿足則執行表示式邏輯
  • returnCondition 後置條件過濾 只有前置條件為true的情況下才能到達後置過濾 為true才會把結果放入快取中
  • allowNullValue 返回值為空的情況下是否快取 防止快取穿透可以支援為true

@CachePut(prefix = "user:",key = "#p0")
@CachePut(prefix = "members:",key = "#p0")
public User getUserById(Integer userId) {
    User user=new User();
    user.setId(userId);
    user.setName("xxx");
    log.info("GET getUserById");
    return user;
}

  

@CacheEvict

刪除快取 支援刪除多個快取

配置項

  • prefix 快取字首
  • key key 是 el 表示式 預設生成後的快取key為 prefix+key
  • argCondition 前置條件過濾 針對引數過濾 滿足則執行表示式邏輯
@CacheEvict(prefix = "members:",key = "#p0")
@CacheEvict(prefix = "user:",key = "#p0",argCondition = "#p0==100")
public User getUserById(Integer userId) {
    User user=new User();
    user.setId(userId);
    user.setName("xxx");
    log.info("GET getUserById");
    return user;
}

開始使用快取

如springboot中 標註@EnableCache註解 表示快取功能啟用 只要標註了註解的就會生效。

引入jar

  <dependency>
         <groupId>com.peachyy</groupId>
         <artifactId>jscache-core</artifactId>
         <version>${last.jscache.version}</version>
 </dependency>

  

啟用快取 並配置一個快取實現。

@SpringBootApplication
@EnableCache()
public class Application {
	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
}

   @Bean
   public JedisCache cache(){
       Properties properties=new Properties();
       properties.put("hosts","192.168.0.2:6379");
       properties.put("password","bac123");
       properties.put("database","0");
       return new JedisCache(properties,null);
   }

  


這裡有一個基於springboot的例子 https://github.com/peachyy/jscache/tree/master/jscache-springmvc-example

更多適配

主要是用於針對部分rpc 如dubbo 當使用@Reference註解 例項沒有被spring ioc管理到 就不能到框架AOP 所以提供一些簡單的支援 目前僅實現了dubbo的這種情況

模組

  • jscache-annotation 只是註解包 比如標註在介面上 而這個介面需要給其它地方引用 就只需要引用這個jar就好,免得過多產生過多的依賴
  • jscache-core 核心功能實現
  • jscache-dubbo 針對沒有被spring管理dubbo service的適配 基於filter實現
  • jscache-springmvc-example 一個springboot 簡單例子

序列化以及其它擴充套件

序列化

序列化只針對值 key預設為String字元,方便監控檢視。自定義序列化需要實現 com.peachyy.jscache.core.serialize.Serializer介面。預設的實現有fastJson,jackson,java 自定義的直接傳自定義的全類名就行。

如 擴充套件了一個com.xxx.myJacksonSerializer序列化方式 設定的方式大概就是這樣

@EnableCache(serializer="com.xxx.myJacksonSerializer")

  

擴充套件快取實現
擴充套件快取需要實現com.peachyy.jscache.core.Cache介面,加入spring容器就完事了。不需要複雜的實現

@Bean
public JedisCache cache(){
    Properties properties=new Properties();
    properties.put("hosts","192.168.0.2:6379");
    properties.put("password","bac123");
    properties.put("database","0");
    return new JedisCache(properties,null);
}

  


和spring cache比起來使用上的功能大部分有,一些設計也參考了它,使用上明顯的差別就是支援了ttl過期時間,去掉了cacheManager設計,但是僅不止如此 開發者更易駕馭,一個系統中一般保持一套快取規範就夠了。總之適合就是最好的。

原文:https://blog.seoui.com/2020/08/21/jscache/

 

有問題可關注公眾號聯絡

 

相關文章