3年前 (2021-07-03)  相关技术 |   抢沙发  2761 
文章评分 1 次,平均分 4.0

Spring Boot集成Caffeine缓存

Spring Boot集成咖啡因Caffeine缓存

Caffeine咖啡因是使用Java8重写的Guava缓存版本,将在SpringBoot2.0中取代Guava。如果咖啡因发生,咖啡因缓存管理器Caffeine Cache Manager将自动配置。使用spring.cache.cache-names属性,可以在启动时创建缓存,并通过如下配置(按顺序)对其进行自定义:

  • spring.cache.caffee.spec:定义了特殊缓存
  • com.github.benmanes.caffeine.cache.CaffeineSpec:bean定义
  • com.github.benmanes.caffee.cache.caffee:bean定义

例如,以下配置创建一个foobar缓存,最大数量为500,生存时间为10分钟:

spring.cache.cache-names=foo,bar
spring.cache.caffeine.spec=maximumSize=500,expireAfterAccess=600s

此外,如果定义了com.github.benmanes.caffee.cache.CacheLoader,它将自动与caffee缓存管理器关联。由于CacheLoader关联由缓存管理器管理的所有缓存,因此必须将其定义为CacheLoader<Object,Object>,并且自动配置将忽略所有泛型类型。

引入依赖关系

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
	<groupId>com.github.ben-manes.caffeine</groupId>
	<artifactId>caffeine</artifactId>
	<version>2.6.0</version>
</dependency>

支持打开缓存

使用@EnableCaching注解来启用Spring Boot以支持缓存

@SpringBootApplication
@EnableCaching// Open the cache and specify what needs to be displayed
public class SpringBootStudentCacheCaffeineApplication {

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

配置文件

添加了缓存的特殊配置,如最大容量、过期时间等。

spring.cache.cache-names=people
spring.cache.caffeine.spec=initialCapacity=50,maximumSize=500,expireAfterWrite=10s,refreshAfterWrite=5s

如果使用refreshAfterWrite配置,还必须指定CacheLoader,例如:

/**
 * You must specify the Bean, refreshAfterWrite=5s for the configuration property to take effect.
 *
 * @return
 */
@Bean
public CacheLoader<Object, Object> cacheLoader() {

    CacheLoader<Object, Object> cacheLoader = new CacheLoader<Object, Object>() {

        @Override
        public Object load(Object key) throws Exception {
            return null;
        }

        // Rewriting this method returns the oldValue value back to refresh the cache
        @Override
        public Object reload(Object key, Object oldValue) throws Exception {
            return oldValue;
        }
    };

    return cacheLoader;
}

配置说明:

  • Initial Capacity=[integer]:初始缓存空间大小
  • Maximum Size=[long]:最大缓存数
  • Maximum Weight=[long]:缓存的最大重量
  • expireAfterAccess=[duration]:在上次写入或访问后的固定时间后过期
  • expireAfterWrite=[duration]:在最后一次写入之后,它将在固定时间内过期
  • refreshAfterWrite=[duration]:在创建或上次更新缓存之后,以固定的间隔刷新缓存
  • weakKeys:打开对key的弱引用
  • Weak Values:打开对值的弱引用
  • softValues:打开对值的软引用
  • recordStats:开发统计函数

注意项:

  • 存在expireAfterWriteexpireAfterAccess同事时,以expireAfterWrite为准。
  • Maximum SizeMaximum Weight不能同时使用
  • Weak ValuessoftValues不能同时使用

示例代码

/**
 * @author yuhao.wang
 */
@Service
public class PersonServiceImpl implements PersonService {
    private static final Logger logger = LoggerFactory.getLogger(PersonServiceImpl.class);

    @Autowired
    PersonRepository personRepository;

    @Override
    @CachePut(value = "people", key = "#person.id")
    public Person save(Person person) {
        Person p = personRepository.save(person);
        logger.info("by id,key by:" + p.getId() + "Data is cached");
        return p;
    }

    @Override
    @CacheEvict(value = "people")//2
    public void remove(Long id) {
        logger.info("Deleted id,key by" + id + "Data caching");
        //No actual deletion is done here.
    }

    /**
     * Cacheable
     * value: Cache the prefix of key.
     * key: Cache the suffix of key.
     * sync: Set if the cache expires and only one request is placed to request the database, other requests are blocked, the default is false.
     */
    @Override
    @Cacheable(value = "people", key = "#person.id", sync = true)
    public Person findOne(Person person, String a, String[] b, List<Long> c) {
        Person p = personRepository.findOne(person.getId());
        logger.info("by id,key by:" + p.getId() + "Data is cached");
        return p;
    }

    @Override
    @Cacheable(value = "people1")//3
    public Person findOne1() {
        Person p = personRepository.findOne(2L);
        logger.info("by id,key by:" + p.getId() + "Data is cached");
        return p;
    }

    @Override
    @Cacheable(value = "people2")//3
    public Person findOne2(Person person) {
        Person p = personRepository.findOne(person.getId());
        logger.info("by id,key by:" + p.getId() + "Data is cached");
        return p;
    }
}

完整代码地址:https://github.com/wyh-spring-ecosystem-student/spring-boot-student/tree/releases

 

除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/2081.html

关于

发表评论

表情 格式

暂无评论

登录

忘记密码 ?

切换登录

注册