SpringBoot集成阿里緩存框架Jetcache代替Spring Cache


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
-------------------+----------+-------+--------------+--------------+--------------+--------------+-----------+-----------

4. 項目地址

  spring-boot-jetcache-demo


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM