首页 > 其他分享 >缓存框架-Spring Cache基本用法

缓存框架-Spring Cache基本用法

时间:2024-07-11 23:29:27浏览次数:12  
标签:缓存 RESOURCE Spring Cache value id key public

一、概述

Spring Cache 是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。

Spring Cache 提供了一层抽象,底层可以切换不同的缓存实现,例如:

  • EHCache

  • Caffeine

  • Redis(常用)

二、环境准备

1、导入Redis和SpringCache依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

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

已导入,无需再次导入

2、添加配置支持

在application.yml文件中添加redis的支持

spring:
  redis:
    host: 127.0.0.1
    port: 6379
    password: 123456

已创建,无需再次创建

三、常用注解

在SpringCache中提供了很多缓存操作的注解,常见的是以下几个:

注解说明
@EnableCaching开启缓存注解功能,通常加在启动类上
@Cacheable在方法执行前先查询缓存中是否有数据,如果有数据,则直接返回缓存数据;如果没有缓存数据,调用方法并将方法返回值放到缓存中
@CachePut将方法的返回值放到缓存中
@CacheEvict将一条或多条数据从缓存中删除
@Caching缓存的结合体,可以组合以上注解在一个方法中使用,比如有新增,有删除

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

1、@Cacheable

在方法执行前,spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中,查询的时候使用

@Cacheable(cacheNames = "userCache",key="#id")
public User getById(Long id){
    User user = userMapper.getById(id);
    if(user == null){
        throw new RuntimeException("用户不存在");
    }
    return user;
}

存储到redis之后的数据是这样的

  • cacheNames = “userCache” : 表示命名空间,key的第一层级

  • key=“#id” : id指的是查询的参数, 也就是使用id属性作为key

  • 在Redis中,冒号通常用作键的命名约定,可以创建层次结构,类似于文件系统中的路径结构,提升查找效率

其中在redis中存储的数据是经过序列化之后的数据?那什么是序列化呢?

  • 对象序列化是将对象转换为可存储或传输的字节序列的过程,方便在需要时可以重新创建对象。这种序列化后的字节序列可以保存在文件,数据库或通过网络进行传输。

多条件查询使用Cacheable,比如查询的方法参数有多个,我们可以使用hashcode作为缓存的key,如下代码


@Cacheable(value = "userCache",key="#userDto.hashCode()",unless = "#result.size() == 0")
public List<User> getList(UserDto userDto){
    List<User> list = userMapper.getList("%" + userDto.getName() + "%", userDto.getAge());
    return list;
}

在UserDto 中需要提供一个hashCode方法

@Data
public class UserDto {

    private String name;
    private int age;

    @Override
    public int hashCode() {
        int result = Objects.hash(getName(),getAge());
        return result;
    }
}

hashcode的特点是,只要参数相同,则生成后的hashcode值肯定相同

如果返回结果为空,则不缓存unless="#result == null"或unless="#result.size()==0"

2、@CachePut

作用: 将方法返回值,放入缓存,一般保存的时候使用该注解

@CachePut(value = "userCache", key = "#user.id")//key的生成:userCache::1
public User insert(User user){
    userMapper.insert(user);
    return user;
}
  • #user.id : #user指的是方法形参的名称, id指的是user的id属性 , 也就是使用user的id属性作为key

3、@CacheEvict

作用: 清理指定缓存

@CacheEvict(cacheNames = "userCache",key = "#id")//删除某个key对应的缓存数据
public void deleteById(Long id){
    userMapper.deleteById(id);
}

@CacheEvict(cacheNames = "userCache",allEntries = true)//删除userCache下所有的缓存数据
public void deleteAll(){
    userMapper.deleteAll();
}

4、@Caching

作用: 组装其他缓存注解

  • cacheable 组装一个或多个@Cacheable注解

  • put 组装一个或多个@CachePut注解

  • evict 组装一个或多个@CacheEvict注解

@Caching(
         cacheable = {
                 @Cacheable(value = "userCache",key = "#id")
         },
         put = {
                 @CachePut(value = "userCache",key = "#result.name"),
                 @CachePut(value = "userCache",key = "#result.age")
         }
 )
 public User insert(User user){
     userMapper.insert(user);
     return user;
 }

四、缓存解决权限接口响应慢的问题

1、项目中集成Spring Cache

  • 先导入Spring Data Redis起步依赖和Spring Cacha起步依赖

在zzyl-common模块中新增依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
  • 在application.yml文件中添加Redis相关的配置

spring:
  redis:
    host: 127.0.0.1
    port: 6379
    password: 123456

2、资源管理模块集成Spring Cache

缓存同步的思路:

  • 查询的时候添加到缓存中

  • 增删改的时候,删除缓存

@Service
@Transactional
public class ResourceServiceImpl implements ResourceService {


    /**
     * 多条件列表查询
     * @param resourceDto
     * @return
     */
    @Cacheable(value = CacheConstant.RESOURCE_LIST ,key ="#resourceDto.hashCode()")
    @Override
    public List<ResourceVo> getList(ResourceDto resourceDto) {

    }

    /**
     * 封装资源的树形结构
     *
     * @param resourceDto
     * @return
     */
    @Cacheable(value = CacheConstant.RESOURCE_TREE )
    @Override
    public TreeVo resourceTreeVo(ResourceDto resourceDto) {

    }


    /**
     * 添加资源
     * @param resourceDto
     */
    @Caching(evict = {@CacheEvict(value = CacheConstant.RESOURCE_LIST ,allEntries = true),
            @CacheEvict(value = CacheConstant.RESOURCE_TREE ,allEntries = true)})
    @Override
    public void createResource(ResourceDto resourceDto) {

    }

    

    /**
     * 修改资源
     * @param resourceDto
     */
    @Caching(evict = {@CacheEvict(value = CacheConstant.RESOURCE_LIST ,allEntries = true),
            @CacheEvict(value = CacheConstant.RESOURCE_TREE ,allEntries = true)})
    @Override
    public void updateResource(ResourceDto resourceDto) {
        
    }

    /**
     * 启用禁用
     * @param resourceVo
     * @return
     */
    @Caching(evict = {@CacheEvict(value = CacheConstant.RESOURCE_LIST ,allEntries = true),
            @CacheEvict(value = CacheConstant.RESOURCE_TREE ,allEntries = true)})
    @Override
    public void isEnable(ResourceVo resourceVo) {
        
    }

    /**
     * 删除菜单
     * @param resourceNo
     */
    @Caching(evict = {@CacheEvict(value = CacheConstant.RESOURCE_LIST ,allEntries = true),
            @CacheEvict(value = CacheConstant.RESOURCE_TREE ,allEntries = true)})
    @Override
    public void deleteByResourceNo(String resourceNo) {
       
    }
   
}

上述代码中使用到的常量需要自己定义:

package com.zzyl.constant;

public class CacheConstant {

    /**
     * 缓存父包
     */
    public static final String RESOURCE_PREFIX= "resource:";
    public static final String RESOURCE_LIST = RESOURCE_PREFIX+"list";
    public static final String RESOURCE_TREE = RESOURCE_PREFIX+"tree";
}

其中ResourceDto 需要添加根据查询条件获取hashCode方法

@Override
public int hashCode() {
    int result = Objects.hash(super.hashCode(), getParentResourceNo(), getResourceType(),getDataState());
    return result;
}

标签:缓存,RESOURCE,Spring,Cache,value,id,key,public
From: https://blog.csdn.net/susjj663/article/details/140364412

相关文章

  • 接口文档的书写,git的拉取错误的解决,数据库多表查询的进一步认识(以后开发一定要先仔细
    202407111接口文档的书写:1.1首先写你这个大模块是什么功能。1.2开始根据你的功能写接口文档:2解决git拉取错误的问题:2.1出现这样的问题:(推送出错)2.2原因分析:可能因为重装过系统,或者是安装git的位置发生了变化等情况出现。2.3找到git的安装路径,打开gitbash之后,进......
  • 【SpringBoot框架】-- 快速入门
    目录1.spring简介1.1springboot快速入门1.1.1开发步骤1.1.2创建项目2.springboot的特点3.配置文件种类4.读取配置文件中的内容4.1 @ConfigurationPropertie4.2  @Value5.profile多环境配置 6.springboot注册web组件7.springboot包扫描的原理8.spr......
  • Java毕业设计基于Vue+SpringBoot的博物馆展览与服务一体化平台(代码+数据库+文档LW+运
    文末获取资源,收藏关注不迷路文章目录前言主要使用技术研究内容核心代码文章目录前言博物馆展览与服务一体化,其工作流程繁杂、多样、管理复杂与设备维护繁琐。而计算机已完全能够胜任博物馆展览与服务一体化工作,而且更加准确、方便、快捷、高效、清晰、透明,它完全......
  • Java毕业设计基于Vue+SpringBoot的单位公司员工考勤签到系统(代码+数据库+文档LW+运行
    文末获取资源,收藏关注不迷路文章目录前言主要使用技术研究内容核心代码文章目录前言当今社会已经步入了科学技术进步和经济社会快速发展的新时期,国际信息和学术交流也不断加强,计算机技术对经济社会发展和人民生活改善的影响也日益突出,人类的生存和思考方式也产生......
  • Java毕业设计基于Vue+SpringBoot的厨房达人美食分享平台(代码+数据库+文档LW+运行成功
    文末获取资源,收藏关注不迷路文章目录前言主要使用技术研究内容核心代码文章目录前言厨房达人美食分享平台的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品,体验高科技时代带给人们的方便,同时也能让用户体会到与......
  • 13--memcache与redis
    前言:数据库读取速度较慢一直是无法解决的问题,大型网站应对的方式主要是使用缓存服务器来缓解这种情况,减少数据库访问次数,以提高动态Web等应用的速度、提高可扩展性。1、简介Memcached/redis是高性能的分布式内存缓存服务器,通过缓存数据库查询结果,减少数据库访问次数,以提高动......
  • day01-Spring
    学习目标能够说出Spring的体系结构能够编写IOC入门案例能够编写DI入门案例能够配置setter方式注入属性值能够配置构造方式注入属性值能够理解什么是自动装配一、Spring简介1Spring课程介绍问题导入我们为什么要学习Spring框架?1.1为什么要学Spring技术是Java......
  • SpringBoot
    1.什么是SpringBoot?SpringBoot是Spring公司开发的一款框架,为了简化Spring项目的初始化搭建的。2.什么使用SpringBoot?Spring搭建的缺点:      配置文件麻烦,需要根据需求添加依赖,Tomcat部署慢。SpringBoot的特点:      自动配置--->简化spring的......
  • Spring依赖注入、循环依赖——三级缓存
    依赖注入背景:实例化对象后,需要设置字段,即依赖注入,两种:set方法注入和构造方法注入。 流程:先寻找整个类的注入点,就是打了@autowired的字段或方法,然后根据类型、名称去找 常用依赖注入注解辨析:@Inject:来自JSR330规范。按类型注入。@Resource:是JavaEE的一部分。先按名......
  • 深入解析Spring Boot的application.yml配置文件
    目录引言SpringBoot配置文件简介application.yml的优点基本结构与语法YAML语法基础SpringBoot中application.yml的基本结构常见配置项详解服务器配置数据源配置日志配置其他常见配置环境配置与Profile多环境配置激活Profile高级配置与技巧属性的占位符替换自定......