1. 簡介
JetCache是基於Java開發的統一API和使用簡單的緩存框架,它提供的注解比Spring Cache中的注解更加強大。JetCache中的注釋支持原生TTL,兩級緩存和分布式自動刷新,也可以手動編寫實例。目前有四個實現:RedisCache、TairCache(在Github上不是開源的)、CaffeineCache(在內存中的)和一個簡單的LinkedHashMapCache(在內存中的)。
倉庫地址:https://github.com/alibaba/jetcache
2. 示例代碼
- 創建工程
- 修改pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.c3stones</groupId>
<artifactId>spring-boot-jetcache-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-boot-jetcache-demo</name>
<description>Spring Boot Jetcache Demo</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>com.alicp.jetcache</groupId>
<artifactId>jetcache-starter-redis</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 創建Service
import com.c3stones.entity.Config;
/**
* 配置Service
*
* @author CL
*
*/
public interface ConfigService {
/**
* 新增配置
*
* @param config 配置類
* @return
*/
void add(Config config);
/**
* 獲取配置值
*
* @param configKey 配置鍵
* @return
*/
String get(String configKey);
/**
* 更新配置
*
* @param config 配置類
*/
void update(Config config);
/**
* 刪除配置
*
* @param configKey 配置鍵
*/
void delete(String configKey);
}
- 創建Service實現
import java.util.HashMap;
import java.util.Map;
import org.springframework.stereotype.Service;
import com.alicp.jetcache.anno.CacheInvalidate;
import com.alicp.jetcache.anno.CacheType;
import com.alicp.jetcache.anno.CacheUpdate;
import com.alicp.jetcache.anno.Cached;
import com.c3stones.entity.Config;
import com.c3stones.service.ConfigService;
/**
* 配置Service 實現
*
* @author CL
*
*/
@Service
public class ConfigServiceImpl implements ConfigService {
private static Map<String, String> configMap = new HashMap<>();
/**
* 新增配置
*
* @param config 配置類
*/
@Override
public void add(Config config) {
System.out.println("新增配置 => " + config.getConfigKey());
configMap.put(config.getConfigKey(), config.getConfigValue());
}
/**
* 獲取配置值
*
* @param configKey 配置鍵
* @return
*/
@Override
@Cached(name = "configCache", key = "#configKey", expire = 3600, cacheType = CacheType.BOTH)
public String get(String configKey) {
System.out.println("獲取配置值 => " + configKey);
return configMap.get(configKey);
}
/**
* 更新配置
*
* @param config 配置類
*/
@Override
@CacheUpdate(name = "configCache", key = "#config.configKey", value = "#config.configValue")
public void update(Config config) {
System.out.println("更新配置 => " + config.getConfigKey());
configMap.replace(config.getConfigKey(), config.getConfigValue());
}
/**
* 刪除配置
*
* @param configKey 配置鍵
*/
@Override
@CacheInvalidate(name = "configCache", key = "#configKey")
public void delete(String configKey) {
System.out.println("刪除配置 => " + configKey);
configMap.remove(configKey);
}
}
- 創建啟動類
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.alicp.jetcache.anno.config.EnableCreateCacheAnnotation;
import com.alicp.jetcache.anno.config.EnableMethodCache;
/**
* 啟動類
*
* @author CL
*
*/
@SpringBootApplication
@EnableMethodCache(basePackages = "com.c3stones")
@EnableCreateCacheAnnotation
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class);
}
}
- 創建配置文件
在resources下創建文件application.yml。
jetcache:
# 控制台輸出統計數據,統計間隔(單位分鍾),0表示不統計
statIntervalMinutes: 1
# 是否加入緩存key前綴
areaInCacheName: false
local:
default:
# 緩存類型。linkedhashmap、caffeine為當前支持的本地緩存類型
type: linkedhashmap
# Key的轉換器
keyConvertor: fastjson
limit: 100
remote:
default:
# 緩存類型。tair、redis為當前支持的遠程緩存
type: redis
keyConvertor: fastjson
# 采用Java序列化存儲
valueEncoder: java
valueDecoder: java
poolConfig:
minIdle: 5
maxIdle: 20
maxTotal: 50
host: 127.0.0.1
port: 6379
password: 123456
3. 測試
- 創建單元測試類
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import com.c3stones.Application;
import com.c3stones.entity.Config;
import com.c3stones.service.ConfigService;
/**
* 配置Service 測試類
*
* @author CL
*
*/
@RunWith(value = SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class ConfigServiceTest {
@Autowired
private ConfigService configService;
/**
* 測試配置Service
*/
@Test
public void configTest() {
String configKey = "KEY1";
Config config = new Config();
config.setConfigKey(configKey);
config.setConfigValue("1");
configService.add(config);
String configVlue1 = configService.get(configKey);
String configVlue2 = configService.get(configKey);
String configVlue3 = configService.get(configKey);
System.out.println(configKey + " => " + configVlue1);
System.out.println(configKey + " => " + configVlue2);
System.out.println(configKey + " => " + configVlue3);
config.setConfigValue("123");
configService.update(config);
String configVlue4 = configService.get(configKey);
System.out.println(configKey + " => " + configVlue4);
configService.delete(configKey);
String configVlue5 = configService.get(configKey);
System.out.println(configKey + " => " + configVlue5);
try {
// 配置文件中配置每一分鍾控制台打印統計數據
Thread.sleep(70000);
} catch (InterruptedException e) {
}
}
}
- 運行測試方法
控制台打印(部分):
新增配置 => KEY1
獲取配置值 => KEY1
KEY1 => 1
KEY1 => 1
KEY1 => 1
更新配置 => KEY1
KEY1 => 123
刪除配置 => KEY1
獲取配置值 => KEY1
KEY1 => null
一分鍾后,控制台打印統計數據:
cache | qps| rate| get| hit| fail| expire|avgLoadTime|maxLoadTime
-------------------+----------+-------+--------------+--------------+--------------+--------------+-----------+-----------
configCache | 0.09| 60.00%| 5| 3| 0| 0| 0.5| 1
configCache_local | 0.09| 60.00%| 5| 3| 0| 0| 0.0| 0
configCache_remote | 0.04| 0.00%| 2| 0| 0| 0| 0.0| 0
-------------------+----------+-------+--------------+--------------+--------------+--------------+-----------+-----------