API方式使用JetCache,测试JetCache性能

以Api方式使用JetCache、测试JetCache本地缓存的性能

本文介绍使用springboot方式使用JetCache

1. 在pom中引入JetCache依赖

		>
			>com.alicp.jetcache>
			>jetcache-starter-redis>
			>2.6.0>
		>

2. 添加配置文件application.properties

jetcache.statIntervalMinutes=15
jetcache.areaInCacheName=false
jetcache.local.default.tpye=caffeine
jetcache.local.default.keyConvertor=fastjson
jetcache.remote.default.tpye=redis
jetcache.remote.default.keyConvertor=fastjson
jetcache.remote.default.valueEncoder=java
jetcache.remote.default.valueDecoder=java
jetcache.remote.default.poolConfig.minIdle=5
jetcache.remote.default.poolConfig.maxIdle=20
jetcache.remote.default.poolConfig.maxTotal=50
jetcache.remote.default.host: 127.0.0.1
jetcache.remote.default.port: 6379

3. 在启动类上面添加注解

@SpringBootApplication
@EnableMethodCache(basePackages = "com.example.jetCacheTest")
@EnableCreateCacheAnnotation
public class JetCacheTestApplication {

	public static void main(String[] args) {
		SpringApplication.run(JetCacheTestApplication.class, args);
	}

}

4. 在单元测试中直接使用JetCache

  1. 创建cache实例
  @CreateCache(expire = 600,name = "aliCache",area = "com.example.jetCacheTest",cacheType = CacheType.LOCAL)
    private static Cache<Object,Object> userCache;

需要注意如果在单元测试中执行userCache的put、get等方法,会报错,如下图:API方式使用JetCache,测试JetCache性能_第1张图片
API方式使用JetCache,测试JetCache性能_第2张图片
API方式使用JetCache,测试JetCache性能_第3张图片

通过断点调试可看出,报此错误的原因是因为,cache本身就为空,所以future中保存的返回值全是空,所以会报空指针异常,cache为空很显然是在使用时候没有加载到,定位到问题就好解决了,通过静态代码块或者在@Before或者在@PostConstruct中对cache实例进行初始化,如下所示:

   //单元测试执行之前先执行
    @Before
    public void init () {
        userCache = new CaffeineCache<>(new EmbeddedCacheConfig<>());
    }
    //@PostConstruct注解的方法将会在依赖注入完成后被自动调用
//    @PostConstruct
//    public void init () {
//        userCache = new CaffeineCache<>(new EmbeddedCacheConfig<>());
//    }
    //静态代码块,在类加载时候就对其实例化
//    static {
//        userCache = new CaffeineCache<>(new EmbeddedCacheConfig<>());
//    }

三种方式任选其一。

  1. 使用多线程调用put、get方法,统计执行时间
 @Test
    public void putTest () throws ExecutionException, InterruptedException {
        int threadNum = 8;
        List<Future<?>> futures = new ArrayList<>();
        ExecutorService executorService = Executors.newFixedThreadPool(threadNum);
        Long start = System.currentTimeMillis();
        for (int i= 0; i< threadNum; i++) {
            Future<?> future = executorService.submit(new Callable<Object>() {
                @Override
                public Object call() throws Exception {
                    for(int j= 0; j< 1000000; j++)
                    {
                        userCache.put(j,j);
                    }
                    return "";
                }
            });
            futures.add(future);
        }
        for (Future<?> future: futures) {
            future.get();
        }
        System.out.println(System.currentTimeMillis() - start);
    }
  @Test
    public void getTest () throws ExecutionException, InterruptedException {
        int threadNum = 8;
        List<Future<?>> futures = new ArrayList<>();
        ExecutorService executorService = Executors.newFixedThreadPool(threadNum);
        Long start = System.currentTimeMillis();
        for (int i= 0; i< threadNum; i++) {
            Future<?> future = executorService.submit(new Callable<Object>() {
                @Override
                public Object call() {
                    for(int j= 0; j< 1000000; j++)
                    {
                        userCache.get(j);
                    }
                    return "";
                }
            });
            futures.add(future);
        }
        for (Future<?> future: futures) {
            future.get();
        }
        System.out.println(System.currentTimeMillis() - start);
    }

经统计在8C 8G的硬件环境下,8个线程共执行800万数据量,put接口的tps为266.7W,get接口的tps为4023.4W。

你可能感兴趣的:(java,多线程,缓存)