首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

springboot 本地缓存

Spring Boot 本地缓存是指在应用程序的内存中存储数据,以便快速访问和减少对数据库或其他外部资源的访问次数。本地缓存可以显著提高应用程序的性能,特别是在读取频繁但更新较少的数据时。

基础概念

缓存:缓存是一种存储数据的临时存储区域,以便快速访问。在计算机科学中,缓存通常用于存储经常访问的数据,以减少对主存储器或网络资源的访问次数。

Spring Boot 缓存抽象:Spring Boot 提供了一个缓存抽象层,允许开发者通过简单的注解来启用和使用缓存。这个抽象层支持多种缓存实现,如 EhCache、Caffeine、Redis 等。

相关优势

  1. 性能提升:通过减少对数据库的访问,缓存可以显著提高应用程序的响应速度。
  2. 减轻数据库负载:缓存可以减少对数据库的读写操作,从而减轻数据库的负载。
  3. 简化代码:使用 Spring Boot 的缓存抽象,可以通过简单的注解来管理缓存,而不需要编写复杂的缓存逻辑。

类型

  1. 内存缓存:数据存储在应用程序的内存中,如 EhCache 和 Caffeine。
  2. 分布式缓存:数据存储在多个节点上,如 Redis 和 Memcached。

应用场景

  1. 频繁读取但不经常变化的数据:例如,配置信息、用户会话数据等。
  2. 计算密集型任务的结果:例如,复杂的查询结果、算法计算结果等。
  3. 页面片段缓存:在 Web 应用中,可以缓存部分页面内容以提高渲染速度。

示例代码

以下是一个使用 Spring Boot 和 Caffeine 进行本地缓存的简单示例:

添加依赖

pom.xml 中添加 Caffeine 和 Spring Boot 缓存支持的依赖:

代码语言:txt
复制
<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>

配置缓存

application.yml 中配置 Caffeine 缓存:

代码语言:txt
复制
spring:
  cache:
    type: caffeine
    caffeine:
      spec: maximumSize=500,expireAfterAccess=60s

启用缓存

在主应用程序类上添加 @EnableCaching 注解:

代码语言:txt
复制
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;

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

使用缓存

在服务类中使用 @Cacheable 注解来缓存方法的结果:

代码语言:txt
复制
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Cacheable("users")
    public User getUserById(Long id) {
        // 模拟从数据库中获取用户
        return new User(id, "John Doe");
    }
}

常见问题及解决方法

缓存未生效

原因:可能是由于缓存配置不正确或注解使用不当。

解决方法

  1. 确保在主应用程序类上添加了 @EnableCaching 注解。
  2. 检查缓存配置是否正确,特别是在 application.yml 中的配置。
  3. 确保使用了正确的缓存名称和键。

缓存数据不一致

原因:可能是由于缓存数据未及时更新或删除。

解决方法

  1. 使用 @CacheEvict 注解在数据更新或删除时清除缓存。
  2. 使用 @CachePut 注解在更新数据时同时更新缓存。

示例代码:

代码语言:txt
复制
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Cacheable("users")
    public User getUserById(Long id) {
        // 模拟从数据库中获取用户
        return new User(id, "John Doe");
    }

    @CachePut(value = "users", key = "#user.id")
    public User updateUser(User user) {
        // 模拟更新数据库中的用户
        return user;
    }

    @CacheEvict(value = "users", key = "#id")
    public void deleteUser(Long id) {
        // 模拟删除数据库中的用户
    }
}

通过以上步骤和示例代码,可以在 Spring Boot 应用程序中有效地使用本地缓存,从而提高应用程序的性能和响应速度。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

前端缓存之本地缓存

之前说了HTTP缓存,今天说说本地缓存。本地缓存也是平时开发过程经常用的。 本地缓存就简单多了,我们常用的有三个:cookie、localStorage、sessionStorage。...LocalStorage:localstorage会把内容一直存在浏览器,直到清除浏览器的缓存。注意,没有清除浏览器缓存,数据会永久存储在浏览器。Localstorage一般在5M左右。...PWA,不知道这个东西在以后会不会火,PWA主要是为了提供跟APP一样,很多东西缓存到本地,也叫作离线缓存就算在没有网的时候也能有内容展示,这也算缓存的一种。...还有一种很容易被忽略的缓存,往返缓存,有点类似单页面应用的history路由模式,就是浏览器的后退前进按钮,主要是为了加快页面的切换速度,不用重新请求,不仅保存了数据,还保存了DOM和JavaScript...这种缓存方式在微信里面也有很多使用。 (完)

1.1K10

使用本地缓存

,但是对于一些并发不是很大,但是频繁访问数据库也会影响性能和带来压力的一些场景,我们可以是用本地缓存来 提高程序响应速度和缓解服务器和数据可压力,常用的本地缓存有guava的本地cache,以及各个公司自己封装的本地缓存插件...(本质上本地缓存是使用Map实现的,差别在于实现方式和性能) ,此篇就使用guava实现本地缓存展开叙述: 一、新建maven项目&添加依赖 新建一个通用的maven工程,并添加一下guava依赖:...我们借助guava的本地缓存并对其封装,实现我们的本地缓存操作工具类,实现方式如下: package com.typhoon.demo1.cache; import java.util.List; import...总结 在有些场景下我们使用本地缓存更加方便和轻量级,但是任何一种事物都有其双面性,我们可以分析出本地缓存的优缺点: 优点:1)使用方便 2)更轻量级 缺点:1)不适合大中型项目中的高并发场景,如果强行使用...,会拖垮整个应用(本地缓存占用jvm内存) 2)不适合复杂的缓存场景 3)仍然存在缓存穿透问题 ps:原创不易,多多支持!

1.8K10
  • Java本地缓存

    本地缓存是指将数据暂存到本地计算机的内存中,以便在后续访问中能够更快地获取。本地缓存通常由应用程序使用,可以提高应用程序的性能和响应速度。...Map 在Java中,实现本地缓存通常使用key/value形式的数据结构,可以选择使用Map集合来作为存储容器。...并且在 spring5 (springboot 2.x) 后,spring 官方放弃了 Guava,而使用了性能更优秀的 Caffeine 作为默认缓存组件。...Caffeine是在Guava Cache的基础上做一层封装,性能有明显提高,二者同属于内存级本地缓存。...本地缓存与分布式缓存对应,缓存进程和应用进程同属于一个JVM,数据的读、写在一个进程内完成。本地缓存没有网络开销,访问速度很快。

    39621

    SpringBoot 缓存

    目录 一、缓存的作用 二、SpringBoot启用缓存 三、SpringBoot可整合的缓存技术 四、缓存使用案例——收集验证码 实体类开发 业务层开发 工具类(生成验证码) 控制层开发 SpringBoot...缓存不仅可以用于提高永久性存储介质的数据读取效率,还可以提供临时的数据存储空间 二、SpringBoot启用缓存 SpringBoot提供了缓存技术,方便缓存的使用 启用缓存 设置进入缓存的数据 设置读取缓存的数据...注解,启用缓存 @SpringBootApplication @EnableCaching //此注解表示开启缓存功能 public class Springboot4CacheApplication...可整合的缓存技术 SpringBoot提供的缓存技术除了提供默认的方案,还可以对其他缓存技术进行整合,统一接口,方便缓存技术的开发与管理。...,缓存功能的开启需要在SpringBoot工程的启动类中使用@EnableCaching开启缓存功能。

    12310

    本地缓存 vs 分布式缓存

    本地缓存 :应用中的缓存组件,缓存组件和应用在同一进程中,缓存的读写非常快,没有网络开销。但各应用或集群的各节点都需要维护自己的单独缓存,无法共享缓存。...3 本地缓存框架 虽然使用 JDK Map 能快捷构建缓存,但缓存的功能还是比较孱弱的。 因为现实场景里,我们可能需要给缓存添加缓存统计、过期失效、淘汰策略等功能。 于是,本地缓存框架应运而生。...图片 虽然本地缓存框架的功能很强大,但是本地缓存的缺陷依然明显。...缓存,如果 Redis 缓存也没数据,则通过 RPC 调用导购服务读取数据,然后再将数据写入本地缓存和 Redis 中;若 Redis 缓存不为空,则将缓存数据写入本地缓存中。...2、由于步骤1已经对本地缓存预热,后续请求直接读取本地缓存,返回给用户端。

    1.5K50

    缓存那些事儿之【本地缓存篇】

    二、本地缓存的几种设计应用方案 上面尽说的都是一些本地缓存和分布式缓存的概念,可能内容相对干涩。...下面将直接利用Java代码、配置文件、数据结构图、流程图等方式,分别从自定义构建本地缓存、Ehcache、Google Guava Cache这常用的三种本地缓存设计构建的设计方案出发,让大家对本地缓存有一个更为系统性的深刻理解...1.编程自定义构建本地缓存 对于自定义本地缓存的构建而言,基本的流程可以概括为,在系统启动后,【构建本地缓存】—>【定时任务触发/其他事件触发动态刷新本地缓存】—>【用本地缓存获取目标数据】—>【未命中...另外,为了提高本地缓存数据实时性的问题,也可以结合Zookeeper的自动发现机制,实时变更本地缓冲变量信息内容。...本文从应用缓存的原因出发,概括地介绍了本地缓存和分布式缓存的区别和不同点,详细介绍了利用本地缓存构建大型分布式系统的几种不同技术方案细节,主要包括自定义构建本地缓存、Encache缓存框架、Guava

    3.2K10

    本地缓存和分布式缓存

    根据存储位置和应用场景的不同,缓存技术分为本地缓存和分布式缓存两种。本文将详细介绍这两种缓存技术,以及它们在性能和效率上的权衡。...二、本地缓存 本地缓存概述 本地缓存是指将数据存储在本地应用程序或服务器上,通常用于加速数据访问和提高响应速度。本地缓存通常使用内存作为存储介质,利用内存的高速读写特性来提高数据访问速度。...本地缓存的优势 (1)访问速度快:由于本地缓存存储在本地内存中,因此访问速度非常快,能够满足频繁访问和即时响应的需求。...(3)低延迟:由于本地缓存位于本地设备上,因此能够提供低延迟的访问速度,适用于对实时性要求较高的应用场景。...本地缓存的不足 (1)可扩展性有限:本地缓存的可扩展性受到硬件资源的限制,无法支持大规模的数据存储和访问。

    53010

    springBoot 缓存开发

    * 1、安装redis:使用docker; * 2、引入redis的starter * 3、配置redis * 4、测试缓存 * 原理:CacheManager===Cache 缓存组件来实际给缓存中存取数据...,以后再有相同的数据,直接从缓存中获取,不用调用方法 * * cacheManager 管理多个cache组件的,对缓存的真正crud操作在cache组件中,每一个缓存组件有自己唯一一个名字...condition = "#a0>1" : 当一个参数大于1的时候才进行缓存 * unless:否定缓存,在条件成立的情况下,方法的返回值不会被缓存,可以获取到结果进行判断...; * 4、将目标方法返回的结果,放进缓存中 * * @Cacheable标注的方法执行之前先来检查缓存中有没有这个数据,默认按照参数的值作为key去查询缓存,...* value = "emp" 缓存的名字 * key = "#id" 缓存的id * allEntries = true 指定清空这个缓存中的所有数据

    39020

    springboot(5)--缓存

    缓存是应对高并发查询的利器,传统的spring使用缓存配置稍显笨重,springboot与缓存的结合使用,往往只需要添加依赖增加一行注解就能满足我们的基本使用。...此篇我们结合springboot分析一下ehcache,caffeine和redis缓存的使用方式。...springboot2.0.5依赖的基础库是spring5.x,而spring5中已经取消了对guava缓存的支持。 1.添加caffeine依赖 springboot&redis 前边两种方式都是进程缓存,对于分布式架构盛行的时代,分布式缓存redis大放异彩。 1.添加redis缓存依赖 <!...总结 合理的使用缓存,能够提高应用的性能和吞吐能力,但是缓存的滥用也会带来分布式环境下数据不一致问题,具体springboot编程时,选择使用哪一种缓存方式,还需要根据具体业务场景判定。

    49210

    SpringBoot缓存使用

    SpringBoot缓存使用 JSR-107 什么是JSR-107 JSR是Java Specification Requests 的缩写 ,Java规范请求,故名思议提交Java规范,大家一同遵守这个规范的话...>cache-api SpringBoot缓存注解 @EnableCaching 标记在主程序方法上,表示开启缓存 @Cacheable 方法运行之前...,先查询Cache(缓存组件),按照cacheName指定的名字获取(CacheManager获取相应缓存),第一次获取缓存如果没有Cache组件会自会自动创建 没有查到缓存就调用目标方法 核心:...几个属性: cacheNames/values:指定缓存组件的名字,将方法的返回结果放在哪个缓存中,是数组的方式,可以指定多个缓存 key:缓存数据使用的key;可以用它来指定。...;或者cacheResolver指定获取解析器 condition:指定符合条件的情况下才缓存; 如:condition = "#a0>1" 即第一个参数值大于1时才进行缓存 unless:否定缓存;

    65410

    java创建本地缓存模拟redis缓存操作

    java创建本地缓存,模拟redis的使用 在一般的小项目中,数据量不大.但是有的时候需要使用缓存记录一些标识或者票据之类的,比如我这边想实现,可以记录系统同时在线的用户数据,或者对其他数据的缓存记录,...创建本地缓存工具类 package com.adingxiong.cft.cache; import com.adingxiong.cft.entity.CacheEntity; import org.slf4j.Logger...java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; /** * @ClassName LocalCache * @Description 本地缓存...String, CacheEntity> cache = new ConcurrentHashMap(DEFAULT_CAPACITY); /** * 将key-value 保存到本地缓存并制定该缓存的过期时间...:{}", e.getMessage()); } return cloneObject; } /** * 从本地缓存中获取key对应的值,如果该值不存则则返回

    2.2K41
    领券