阿里開源的緩存框架JetCache

以前一直在用Spring Cache進行接口數據的緩存,主要是Spring Cache在對具體key緩存失效時間的設置不是很方法,還要本身去擴展,無心中發現了阿里的JetCache。大部分的需求都能知足,而且有一些很實用的功能,今天給你們介紹下。html

JetCache是一個基於Java的緩存系統封裝,提供統一的API和註解來簡化緩存的使用。 JetCache提供了比SpringCache更增強大的註解,能夠原生的支持TTL、兩級緩存、分佈式自動刷新,還提供了Cache接口用於手工緩存操做。 當前有四個實現,RedisCache、TairCache(此部分未在github開源)、CaffeineCache(in memory)和一個簡易的LinkedHashMapCache(in memory),要添加新的實現也是很是簡單的。java

GitHub:https://github.com/alibaba/je...git

所有特性:

  • 經過統一的API訪問Cache系統
  • 經過註解實現聲明式的方法緩存,支持TTL和兩級緩存
  • 經過註解建立並配置Cache實例
  • 針對全部Cache實例和方法緩存的自動統計
  • Key的生成策略和Value的序列化策略是能夠配置的
  • 分佈式緩存自動刷新,分佈式鎖 (2.2+)
  • 異步Cache API (2.2+,使用Redis的lettuce客戶端時)
  • Spring Boot支持

體驗一下

增長Maven配置:github

<dependency>
    <groupId>com.alicp.jetcache</groupId>
    <artifactId>jetcache-starter-redis</artifactId>
    <version>2.5.11</version>
</dependency>

配置內容:redis

# 採用Java序列化存儲
jetcache.remote.default.valueDecoder = java
# Key的轉換器
jetcache.remote.default.keyConvertor = fastjson
# 是否加入緩存key前綴
jetcache.areaInCacheName = false
jetcache.remote.default.valueEncoder = java
# 緩存類型。tair、redis爲當前支持的遠程緩存;linkedhashmap、caffeine爲當前支持的本地緩存類型
jetcache.local.default.type = linkedhashmap
# 控制檯輸出統計數據,統計間隔,0表示不統計
jetcache.statIntervalMinutes = 15
jetcache.local.default.keyConvertor = fastjson
jetcache.remote.default.uri = redis://192.168.0.210:6379/
  • remote 表示遠程緩存
  • local表示本地緩存

啓動類開啓緩存:spring

@SpringBootApplication
@EnableMethodCache(basePackages = "com.cxytiandi.jetcache")
@EnableCreateCacheAnnotation
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class);
    }
}
  • @EnableMethodCache

用於激活@Cached註解的使用express

  • @EnableCreateCacheAnnotation

用於激活@CreateCache註解的使用json

定義一個簡單的實體類來做爲數據的緩存,必須實現Serializable接口。bootstrap

@Data
public class User implements Serializable {

    private Long id;
    
    private String name;

}

@CreateCache使用緩存

@CreateCache(expire = 100)
private Cache<Long, User> userCache;

User user = new User();
user.setId(1L);
user.setName("yinjihuan");
// 新增緩存
userCache.put(1L, user);

// 刪除緩存
userCache.remove(1L);

用起來很簡單,就像操做本地Map同樣,@CreateCache中有不少配置須要咱們本身去指定,不指定則使用默認的,關於配置請查看文檔:https://github.com/alibaba/jetcache/wiki/CreateCache_CN

@Cached使用

@Cached(name="getUser.", key="#id", expire = 8, cacheType=CacheType.BOTH)
@Override
public User getUser(Long id) {
    User user = new User();
    user.setId(1L);
    user.setName("yinjihuan");
    return user;
}
  • name

緩存名稱

  • key

緩存key,追加到name後面構成惟一的緩存key, 使用SpEL指定key,若是沒有指定會根據全部參數自動生成。

  • expire

緩存失效時間

  • cacheType

緩存的類型,包括CacheType.REMOTE、CacheType.LOCAL、CacheType.BOTH。若是定義爲BOTH,會使用LOCAL和REMOTE組合成兩級緩存

更多配置的介紹請查看文檔:https://github.com/alibaba/jetcache/wiki/MethodCache_CN

今天的介紹就到這裏,使用起來仍是很方便的,關於更多的功能你們自行去嘗試吧,好比緩存定時刷新,緩存命中率統計,自定義序列化方式等等。

整合Apollo的坑
在這邊提一個容易被坑到的點,若是大家的配置都是在Apollo中進行管理的話,那麼在集成的時候會有個問題,須要在項目中加上下面的配置才行,其他的配置能夠放Apollo中。

spring.application.name=district-service
app.id=${spring.application.name}
apollo.bootstrap.enabled=true
// 這是你要加的,指定緩存類型,我這邊用的是lettuce
jetcache.remote.default.type=redis.lettuce

@Cached定義在接口上的坑
還有一個呢就是@Cached若是定義在接口上就不能指定key屬性,框架中會自動根據參數生成key, 若是非得本身用SPEL表達式指定key的話,項目編譯設置target必須爲1.8格式,而且指定javac的-parameters參數,不然就要使用key="args[0]"這樣按下標訪問的形式。我建議仍是把@Cached的定義放在實現類上,也方便修改。

我這邊也錄製了一套視頻,感興趣的能夠去了解下:http://cxytiandi.com/course/24

猿天地

相關文章
相關標籤/搜索