Caffeine Cache缓存
SpringBoot 集成 Caffeine
Caffeine 和 Spring Cache 依赖,使用注解方法实现缓存
依赖
<!--提供 Spring Boot 中的缓存支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency> <!-- Caffeine Cache 的具体实现-->
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>
配置缓存
1,Config
package com.james.config; import com.github.benmanes.caffeine.cache.Caffeine;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.caffeine.CaffeineCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.TimeUnit; @Configuration
@EnableCaching
public class CacheConfig { //通过 Caffeine.newBuilder() 构建一个 Caffeine 实例,并设置最大大小为 500 个条目,过期时间为 600 秒
@Bean
public CacheManager cacheManager() {
CaffeineCacheManager cacheManager = new CaffeineCacheManager();
cacheManager.setCaffeine(Caffeine.newBuilder()
.initialCapacity(1000) //// 初始的缓存空间大小
.maximumSize(500) // // 缓存的最大条数
.expireAfterAccess(60, TimeUnit.SECONDS)); // 设置最后一次写入或访问后经过固定时间过期
return cacheManager;
}
}
2,yml
spring:
#通过 spec 属性指定了缓存的一些属性,比如最大大小为 500 个条目,并设置了过期时间为 600 秒 2选一
cache:
caffeine:
spec: maximumSize=500,expireAfterAccess=600s
注解集成
@Cacheable:将方法的返回值缓存起来,并在后续对同样的方法进行调用时,直接返回缓存中的结果,而不会执行方法的实际逻辑;
//那么方法的返回值会被缓存在名为 “myCache” 的缓存中,而不会根据方法的参数进行细分。
//这种方式适用于方法的返回值在不同参数下是相同的,或者不关心具体的参数对应的缓存
@Cacheable(cacheNames = "myCache")
public String getCachedData(String key) {
// 从数据库或其他数据源获取数据
return data;
}
//则可以根据方法的参数进行细分缓存。每个不同的 Id 参数会对应一个不同的缓存键,从而实现了更精确的缓存控制。
//这种方式适用于每个参数对应的结果可能不同,或者需要根据不同的参数缓存不同的结果。
@Cacheable(value = "listTypeBook", key = "#Id")
public List<BookEntity> listTypeBook(Integer Id) {
List<BookEntity> bookEntities = bookMapper.listTypeBook(Id);
return bookEntities;
}
@CachePut:用于更新或添加缓存的值。无论缓存是否已存在,该方法都会执行,并将结果放入缓存中;
//方法 updateCache() 将通过 key 更新名为 “myCache” 的缓存的值
//无论是添加缓存还是更新缓存,都会执行方法体内的逻辑,并将结果更新到缓存中
@CachePut(cacheNames = "myCache", key = "#key")
public String updateCache(String key, String value) {
// 更新数据
return updatedData;
}
@CacheEvict:用于从缓存中删除数据。使用该注解会删除指定缓存名称中的一个或多个缓存条目;
//方法 evictCache() 将从名为 “myCache” 的缓存中删除具有指定 key 的缓存条目
@CacheEvict(cacheNames = "myCache", key = "#key")
public void evictCache(String key) {
// 删除数据
}
只引入 Caffeine 依赖,然后使用 Caffeine 方法实现缓存
<!-- Caffeine Cache 的具体实现-->
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>
config
@Configuration
public class CacheConfig {
@Bean
public Cache<String, Object> caffeineCache() {
return Caffeine.newBuilder()
// 设置最后一次写入或访问后经过固定时间过期
.expireAfterWrite(60, TimeUnit.SECONDS)
// 初始的缓存空间大小
.initialCapacity(100)
// 缓存的最大条数
.maximumSize(1000)
.build();
}
@Bean
public Cache<Integer, List<BookEntity>> caffeineCache3() {
return Caffeine.newBuilder()
.maximumSize(100)
.expireAfterWrite(10, TimeUnit.MINUTES)
.build();
}
}
代码
@Resource
Cache<Integer, List<BookEntity>> caffeineCache1;
@Resource
Cache<String, Object> caffeineCache; //查
@Override
public List<BookEntity> listTypeBook1(Integer id) {
// 从缓存中获取集合对象
List<BookEntity> cachedList = caffeineCache1.getIfPresent(id);
if (cachedList != null) {
return cachedList;
} // 如果缓存中不存在,则从数据库中获取集合对象
List<BookEntity> bookEntities = bookMapper.listTypeBook(id); // 将集合对象保存到缓存中
caffeineCache1.put(id, bookEntities); return bookEntities;
} // 添加缓存项
caffeineCache1.put(1, books); // 修改缓存项
caffeineCache1.put(1, updatedBooks); // 删除缓存项
caffeineCache1.invalidate(1);
Caffeine Cache缓存的更多相关文章
- 本地缓存解决方案-Caffeine Cache
1.1 关于Caffeine Cache Google Guava Cache是一种非常优秀本地缓存解决方案,提供了基于容量,时间和引用的缓存回收方式.基于容量的方式内部实现采用LRU算法,基于引 ...
- Spring Cache缓存技术的介绍
缓存用于提升系统的性能,特别适用于一些对资源需求比较高的操作.本文介绍如何基于spring boot cache技术,使用caffeine作为具体的缓存实现,对操作的结果进行缓存. demo场景 本d ...
- 如何把 Caffeine Cache 用得如丝般顺滑?
一.关于 Caffeine Cache 在推荐服务中,虽然允许少量请求因计算超时等原因返回默认列表.但从运营指标来说,越高的"完算率"意味着越完整的算法效果呈现,也意味着越高的商业 ...
- SpringBoot项目使用Caffeine本地缓存
环境配置:(或以上版本,必须) JDK 版本:1.8 Caffeine 版本:2.8.0SpringBoot 版本:2.2.2.RELEASE 也可以不与SpringBoot结合 1.添加maven ...
- Spring Cache缓存框架
一.序言 Spring Cache是Spring体系下标准化缓存框架.Spring Cache有如下优势: 缓存品种多 支持缓存品种多,常见缓存Redis.EhCache.Caffeine均支持.它们 ...
- 注释驱动的 Spring cache 缓存介绍
概述 Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使 ...
- Windows Azure Cloud Service (43) 使用Azure In-Role Cache缓存(2)Dedicated Role
<Windows Azure Platform 系列文章目录> Update 2016-01-12 https://azure.microsoft.com/zh-cn/documentat ...
- [转]注释驱动的 Spring cache 缓存介绍
原文:http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/ 概述 Spring 3.1 引入了激动人心的基于注释(an ...
- paip.cache 缓存架构以及性能提升总结
paip.cache 缓存架构以及性能提升总结 1 缓存架构以及性能(贯穿读出式(LookThrough) 旁路读出式(LookAside) 写穿式(WriteThrough) 回写式 ...
- Cache缓存对象缓存对象
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DemoCache.aspx ...
随机推荐
- linux常用命令(八) tar 打包、压缩、解包、解压缩
Linux 常用的压缩与解压缩命令有:tar.gzip.gunzip.bzip2.bunzip2.compress .uncompress. zip. unzip.rar.unrar 等. 首先要弄清 ...
- CF1363C
题目简化和分析: 首先注意特判 $ x $ 在叶子节点上 ( 即度为 \(1\) ). 因为每人都采用最优策略所以不可能有人执着的为别人开路. 就是不在同一颗子树上挣扎,会从外围不断清理. 但是每步必 ...
- buu pwn wp(持续更新)
1.warmup_csaw_2016 main函数如下 __int64 __fastcall main(int a1, char **a2, char **a3) { char s[64]; // [ ...
- JDK21的虚拟线程是什么?和平台线程什么关系?
虚拟线程(Virtual Thread)是 JDK 而不是 OS 实现的轻量级线程(Lightweight Process,LWP),由 JVM 调度.许多虚拟线程共享同一个操作系统线程,虚拟线程的数 ...
- 为zabbix穿上一件漂亮的外衣
zabbix+Grafana 7.0 zabbix的环境已部署好的情况下,zabbix部分-- 略 Grafana简介: 1.Grafana自身并存储数据,数据从其它地方获取.需要配置数据源 2.G ...
- 空地一体化网络综述_Space-Air-Ground Integrated Network: A Survey
摘要 空地一体化网络(SAGIN)主要解决的是单一网络下的局限性问题,此综述文章从网络设计.资源分配.到性能的优化,对近几年SAGIN的总结. 引言 受限于网络容量和覆盖范围,仅依靠地面通信系统无法在 ...
- 【Azure Durable Function】PowerShell Activity 函数遇见 Newtonsoft.Json.JsonReaderException: The reader's MaxDepth of 64 has been exceeded.
问题描述 创建PowerShell Azure Durable Function,执行大量的PowerShell脚本操作Azure Resource,遇见了一个非常非常奇怪的问题: Function ...
- 基于C# Socket实现的简单的Redis客户端
前言 Redis是一款强大的高性能键值存储数据库,也是目前NOSQL中最流行比较流行的一款数据库,它在广泛的应用场景中扮演着至关重要的角色,包括但不限于缓存.消息队列.会话存储等.在本文中,我们将介绍 ...
- 记一次 .NET 某工控电池检测系统 卡死分析
一:背景 1. 讲故事 前几天有位朋友找到我,说他的窗体程序有卡死现象,让我帮忙看下怎么回事,解决这种问题就需要在卡死的时候抓一个dump下来,拿到dump之后就可以分析了. 二:为什么会卡死 1. ...
- js做四则运算时,精度丢失问题及解决方法
一.前言:这个问题可以说是程序员必踩的坑,因此网上针对该问题的分析有很多也很详细,解决方法也比较统一,写法也是大同小异,本以为预期效果真能如他们所说是完美的,然而效果却是差强人意. 二.问题:首先,先 ...