首页 > 其他分享 >14-spring cache 学习

14-spring cache 学习

时间:2024-09-12 10:15:42浏览次数:8  
标签:缓存 14 spring cache blog user key 方法 public

Spring Cache 介绍

Spring Cache 是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。
Spring Cahce 提供了一层抽象,底层可以切换不同的 cache 实现,具体就是通过 CacheManager 接口来统一不同的缓存技术。
CacheManager 是 Spring 提供的各种缓存技术抽象接口。

 

Spring Cache 注解

在 spring boot 项目中,使用缓存技术只需要在项目中导入相关缓存技术的依赖包,并在启动类上使用 @EnableCaching 开启缓存支持即可

@EnableCaching 开启缓存注解功能
@Cacheable 触发缓存,在方法执行前 spring 先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中
@CacheEvict 缓存清除,将一条或多条数据从缓存中删除(常用于增、删、改接口)
@CachePut 在不影响方法执行的情况下更新缓存,将方法的返回值放到缓存中

 

 

 

 

注意:使用SpringCache的缓存功能,尤其是在数据库查询时,可以将第一次查询的结果存储到Redis缓存中,避免每次调用重复数据都要查一次数据库,有效减少资源的浪费,但也要注意一些修改数据的增删改查操作,要及时清除缓存。

 

1. 启动类上使用 @EnableCaching 

使用@BladeCloudApplication注解时,可以不再添加@EnalbleCaching注解,其中包含缓存的注解

package org.springblade.demo;

import org.springblade.common.constant.CommonConstant;
import org.springblade.core.cloud.client.BladeCloudApplication;
import org.springblade.core.launch.BladeApplication;
import org.springframework.cache.annotation.EnableCaching;

@BladeCloudApplication
@EnableCaching
public class DemoApplication {
    public static void main(String[] args) {
        BladeApplication.run(CommonConstant.BLADE_DEMO_NAME, DemoApplication.class, args);
    }
}

 

2. @Cacheable注解

@Cacheable 注解在方法上,表示该方法的返回结果是可以缓存的。也就是说,该方法的返回结果会放在缓存中,以便于以后使用相同的参数调用该方法时,会返回缓存中的值,而不会实际执行该方法

 提供两个参数来指定缓存名:value、cacheNames,二者选其一即可 

@GetMapping("list")
public R list(){
return R.data(this.blogService.list());
}

/**
 @Cacheable: 在方法执行前 spring 先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中
 cacheNames: 缓存的名称
*/
@GetMapping("listCache")
@Cacheable(cacheNames="blog")
public R listCache(){
log.info("使用缓存");
return R.data(this.blogService.list());
}

/**
 @Cacheable: 在方法执行前 spring 先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中
 cacheNames: 缓存的名称
 key: 缓存的 key
*/
@GetMapping("listCache")
@Cacheable(cacheNames="blog",key="'list'")
public R listCache(){
log.info("使用缓存");
return R.data(this.blogService.list());
}

/**
 @Cacheable: 在方法执行前 spring 先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中
 value: 缓存的名称,每个缓存名称下面可以有多个 key
 key: 缓存的 key
 condition: 条件,满足条件才缓存数据
*/
@Cacheable(value = "userCache", key = "#user.id", condition = "#user != null")
@GetMapping("/{id}")
public User getById(@PathVariable Long id){
    User user = userService.getByUd(id);
    return user;
}

/**
 @Cacheable: 在方法执行前 spring 先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中
 value: 缓存的名称,每个缓存名称下面可以有多个 key
 key: 缓存的 key
 condition: 条件,满足条件才缓存数据
 unless: 满足条件则不缓存
*/
@Cacheable(value = "userCache", key = "#user.id", unless= "#user == null")
@GetMapping("/{id}")
public User getById(@PathVariable Long id){
    User user = userService.getByUd(id);
    return user;
}

 

3. @CacheEvict注解

使用了 @CacheEvict 注解的方法,会清空指定缓存。一般用在更新或者删除的方法上

allEntries 是 @CacheEvict 特有的一个属性,意为是否删除整个缓存(value 或 cacheNames 指定的),默认为 false。

@PostMapping("update")
public R update(@RequestBody BlogEntity blog) {
return R.status(this.blogService.updateById(blog));
}


/**
 CacheEvict: 清理指定缓存
 value: 缓存的名称,每个缓存名称下面可以有多个 key
 key: 缓存的 key
*/
@PostMapping("updateCache")
@CacheEvict(cacheNames="blog",key = "#blog.isDeleted")
public R updateCache(@RequestBody BlogEntity blog) {
log.info("删除缓存");
return R.status(this.blogService.updateById(blog));
}


/**
 CacheEvict: 清理指定缓存
 value: 缓存的名称,每个缓存名称下面可以有多个 key
 key: 缓存的 key
 allEntries : 清理所有缓存属性,默认为 false
*/
@PostMapping("updateCache")
@CacheEvict(cacheNames="blog",allEntries=true)
public R updateCache(@RequestBody BlogEntity blog) {
log.info("删除缓存");
return R.status(this.blogService.updateById(blog));
}

 

4. @CachePut注解

加了 @CachePut 注解的方法,会把方法的返回值 put 到缓存里面缓存起来,供其它地方使用。它通常用在新增方法上。

/**
 CachePut: 将方法返回值放入缓存
 value: 缓存的名称,每个缓存名称下面可以有多个 key
 key: 缓存的 key
*/
@CachePut(value = "userCache", key = "#user.id")
@PostMapping
public User save(User user){
    userService.save(user);
    return user;
}

 

标签:缓存,14,spring,cache,blog,user,key,方法,public
From: https://www.cnblogs.com/REN-Murphy/p/18409623

相关文章

  • Springboot项目部署时使用Mail注入Bean时的Constructor threw exception
    缘起:今天打算把写了好一段时间的项目提溜到服务器上转转,然后在启动的时候就发现了个问题,在日志跑到【JobFactorysetto:org.springframework.scheduling.quartz.SpringBeanJobFactory@31e7afde】的时候他就不动了,然后等了好一会他才抛出了个异常【org.springframework.beans.f......
  • LeetCode Hot100刷题记录-142. 环形链表 II
    给定一个链表的头节点head,返回链表开始入环的第一个节点。如果链表无环,则返回null。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。如果pos是......
  • 健身房|基于springboot的健身房管理系统设计与实现(附项目源码+论文+数据库)
    私信或留言即免费送开题报告和任务书(可指定任意题目)目录一、摘要二、相关技术三、系统设计四、数据库设计     五、核心代码      六、论文参考 七、源码获取  一、摘要随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步......
  • 网上请假|基于springboot的学生网上请假系统设计与实现(附项目源码+论文+数据库)
    私信或留言即免费送开题报告和任务书(可指定任意题目)目录一、摘要二、相关技术三、系统设计四、数据库设计   五、核心代码      六、论文参考 七、源码获取  一、摘要随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟......
  • springboot+vue州州购【程序+论文+开题】计算机毕业设计
    系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,电子商务已成为推动全球经济增长的重要引擎。在“新零售”概念的引领下,消费者对于购物体验的需求日益多元化和个性化,传统零售模式正面临前所未有的挑战与机遇。在此背景下,“州州购”应运而生,旨在打造一个集地......
  • springboot+vue新疆IP形象NFT藏品网站【程序+论文+开题】计算机毕业设计
    系统程序文件列表开题报告内容研究背景随着区块链技术的迅猛发展与数字经济的崛起,非同质化代币(NFT)作为一种全新的数字资产形式,正逐步改变着艺术品、收藏品乃至文化产业的传统格局。新疆,作为中国多元文化的瑰宝之地,其丰富的民族文化、自然风光及历史故事为NFT创作提供了无尽......
  • springboot+vue医院门诊管理自动化实现【程序+论文+开题】计算机毕业设计
    系统程序文件列表开题报告内容研究背景随着医疗技术的飞速发展和人口老龄化的加剧,医院门诊面临着前所未有的压力与挑战。传统的手工管理模式已难以满足日益增长的患者需求,排队时间长、信息不对称、效率低下等问题日益凸显。信息化、自动化成为提升医院门诊管理水平、优化患......
  • springboot+vue疫情物资管理系统【程序+论文+开题】计算机毕业设计
    系统程序文件列表开题报告内容研究背景随着全球公共卫生事件的频发,尤其是新冠疫情的爆发,高效、精准的疫情物资管理成为了应对疫情挑战、保障医疗前线需求的关键环节。传统的手工或简单信息化管理手段在面对大规模、高频率的物资流动时显得力不从心,往往导致物资分配不均、信......
  • P3312 [SDOI2014] 数表
    [SDOI2014]数表题目描述有一张\(n\timesm\)的数表,其第\(i\)行第\(j\)列(\(1\lei\len\),\(1\lej\lem\))的数值为能同时整除\(i\)和\(j\)的所有自然数之和。给定\(a\),计算数表中不大于\(a\)的数之和。输入格式输入包含多组数据。输入的第一行一个整数\(Q\)表......
  • JWT令牌技术解决spring博客项目的登录问题(三)
    5.实现登陆        分析        传统思路:    1、 登陆⻚⾯把⽤⼾名密码提交给服务器.     2、服务器端验证⽤⼾名密码是否正确,并返回校验结果给后端    3、如果密码正确,则在服务器端创建Session.通过Cookie把sess......