使用@Cacheable,缓存优化的方式优化数据库的查询

简介: 使用@Cacheable,缓存优化的方式优化数据库的查询

使用@Cacheable,缓存优化的方式优化数据库的查询

本文讲解在springboot中如何利用@Cacheable,通过添加本地缓存,来优化查询,提升查询效率。

简介

在实际业务中,如果某些数据被频繁访问,则每次都去读取数据库显然是不太优雅的。此时,我们可以添加本地缓存来提高系统的查询效率。在Java中,我们可以使用基于ConcurrentHashMap等数据结构实现的Local Cache,在内存层面对数据进行缓存,从而避免频繁访问数据库。

例如,在图书管理系统中,我们可以添加一个名为bookCache的ConcurrentHashMap缓存对象,用于存储Book类的对象。当我们进行查询操作时,先在缓存对象中寻找是否存在所需的Book对象,如果已经存在则直接返回;否则再从数据库中读取,并将其缓存至bookCache中,从而加快下一次查询的速度。

@Cacheable简介

首先,我们需要引入Spring Boot自带的缓存模块,可以在pom.xml文件中添加如下依赖:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

接下来,在我们的Service层中,我们可以使用Mybatis-Plus提供的IService接口作为基础Service,然后使用Spring Boot的@Cacheable注解为其添加缓存功能。例如,我们可以在Service接口方法上添加如下代码:

@Override
@Cacheable(value = "book", key = "#isbn")
public Book getByIsbn(String isbn) {
    // 从数据库中读取图书信息并返回
}

其中,@Cacheable注解表示启用缓存,并指定value参数为book,表示缓存Key; key参数为#isbn,则表示缓存的键名为isbn变量的值。

此外,在使用@Cacheable注解前,我们还需要增加@EnableCaching注解激活缓存。例如,在Spring Boot项目启动类中,我们可以添加如下代码:

@SpringBootApplication
@EnableCaching
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

这样,当我们调用Service层的getByIsbn方法时,Spring就会自动从本地缓存中获取相应的数据。如果缓存中不存在相应的数据,则再从数据库中读取,并将其缓存到本地。

需要注意的是,当使用缓存时,我们需要适度控制缓存时间和尺寸,以避免过期或者内存溢出等问题。此外,在分布式环境下,我们还需要设计好缓存的更新与同步机制,保证数据的一致性和正确性。

同时,我们也可以在类上方添加@CacheConfig注解,统一配置缓存,例如:

@Service
@CacheConfig(cacheNames = "bookCache")
public class BookServiceImpl extends ServiceImpl<BookMapper, Book> implements IBookService {
    @Override
    @Cacheable(key = "#isbn")
    public Book selectByIsbn(String isbn) {
        // ...
    }
}

这样,我们就能够在Spring Boot + Mybatis-Plus + Lombok的架构中为Service层添加本地缓存的功能了。在读取数据较为频繁,但数据更新较少的情况下,使用本地缓存可以大幅提高程序的效率和响应速度。

代码注意事项

首先,需要添加如下依赖,包括Spring Boot、Mybatis-Plus、Lombok和Caffeine缓存模块:

<!-- Spring Boot -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Mybatis-Plus -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.1</version>
</dependency>
<!-- Lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
<!-- Caffeine -->
<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
    <version>3.0.6</version>
</dependency>

接下来,我们创建一个基于Mybatis-Plus提供的IService接口的Service类,并使用@Cacheable注解为其中的方法添加缓存功能。例如:

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
@Service
public class BookServiceImpl extends ServiceImpl<BookMapper, Book> implements IBookService {
    @Override
    @Cacheable(value = "book", key = "#isbn")
    public Book getByIsbn(String isbn) {
        QueryWrapper<Book> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("isbn", isbn);
        return baseMapper.selectOne(queryWrapper);
    }
    @Override
    @CacheEvict(value = "book", key = "#isbn")
    public void deleteByIsbn(String isbn) {
        QueryWrapper<Book> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("isbn", isbn);
        baseMapper.delete(queryWrapper);
    }
}

在上述代码中,@Cacheable注解用于缓存getByIsbn方法的返回值;value参数为book,表示缓存Key;key参数为#isbn,则表示缓存的键名为传入的isbn值。

同时,我们还为删除ISBN记录(deleteByIsbn方法)增加了@CacheEvict注解,表示当该方法执行时,会清除与isbn对应的本地缓存。这样,当我们执行删除操作后,就不会出现脏数据。

另外,在Spring Boot启动类中我们需要使用@EnableCaching注解激活缓存:

@SpringBootApplication
@EnableCaching
public class Application {
  // ...
}

最后,在application.yml配置文件中添加以下内容,指定采用Caffeine作为本地缓存:

spring:
  cache:
    type: caffeine
    caffeine:
      spec: maximumSize=100,expireAfterAccess=10s

这里我们指定本地缓存最大数量为100,过期时间为10秒。

相关文章
|
9月前
|
存储 人工智能 NoSQL
AI大模型应用实践 八:如何通过RAG数据库实现大模型的私有化定制与优化
RAG技术通过融合外部知识库与大模型,实现知识动态更新与私有化定制,解决大模型知识固化、幻觉及数据安全难题。本文详解RAG原理、数据库选型(向量库、图库、知识图谱、混合架构)及应用场景,助力企业高效构建安全、可解释的智能系统。
|
9月前
|
SQL 存储 监控
SQL日志优化策略:提升数据库日志记录效率
通过以上方法结合起来运行调整方案, 可以显著地提升SQL环境下面向各种搜索引擎服务平台所需要满足标准条件下之数据库登记作业流程综合表现; 同时还能确保系统稳健运行并满越用户体验预期目标.
442 6
|
9月前
|
缓存 运维 监控
Redis 7.0 高性能缓存架构设计与优化
🌟蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕Redis 7.0高性能缓存架构,探索函数化编程、多层缓存、集群优化与分片消息系统,用代码在二进制星河中谱写极客诗篇。
1789 3
|
10月前
|
存储 缓存 NoSQL
Redis专题-实战篇二-商户查询缓存
本文介绍了缓存的基本概念、应用场景及实现方式,涵盖Redis缓存设计、缓存更新策略、缓存穿透问题及其解决方案。重点讲解了缓存空对象与布隆过滤器的使用,并通过代码示例演示了商铺查询的缓存优化实践。
403 1
Redis专题-实战篇二-商户查询缓存
|
10月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
1800 5
|
10月前
|
SQL 缓存 监控
MySQL缓存机制:查询缓存与缓冲池优化
MySQL缓存机制是提升数据库性能的关键。本文深入解析了MySQL的缓存体系,包括已弃用的查询缓存和核心的InnoDB缓冲池,帮助理解缓存优化原理。通过合理配置,可显著提升数据库性能,甚至达到10倍以上的效果。
|
11月前
|
缓存 运维 安全
WordPress安全加速:Cloudflare + Nginx缓存优化方案
本文介绍如何通过Cloudflare与Nginx优化WordPress网站性能,涵盖静态资源长期缓存、动态页面智能缓存及敏感路径保护,提升加载速度并保障后台安全。适用于使用Cloudflare与Nginx环境的WordPress站点。
490 0
|
机器学习/深度学习 SQL 运维
数据库出问题还靠猜?教你一招用机器学习优化运维,稳得一批!
数据库出问题还靠猜?教你一招用机器学习优化运维,稳得一批!
561 4
|
存储 机器学习/深度学习 缓存
性能最高提升7倍?探究大语言模型推理之缓存优化
本文探讨了大语言模型(LLM)推理缓存优化技术,重点分析了KV Cache、PagedAttention、Prefix Caching及LMCache等关键技术的演进与优化方向。文章介绍了主流推理框架如vLLM和SGLang在提升首Token延迟(TTFT)、平均Token生成时间(TPOT)和吞吐量方面的实现机制,并展望了未来缓存技术的发展趋势。
4023 13
性能最高提升7倍?探究大语言模型推理之缓存优化