Spring Boot Cache使用方法整合代码实例

网友投稿 248 2022-12-13


Spring Boot Cache使用方法整合代码实例

参考:

Spring Cache扩展功能实现

项目地址

使用本地Caffeine缓存

引入依赖包

org.springframework.boot

spring-boot-starter-cache

com.github.ben-manes.caffeine

caffeine

2.6.2

自定义Caffeine配置

CachingConfig.java

package com.vcredit.vmp.checkcenter.config;

import com.github.benmanes.caffeine.cache.Cache;

import com.github.benmanes.caffeine.cache.Caffeine;

import com.vcredit.vmp.checkcenter.common.properties.CaffeineCacheProperties;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;

import org.springframework.cache.CacheManager;

import org.springframework.cache.annotation.EnableCaching;

import org.springframework.cache.caffeine.CaffeineCache;

import org.springframework.cache.support.SimpleCacheManager;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.context.annotation.Primary;

import java.time.Duration;

import java.util.*;

/**

* 缓存配置

* @author kancy

*/

@Configuration

@EnableCaching

public class CachingConfig {

@Autowired

CaffeineCacheProperties caffeineCacheProperties;

/**

* 创建基于Caffeine的Cache Manager

* @return

*/

@Bean

@Primary

@ConditionalOnProperty(prefix = "system.cache.caffeine" , name = "enabled", havingValue = "true")

public CacheManager caffeineCacheManager() {

SimpleCacheManager cacheManager = new SimpleCacheManager();

Map cacheMap = new HashMap();

// 设置全局配置的本地缓存

List globalCacheNames = caffeineCacheProperties.getCacheName();

if(globalCacheNames !=null && !globalCacheNames.isEmpty()){

addCacheObject(cacheMap, globalCacheNames, caffeineCacheProperties.getExpireAfterWrite(),

caffeineCacheProperties.getExpireAfterAccess(), caffeineCacheProperties.getMaximumSize());

}

// 设置自定义属性缓存, 可以覆盖全局缓存

List configs = caffeineCacheProperugORXxtsPties.getConfigs();

http://if(configs != null && !configs.isEmpty()){

for (CaffeineCacheProperties.Config config : configs) {

ListugORXxtsP cacheNames = config.getCacheName();

if (cacheNames == null || cacheNames.isEmpty()){

continue;

}

Duration expireAfterWrite = Optional.ofNullable(config.getExpireAfterWrite()).orElse(caffeineCacheProperties.getExpireAfterWrite());

Duration expireAfterAccess = Optional.ofNullable(config.getExpireAfterAccess()).orElse(caffeineCacheProperties.getExpireAfterAccess());

Long maximumSize = Optional.ofNullable(config.getMaximumSize()).orElse(caffeineCacheProperties.getMaximumSize());

addCacheObject(cacheMap, cacheNames, expireAfterWrite, expireAfterAccess, maximumSize);

}

}

// 加入到缓存管理器进行管理

cacheManager.setCaches(cacheMap.values());

return cacheManager;

}

private void addCacheObject(Map cacheMap, List cacheNames, Duration expireAfterWrite, Duration expireAfterAccess, Long maximumSize) {

for (String cacheName : cacheNames) {

// spring.cache.caffeine: maximumSize=500,expireAfterAccess=10s,expireAfterWrite=15s

Caffeine recordStats = Caffeine.newBuilder().recordStats().maximumSize(maximumSize);

if(expireAfterAccess != null) recordStats.expireAfterAccess(expireAfterAccess);

if(expireAfterWrite != null) recordStats.expireAfterWrite(expireAfterWrite);

Cache cache = recordStats.build();

CaffeineCache caffeineCache = new CaffeineCache(cacheName,cache);

// 覆盖添加

cacheMap.put(cacheName, caffeineCache);

}

}

}

CaffeineCacheProperties.java

package com.vcredit.vmp.checkcenter.common.properties;

import lombok.Getter;

import lombok.Setter;

import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;

import org.springframework.boohttp://t.context.properties.ConfigurationProperties;

import org.springframework.context.annotation.Configuration;

import java.time.Duration;

import java.util.List;

/**

* Caffeine本地缓存自定义配置

* @author kancy

*/

@Getter

@Setter

@Configuration

@ConfigurationProperties("system.cache.caffeine")

@ConditionalOnProperty(prefix = "system.cache.caffeine" , name = "enabled", havingValue = "true")

public class CaffeineCacheProperties {

private List cacheName;

private Duration expireAfterWrite;

private Duration expireAfterAccess;

private Long maximumSize = Long.valueOf(-1);

private List configs;

@Getter

@Setter

public static class Config {

private List cacheName;

Duration expireAfterWrite;

Duration expireAfterAccess;

Long maximumSize;

}

}

application.yml

system.cache.caffeine:

enabled: true

# 全局配置

cacheName: cache1,cache2,cache3

expireAfterWrite: 60s

expireAfterAccess: 30s

maximumSize: 500

# 自定义配置,cacheName相同可覆盖全局

configs:

- cacheName: checkApplyCache

expireAfterAccess: 10s

- cacheName: userQueryCache

expireAfterAccess: 15s

使用缓存

@Cacheable(value = { "checkApplyCache" }, key="#req.md5")

public Result check(CheckReq req) {

// your code...

return Result.ok();

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java实现动态创建类操作示例
下一篇:JavaWeb简单用户登录注册实例代码(有验证码)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~