Spring Boot 中使用Caffeine缓存的简单例子

Caffeine 缓存是 Java 的高性能缓存库。本文简单记录下 Caffeine 缓存的用法。

依赖配置

xml 复制代码
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>
    <dependency>
        <groupId>com.github.ben-manes.caffeine</groupId>
        <artifactId>caffeine</artifactId>
    </dependency>
</dependencies>

代码配置

我们需要初始化 Caffeine 对象以及 Caffeine 缓存管理器。

java 复制代码
@Configuration
public class CaffeineConfig {

    @Bean
    public Caffeine<Object, Object> caffeine() {
        return Caffeine.newBuilder().expireAfterWrite(60, TimeUnit.MINUTES);
    }

    @Bean
    public CacheManager cacheManager(Caffeine<Object, Object> caffeine) {
        CaffeineCacheManager caffeineCacheManager = new CaffeineCacheManager();
        caffeineCacheManager.setCaffeine(caffeine);
        return caffeineCacheManager;
    }
}

使用缓存

首先,我们创建一个 Service.

java 复制代码
@Service
@Slf4j
public class AddressService {

    private static final Map<Long, AddressDTO> ADDRESS_TABLE = new HashMap<>();
    static {
        ADDRESS_TABLE.put(1L, new AddressDTO(1, "广东"));
        ADDRESS_TABLE.put(2L, new AddressDTO(2, "深圳"));
        ADDRESS_TABLE.put(3L, new AddressDTO(3, "坂田"));
    }

    @Cacheable(value = "address_cache", key = "#addressId")
    public AddressDTO getAddress(long addressId) {
        log.info("AddressService getAddress, addressId: {}", addressId);
        return ADDRESS_TABLE.get(addressId);
    }
}

其次,我们创建一个 Controller.

java 复制代码
@RestController
public class CaffeineController {
    @Autowired
    private AddressService addressService;

    @Autowired
    private CacheManager cacheManager;

    @GetMapping("/{addressId}")
    public AddressDTO getAddress(@PathVariable long addressId) {
        return addressService.getAddress(addressId);
    }

    @GetMapping("/cache/{addressId}")
    public AddressDTO findAddressFromCache(@PathVariable long addressId) {
        Cache addressCache = cacheManager.getCache("address_cache");
        if (addressCache != null) {
            return (AddressDTO)addressCache.get(addressId).get();
        }
        return null;
    }
}

然后就可以测试了。我们根据打印的日志来判断缓存是否生效了。

总结

当我们想从缓存中查询某条数据时,可以注入CacheManager,通过缓存名称来获取对应缓存,再根据key获取value。就像findAddressFromCache里那样。

这只是个简单例子,实际使用的时候还要多关注他的配置参数,最基本的就是缓存的过期时间,这样才能更好的使用它。

相关推荐
xsd95276 天前
Caffeine 手动策略缓存 put() 方法源码解析
java·缓存·源码·caffeine·本地缓存
一大颗萝卜2 个月前
【原创 架构设计】多级缓存的应用、常见问题与解决方式
redis·缓存·架构·caffeine·多级缓存
vivo互联网技术3 个月前
缓存框架 Caffeine 的可视化探索与实践
caffeine·缓存可视化·动态下发
ITenderL4 个月前
Redis+Caffeine 实现两级缓存实战
redis·caffeine
未来很长,别只看眼前1 年前
springBoot集成caffeine,自定义缓存配置 CacheManager
redis·缓存·cachemanager·caffeine