springboot 整合 Caffine(springboot3.2)

spring autoconfiguer

@Bean
	CaffeineCacheManager cacheManager(CacheProperties cacheProperties, 
                                      CacheManagerCustomizers customizers,
                            		ObjectProvider<Caffeine<Object, Object>> caffeine, 
                                      ObjectProvider<CaffeineSpec> caffeineSpec,
                    			ObjectProvider<CacheLoader<Object, Object>> cacheLoader
                                     ) {
		CaffeineCacheManager cacheManager = createCacheManager(cacheProperties, caffeine, caffeineSpec, cacheLoader);
		List<String> cacheNames = cacheProperties.getCacheNames();
		if (!CollectionUtils.isEmpty(cacheNames)) {
			cacheManager.setCacheNames(cacheNames);
		}
		return customizers.customize(cacheManager);
	}

从配置中看,需要配置的Bean有caffeine,caffeineSpec和cacheLoader;
cacheProperties可以替代caffeineSpec;
如果配置有caffeine的时候,也就不需要cacheLoader和caffeineSpec;
因此来看主要有两种配置方法

  1. 配置Caffeine
  2. 配置CacheLoader 和(caffeineSpec、CacheProperties其中一个)

因为caffeine规范中有的没有办法在spec中配置(例如Scheduler),所有建议配置Caffeine;

实战

/**
 * @author rxw
 * <p>description: 配置Caffeine
 */
@EnableCaching
@SpringBootConfiguration
@Slf4j
public class CaffeineConfiguration {

    @Bean
    public Caffeine<Object,Object> caffeine() {
        return Caffeine.newBuilder()
                .initialCapacity(50)
                .maximumSize(50_000)
//                .expireAfterWrite(10, TimeUnit.SECONDS)
                .expireAfterAccess(10,TimeUnit.SECONDS)
                // 一下步骤只能在Caffeine中配置,所以建议配置Caffeine
                .scheduler(Scheduler.systemScheduler())
                .evictionListener((k,v,cause) -> {
                    log.info("eviction" + String.valueOf(k));
                    log.info("eviction" + JSON.toJSONString(v));
                    log.info("eviction" + String.valueOf(cause.wasEvicted()));
                })
                .removalListener((k,v,cause) -> {
                    log.info("remova" + String.valueOf(k));
                    log.info("remova" + JSON.toJSONString(v));
                    log.info("remova" + String.valueOf(cause.wasEvicted()));
                });
    }
}
@Service
@CacheConfig(cacheNames = "student")
public class StudentServiceImpl implements IStudentService {


    @Cacheable(cacheNames = "-",key = "#id",unless = "#id > 1000")
    @Override
    public Student getById(Long id) {
        String string = UUID.randomUUID().toString();
        Student student = new Student();
        student.setId(id);
        student.setName(string);
        return student;
    }

    @CachePut(cacheNames = "-",key = "#id",unless = "#id > 1000" )
    @Override
    public Student updateById(Long id, Student student) {
        student.setId(id);
        return student;
    }

    @CacheEvict(cacheNames = "-",key = "#id")
    @Override
    public void deleteById(Long id) {
    }
}

新发现

@CachePut :把key和value进行缓存,如果已经有缓存则修改缓存
当使用该注解修改缓存的时候会触发removalListener,因此removalListener中不建议有其他的操作。

相关推荐

  1. SpringBoot整合Logback

    2024-03-25 12:20:03       52 阅读
  2. SpringBoot整合JWT

    2024-03-25 12:20:03       58 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-25 12:20:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-25 12:20:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-25 12:20:03       87 阅读
  4. Python语言-面向对象

    2024-03-25 12:20:03       96 阅读

热门阅读

  1. 完全背包,LeetCode322. 零钱兑换

    2024-03-25 12:20:03       34 阅读
  2. QT 常用模块介绍以及使用说明

    2024-03-25 12:20:03       39 阅读
  3. 小程序配置服务器域名

    2024-03-25 12:20:03       41 阅读
  4. vscode配置rp2040出错记录

    2024-03-25 12:20:03       36 阅读
  5. 交叉编译

    2024-03-25 12:20:03       39 阅读
  6. 洛谷 Cut Ribbon

    2024-03-25 12:20:03       40 阅读
  7. 自学算法:03 一维动态规划

    2024-03-25 12:20:03       42 阅读
  8. PTA天梯赛习题 L2-004 这是二叉搜索树吗?

    2024-03-25 12:20:03       41 阅读