当前位置: 首页 > news >正文

使用Caffeine实现帖子的缓存来优化网站的运行速度

导入依赖

		<!-- https://mvnrepository.com/artifact/com.github.ben-manes.caffeine/caffeine --><dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId><version>3.1.7</version></dependency>

在Service层中调用Caffeine的接口

@Service
public class DiscussPostService {private final static Logger logger = LoggerFactory.getLogger(DiscussPostService.class);@Autowiredprivate DiscussPostMapper discussPostMapper;@Value("${caffeine.posts.max-size}")private int maxSize;@Value("${caffeine.posts.expire-seconds}")private int expireSeconds;// Caffeine's core API: Cache, LoadingCache, AsyncLoadingCache// posts list cacheprivate LoadingCache<String, List<DiscussPost>> postListCache;// posts total number cacheprivate LoadingCache<Integer, Integer> postRowsCache;@PostConstructpublic void init(){// initialize the post list cachepostListCache = Caffeine.newBuilder().maximumSize(maxSize).expireAfterWrite(expireSeconds, TimeUnit.SECONDS).build(new CacheLoader<String, List<DiscussPost>>() {@Overridepublic @Nullable List<DiscussPost> load(String key) throws Exception {if(key == null || key.length() == 0){throw new IllegalArgumentException("parameter error: key must not be null");}String[] params = key.split(":");if(params == null || params.length != 2) {throw new IllegalArgumentException("parameter error");}int offset = Integer.valueOf(params[0]);int limit = Integer.valueOf(params[1]);// in there, we can add second level cache, such as Redis// if we can't find data in the Redis, then query it in MySQLlogger.debug("load post list from DB...");return discussPostMapper.selectDiscussPosts(0, offset, limit, 1);}});// initialize the post total number cachepostRowsCache = Caffeine.newBuilder().maximumSize(maxSize).expireAfterWrite(expireSeconds, TimeUnit.SECONDS).build(new CacheLoader<Integer, Integer>() {@Overridepublic @Nullable Integer load(Integer key) throws Exception {logger.debug("load post list from DB...");return discussPostMapper.selectDiscussPostRows(key);}});}public List<DiscussPost> findDiscussPosts(int userId, int offset, int limit, int orderMode) {if(userId == 0 && orderMode == 1){return postListCache.get(offset + ":" + limit);}logger.debug("load post list from DB...");return discussPostMapper.selectDiscussPosts(userId, offset, limit, orderMode);}public int findDiscussPostRows(int userId) {if (userId == 0) {return postRowsCache.get(userId);}logger.debug("load post rows from DB...");return discussPostMapper.selectDiscussPostRows(userId);}
}

测试

@SpringBootTest
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = MyCommunityApplication.class)
public class CaffeineTest {@Autowiredprivate DiscussPostService postService;@Testpublic void testCache(){System.out.println(postService.findDiscussPosts(0, 0, 10, 1));System.out.println(postService.findDiscussPosts(0, 0, 10, 1));System.out.println(postService.findDiscussPosts(0, 0, 10, 1));System.out.println(postService.findDiscussPosts(0, 0, 10, 0));}
}

结果:
在这里插入图片描述
可以看到,第一次记录还未加入缓存,所以是从DB中加载,而后两次访问记录都是从Caffeine中加载的;最后一次访问是强制要求从DB中访问的。

通过压力测试检测使用缓存提高的效率

相关文章:

使用Caffeine实现帖子的缓存来优化网站的运行速度

导入依赖 <!-- https://mvnrepository.com/artifact/com.github.ben-manes.caffeine/caffeine --><dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId><version>3.1.7</version>…...

Webpack5 搭建Vue项目(进阶版)

Webpack5 搭建Vue项目&#xff08;进阶版&#xff09; 提示&#xff1a;中间隔了好长时间&#xff0c;我胡汉三又回来继续更新了&#xff01;&#xff01;&#xff01;&#x1f602;&#x1f602;&#x1f602; 文章目录 Webpack5 搭建Vue项目&#xff08;进阶版&#xff09;前…...

论文阅读:Distortion-Free Wide-Angle Portraits on Camera Phones

论文阅读&#xff1a;Distortion-Free Wide-Angle Portraits on Camera Phones 今天介绍一篇谷歌 2019 年的论文&#xff0c;是关于广角畸变校正的。 Abstract 广角摄影&#xff0c;可以带来不一样的摄影体验&#xff0c;因为广角的 FOV 更大&#xff0c;所以能将更多的内容…...

力扣每日一题---207. 课程表

Problem: 207. 课程表 文章目录 解题方法复杂度Code 解题方法 y总的 Topsort 模板题 复杂度 时间复杂度: 添加时间复杂度, 示例&#xff1a; O ( n ) O(n) O(n) 空间复杂度: 添加空间复杂度, 示例&#xff1a; O ( n ) O(n) O(n) Code class Solution {int res 0; public…...

在Kubernetes环境中有关Nginx Ingress与API Gateway的连接问题

文章目录 小结问题解决参考 小结 在Kubernetes环境中是通过Nginx Ingress来从外部访问Kubernetes内部的环境&#xff0c;并用API Gateway来分发请求&#xff0c;碰到了 502 Bad gateway.的问题&#xff0c;并尝试解决。 问题 从外部通过Nginx Ingress访问Kubernetes内部的环…...

c语言练习44:深入理解strstr

深入理解strstr strstr作用展示&#xff1a; #include <stdio.h> #include <string.h> int main() {char str[] "This is a simple string";char* pch;pch strstr(str, "simple");/*strncpy(pch, "sample", 6);*/printf("%s…...

渗透测试漏洞原理之---【业务安全】

文章目录 1、业务安全概述1.1业务安全现状1.1.1、业务逻辑漏洞1.1.2、黑客攻击目标 2、业务安全测试2.1、业务安全测试流程2.1.1、测试准备2.1.2、业务调研2.1.3、业务建模2.1.4、业务流程梳理2.1.5、业务风险点识别2.1.6 开展测试2.1.7 撰写报告 3、业务安全经典场景3.1、业务…...

CentOS查看CPU、内存、网络流量和磁盘 I/O

安装 yum install -y sysstat sar -d 1 1 rrqm/s: 每秒进行 merge 的读操作数目。即 delta(rmerge)/s wrqm/s: 每秒进行 merge 的写操作数目。即 delta(wmerge)/s r/s: 每秒完成的读 I/O 设备次数。即 delta(rio)/s w/s: 每秒完成的写 I/O 设备次数。即 delta(wio)/s rsec/s:…...

无人机航线规划

无人机航线规划&#xff0c;对于无人机的任务执行有着至关重要的作用&#xff0c;无人机在从起点飞向目的点的过程中&#xff0c;如何规划出一条安全路径&#xff0c;并且保证该路径代价最优&#xff0c;是无人机航线规划的主要目的。其中路径最优的含义是&#xff0c;在无人机…...

react中受控组件与非受控组件

受控组件与非受控组件 受控组件: 其值由 React 控制的组件,通常使用 state 来控制和修改组件的值。 例如受控的 组件: class NameForm extends React.Component {constructor(props) {super(props);this.state {value: };}handleChange (event) > {this.setState({val…...

【网络教程】如何解决Docker删除镜像和容器后磁盘空间未释放的问题

文章目录 问题分析解决方案删除未使用的容器删除未使用的镜像删除未使用的数据卷调整Docker数据存储路径问题分析 当删除Docker镜像和容器后,磁盘空间并未释放,这可能导致磁盘空间不足。造成此问题的原因包括: Docker镜像和容器的删除策略:默认情况下,Docker不会立即删除…...

Python中的进度条显示方案

迷途小书童 读完需要 3分钟 速读仅需 1 分钟 大家好&#xff0c;我是迷途小书童! tqdm 是一个非常常用的 Python 进度条库&#xff0c;它可以在循环迭代和 IO 操作期间添加一个进度条&#xff0c;直观地显示循环迭代的进程。 tqdm 是在 2013 年发布的&#xff0c;目的是为 Pyth…...

2023-09-05力扣每日一题

链接&#xff1a; 2605. 从两个数字数组里生成最小数字 题意&#xff1a; 两个数组都只包含1-9的数字&#xff0c;求一个最小数&#xff0c;两个数组内都要有它的其中一位 解&#xff1a; 要么是个位数要么是十位数&#xff0c;存一下数量和两边的最小数即可 实际代码&am…...

ODC现已开源:与开发者共创企业级的数据库协同开发工具

OceanBase 开发者中心&#xff08;OceanBase Developer Center&#xff0c;以下简称 ODC&#xff09;是一款开源的数据库开发和数据库管理协同工具&#xff0c;从首个版本上线距今已经发展了三年有余&#xff0c;ODC 逐步由一款专为 OceanBase 打造的开发者工具演进成为支持多数…...

生成克隆钓鱼网站与对win7进行后渗透操作

目录 目录 前言 系列文章列表 思维导图 1&#xff0c;实验涉及复现环境 2&#xff0c;CS的介绍 2.1,CS的简介 2.2,CS的主要功能 3&#xff0c;CS的安装 3.1,将cobalt_strike_4.5文件夹放到kali中 3.1,放入过程中的注意事项 3.2,如图所示 4,配置工具 4.1,进入c…...

Ubuntu18中NVIDIA,cuda,cudnn,pytorch安装

注意&#xff1a;nvidia驱动和cuda,cudnn,pytroch,python的对应关系 linux安装pytorch&#xff08;包括cuda与cudnn&#xff09;_linux清华园按照pytorch1.12_BryceRui的博客-CSDN博客 安装流程&#xff1a;安装cuda&#xff08;包括nvidia驱动&#xff09; cudnn python安装…...

MATLAB中M文件编写

简介 所谓M文件就是将处理问题的各种命令融合到一个文件中&#xff0c;该文件以.m为扩展名。然后&#xff0c;由MATLAB系统编译M文件&#xff0c;得出相应的运行结果。M文件具有相当大的可开发性和扩展性。M文件有脚本文件和函数文件两种。脚本文件不需要输入参数&#xff0c;…...

企业数字化神经网络

随着数字化时代的到来&#xff0c;数据已经成为企业战略性资源和重要的生产要素。企业数字化转型的核心是充分开发和利用数据资源&#xff0c;以数据为驱动&#xff0c;对业务流程进行重构与创新&#xff0c;从而提升企业的核心竞争力。业务系统是企业数据资源的源头&#xff0…...

C++this指针

本文旨在讲解C中this关键字&#xff0c;以及其相关作用&#xff01; 定义 this 是 C 中的一个关键字&#xff0c;也是一个 const 指针&#xff0c;它指向当前对象&#xff0c;通过它可以访问当前对象的所有成员。 this的介绍 下面来看一下关于this这个关键字的实例&#xff0…...

【初阶C语言】操作符1--对二进制的操作

前言&#xff1a;本节内容介绍的操作符&#xff0c;操作的对象是二进制位。所以前面先介绍整数的二进制位 一、二进制位介绍 1.二进制介绍 &#xff08;1&#xff09;整数的二进制表示形式有三种&#xff1a;原码、反码和补码。 &#xff08;2&#xff09;原码、反码和补码的…...

混合人工智能架构可以将神经形态系统转变为可靠的发现机器。

基于ON-OFF神经元的高阶伊辛机架构。图片来源&#xff1a;Nature Communications (2026)。DOI&#xff1a;10.1038/s41467-026-71937-4来源&#xff1a;https://techxplore.com/news/2026-05-hybrid-ai-architecture-neuromorphic-reliable.html主导世界的AI机器可以分为三大类…...

DelphiOpenAI:原生集成OpenAI API,赋能Delphi开发者构建智能应用

1. 项目概述&#xff1a;DelphiOpenAI&#xff0c;一个为Delphi开发者打造的AI桥梁如果你是一名Delphi开发者&#xff0c;看着Python、JavaScript社区热火朝天地集成各种AI能力&#xff0c;自己却苦于没有成熟、好用的原生库&#xff0c;只能望“AI”兴叹&#xff0c;那么今天介…...

基于多平台行为数据构建AI Agent深度用户画像:Know Your Owner项目解析

1. 项目概述&#xff1a;从“你是谁”到“我懂你”的智能跨越在AI助手日益普及的今天&#xff0c;我们面临着一个核心矛盾&#xff1a;用户期望获得高度个性化的服务&#xff0c;而AI助手在初次接触时却对用户一无所知。传统的解决方案&#xff0c;比如让用户填写冗长的问卷&am…...

保姆级避坑指南:用GGCNN源码处理Cornell抓取数据集,解决tiff文件生成失败问题

GGCNN源码实战&#xff1a;Cornell数据集预处理深度排错指南 第一次运行GGCNN的Cornell数据集预处理脚本时&#xff0c;我盯着毫无反应的终端窗口足足等了十分钟——没有进度条&#xff0c;没有错误提示&#xff0c;只有光标在无情地闪烁。这大概是每个复现论文的开发者都会经历…...

别再只调API了!深入Qt QGraphicsView事件流,彻底搞懂拖拽缩放背后的‘为什么’

深入Qt QGraphicsView事件流&#xff1a;从拖拽缩放的底层机制到高效调试 在Qt的图形视图框架中&#xff0c;QGraphicsView、QGraphicsScene和QGraphicsItem构成了一个强大的交互系统。许多开发者虽然能够通过调用API实现基本功能&#xff0c;但当遇到事件被意外吞噬、坐标计算…...

Java SE 与 Spring Boot 在电商场景中的应用

面试&#xff1a;Java SE 与 Spring Boot 在电商场景中的应用 今天&#xff0c;我们将围绕一位求职者在一家电商公司的面试场景&#xff0c;与面试官进行一场激烈的技术问答。第一轮提问 面试官&#xff1a; 首先&#xff0c;请你简单介绍一下 JVM 的工作原理。 燕双非&#xf…...

芯片晶圆平面度如何测量?半导体制造中的光学形貌检测方案

晶圆作为集成电路的核心承载基片&#xff0c;表面形貌的精度直接关系到光刻聚焦质量、芯片电学性能及最终良率。从8英寸到12英寸的大尺寸晶圆制造中&#xff0c;平面度、翘曲度&#xff08;Warp&#xff09;、总厚度变化&#xff08;TTV&#xff09;及局部平面度&#xff08;SF…...

告别重复点击!淘金币自动化脚本让你每天多出20分钟自由时间

告别重复点击&#xff01;淘金币自动化脚本让你每天多出20分钟自由时间 【免费下载链接】taojinbi 淘宝淘金币自动执行脚本&#xff0c;包含蚂蚁森林收取能量&#xff0c;芭芭农场全任务&#xff0c;解放你的双手 项目地址: https://gitcode.com/gh_mirrors/ta/taojinbi …...

社交媒体运营实战指南:从算法逻辑到内容变现的完整技能树

1. 项目概述&#xff1a;社交媒体技能库的构建与价值在信息爆炸的今天&#xff0c;社交媒体早已不是简单的“发发状态、看看朋友”的平台。无论是个人品牌塑造、产品推广、内容创作&#xff0c;还是求职招聘、行业洞察&#xff0c;社交媒体都扮演着至关重要的角色。然而&#x…...

Windows安装安卓APK的完整指南:APK Installer免费工具使用教程

Windows安装安卓APK的完整指南&#xff1a;APK Installer免费工具使用教程 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 还在为电脑无法运行安卓应用而烦恼吗&#x…...