缓存-Redis

Springboot使用Redis

  1. 引入pom依赖:

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    
  2. 在application.yml、application-dev.yml中配置Redis的访问信息

    spring:redis:host: ${sky.redis.host}port: ${sky.redis.port}password: ${sky.redis.password}database: ${sky.redis.database}
    
    sky:redis:host: localhostport: 6379password: foobareddatabase: 0
    

    其中,本机redis的password可以从/usr/local/etc/redis.conf获取(如果使用Homebrew安装的话),这个配置文件中有一行代码为

    requirepass foobared
    

    则password就是foobared

  3. 增加Redis配置类,实际上是封装RedisTemplate初始化的过程

    @Configuration
    @Slf4j
    public class RedisConfiguration {@Beanpublic RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){log.info("RedisTemplate初始化");RedisTemplate redisTemplate = new RedisTemplate();redisTemplate.setConnectionFactory(redisConnectionFactory);redisTemplate.setKeySerializer(new StringRedisSerializer());return redisTemplate;}
    }
    
  4. Redis缓存的使用一般伴随着查询数据库的操作,即在Redis中缓存一些热点数据,减少查数据库的流量。下面是进行Redis缓存的过程,核心就是调用了redisTemplate.opsForValue().get/set方法。

    @RestController("userDishController")
    @RequestMapping("/user/dish")
    @Slf4j
    public class DishController {@Autowiredprivate DishService dishService;@Autowiredprivate RedisTemplate<String, Object> redisTemplate;@GetMapping("/list")@SuppressWarnings("unchecked")public Result<List<DishVO>> list(Long categoryId){// 在redis中查询String cacheKey = "dish_" + categoryId;List<DishVO> list = (List<DishVO>) redisTemplate.opsForValue().get(cacheKey);if(list != null && !list.isEmpty()){return Result.success(list);}// 从数据库中查询Dish dish = new Dish();dish.setCategoryId(categoryId);dish.setStatus(StatusConstant.ENABLE);list = dishService.listWithFlavor(dish);// 放入redis缓存redisTemplate.opsForValue().set(cacheKey, list);return Result.success(list);}
    }
    
  5. 缓存的目标是要和数据库保持一致,因此当数据库发生变更时,要及时清理缓存,也就是调用redisTemplate.delete的方法;在调用这个方法时,可以先从Redis中查询所有符合条件的key,查询key是可以通过通配符*进行匹配的。如下面代码就是删除所有dish_开头的缓存项。

    /*** 删除菜品** @param ids* @return*/@DeleteMapping("/delete")public Result<String> delete(@RequestParam List<Long> ids) {log.info("删除菜品:{}", ids);dishService.deleteBatch(ids);clearRedis("dish_*");return Result.success();}/*** @param keys: dish_** @return void* @author jiayueyuanfang* @description 只在这个类使用,使用private私有方法* @date 2023/12/23 11:53*/private void clearRedis(String pattern) {Set<String> cacheKeys = redisTemplate.keys(pattern);redisTemplate.delete(cacheKeys);
    }
    

    Redis适用场景:适合热点数据存储:数据量小,对延迟敏感的情况

SpringCache操作缓存

Spring Cache是Spring框架提供的一个抽象模块,它提供了一种通用的缓存抽象,可以让你在不改变应用代码的前提下,添加和切换不同的缓存实现。

Spring Cache主要提供了以下几个注解来支持缓存操作:

  1. @Cacheable:应用在读取数据的方法上,用于将结果放入缓存。第一次调用时会执行方法并将结果放入缓存,之后的调用会直接从缓存中获取数据,不再执行方法。

  2. @CachePut:应用在写数据的方法上,无论什么情况,都会执行方法,并将结果放入缓存。

  3. @CacheEvict:应用在移除数据的方法上,用于从缓存中移除相应的数据。

  4. @Caching:组合注解,可以同时应用多个其他的缓存注解。

  5. @CacheConfig:类级别的注解,用于共享缓存的设置,比如缓存的名字。

Spring Cache并不直接实现缓存,而是提供了一套缓存抽象,你可以根据需要选择合适的缓存实现,比如EhCache、Guava Cache、Caffeine、Redis等。代码运行时,Spring Cache会生成代理来操作对应的缓存实现。下面介绍下操作Redis的情况。

  1. 如果操作Redis,需要引入pom依赖

    // 引入Spring Cache
    <dependency><groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>
    // 引入redis依赖
    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    
  2. 启动类上增加注解:@EnableCaching // 开启SpringCache

    @Slf4j
    @SpringBootApplication
    @EnableCaching // 开启SpringCache
    public class CacheDemoApplication {public static void main(String[] args) {SpringApplication.run(CacheDemoApplication.class,args);log.info("项目启动成功...");}
    }
    
  3. 在controller查询方法上分别使用上述注解

    package com.itheima.controller;import com.itheima.entity.User;
    import com.itheima.mapper.UserMapper;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cache.annotation.CacheEvict;
    import org.springframework.cache.annotation.CachePut;
    import org.springframework.cache.annotation.Cacheable;
    import org.springframework.web.bind.annotation.*;@RestController
    @RequestMapping("/user")
    @Slf4j
    public class UserController {@Autowiredprivate UserMapper userMapper;@PostMapping
    //    @CachePut(cacheNames = "userCache", key="#user.id")@CachePut(cacheNames = "userCache", key="#result.id")public User save(@RequestBody User user){userMapper.insert(user);return user;}@DeleteMapping@CacheEvict(cacheNames = "userCache", key = "#id")public void deleteById(Long id){userMapper.deleteById(id);}@DeleteMapping("/delAll")public void deleteAll(){userMapper.deleteAll();}@GetMapping@Cacheable(cacheNames = "userCache", key = "#id")public User getById(Long id){User user = userMapper.getById(id);return user;}}
  4. 使用SpringCache最方便的地方在于,可以自由切换缓存类型,比如想切换成本地缓存CaffeineCache(GuavaCache的替代品,Spring5.1以后不再支持GuavaCache),仅需要在pom依赖里面把对Redis的依赖更改为CaffeineCache,同时增加CaffeineCache的配置类即可

     <dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId><version>2.8.8</version></dependency>
    
    @Configuration
    @EnableCaching
    public class CacheConfig {@Beanpublic CacheManager cacheManager() {CaffeineCacheManager cacheManager = new CaffeineCacheManager();cacheManager.setCaffeine(Caffeine.newBuilder().expireAfterWrite(10, TimeUnit.MINUTES));return cacheManager;}
    }
    

    其他代码不需要变更

注意:如果pom中引入了多个缓存的依赖,则SpringCache无法辨别使用哪个缓存,则注解不生效

Git代码地址:Git
接口文档:http://localhost:8080/doc.html#/default/user-controller/saveUsingPOST

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/240706.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux系统基础】(1)Linux基础命令全面详解

在计算机世界中&#xff0c;Linux操作系统以其稳定性、安全性和开源性而受到广大程序员和系统管理员的喜爱。然而&#xff0c;对于初学者来说&#xff0c;Linux的命令行界面可能会显得有些复杂和难以理解。本文将详细介绍一些常用的Linux基础命令&#xff0c;帮助你更好地理解和…

TLC2543(12位A/D转换器)实现将输入的模拟电压显示到数码管上

代码&#xff1a; #include <reg51.h> #define uchar unsigned char #define uint unsigned int// 数码管0-9 unsigned char seg[] {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; sbit SDO P1^0; sbit SDI P1^1; sbit CS P1^2; sbit CLK P1^3; s…

【C语言】打印内存数据

C语言&#xff0c;用函数封装&#xff1a;16进制打印unsigned char *p指向的内存&#xff0c;长度为int l。16个字节&#xff0c;换一次行。16个字节用一个字符串缓存&#xff0c;一次打印。 以下是一个使用函数封装的C语言代码&#xff0c;用于以16进制格式打印unsigned char …

MyBatis——MyBatis的延迟加载

MyBatis的延迟加载&#xff08;一对多查询案例&#xff09; 1.什么是延迟加载&#xff1f; 开启延迟加载后&#xff0c;在真正使用数据的时候才发起级联查询&#xff0c;不用的时候不查询。 2.pojo User类&#xff1a; package com.wt.pojo;import java.io.Serializable; …

Ubuntu和Red Hat Enterprise Linux差异

由于Ubuntu&#xff08;基于Debian&#xff09;和Red Hat Enterprise Linux&#xff08;RHEL&#xff0c;包括其衍生版本如CentOS和Fedora&#xff09;是基于不同的Linux发行版&#xff0c;它们在命令行工具和管理上确实存在一些差异。但是&#xff0c;要列出所有差异是非常庞大…

计算机毕业设计------JSP教务处学生成绩管理系统

项目介绍 本项目包含管理员、教师、学生三种角色&#xff1b; 用户角色包含以下功能&#xff1a; 修改密码,查看自己的信息,查看自己的成绩,登录界面等功能。 管理员角色包含以下功能&#xff1a; 修改示例,增删改查学生信息,增删改查教师信息,增删改查课程信息,管理员修改…

电机控制 相关基础概念

基本概念: 定子或者转子上有铁心或者绕铜线的地方,绕铜线的地方叫槽,而将槽分开的叫齿,将所有的齿连起来的部位较轭部。 磁感应强度与磁场强度之间的关系可以通过以下公式表示: B=μH 其中,B 是磁感应强度,H 是磁场强度,μ 是磁导率。这个关系表明,在给定磁场强度下…

临床医学VR仿真情景实训教学应用

一、VR医学仿真情景教学应用 临床医学VR仿真情景实训教学是一种将VR虚拟技术应用于医学教育的新型教学方法。通过模拟真实的医疗环境&#xff0c;学生可以在虚拟场景中进行实践操作&#xff0c;从而更好地理解和掌握医学知识。与传统医学教育方式相比&#xff0c;VR技术为医学…

Golang 通用代码生成器仙童发布 2.4.0 电音仙女尝鲜版一及其介绍两个模式的视频

Golang 通用代码生成器仙童发布 2.4.0 电音仙女尝鲜版一及其介绍两个模式的视频 Golang 通用代码生成器仙童已发布 2.4.0 电音仙女尝鲜版一及其介绍视频。视频请见&#xff1a; 正常模式&#xff1a; https://www.bilibili.com/video/BV1fw411V77i/ 哑数据模式&#xff1a;…

Javascript预解析

为什么会讲到这个预解析呢&#xff0c;个人认为工作了很多年的前端可能都不一定搞清楚这个机制&#xff0c;所以还是将这个记录下来作为自己的学习笔记&#xff0c;同时也分享给广大的其他爱学习的前端开发者们。 我们先来看一段代码 sum(2, 10); function sum(a, b){return …

@z-utils组 重构和自动化实现

highlight: monokai theme: github 包简介 z-utils组 是一个可以在vue/react/pure js 中使用的工具包&#xff0c;它包含三个子类&#xff0c;分别为 z-utils/base, z-utils/react, z-utils/vue 三个分别在不同区域使用。 他是原 zzy-javascript-devtools 的重构版本&#xf…

嵌入式系统复习--Thumb指令集

文章目录 上一篇Thumb指令集概述Thumb指令详细介绍数据处理指令数据存储指令转移指令异常中断指令 下一篇 上一篇 嵌入式系统复习–ARM指令集(二) Thumb指令集概述 在编写Thumb指令时&#xff0c;先要用伪指令CODE16声明&#xff08;ADS的编译环境下&#xff09;&#xff0c…

程序设计的思想

程序设计思想是指在程序设计过程中所采用的一种思维方式&#xff0c;它是程序设计的灵魂和基础。程序设计思想的正确与否直接关系到程序的质量和可维护性。在实际的程序设计中&#xff0c;我们需要遵循一定的程序设计思想&#xff0c;以确保程序的正确性、可读性和可维护性。 …

序列化和反序列化对比分析,序列化和反序列化输出十个学生信息截图

序列化和反序列化是数据处理中的两个相对的概念&#xff0c;通常用于对象的存储和传输。下面是对这两个过程的对比分析&#xff1a; 序列化&#xff08;Serialization&#xff09; 定义 目的&#xff1a; 将对象的状态信息转换成可以存储或传输的形式&#xff08;如XML, JSO…

【表的内连和外连】

目录&#xff1a; 前言表的内外连接内连接显示Amanda Jackson的名字和部门名称 外连接左外连接查询所有学生的成绩&#xff0c;如果这个学生没有成绩&#xff0c;也要将学生的个人信息显示出来 右外连接对stu表和exam表联合查询&#xff0c;把所有的成绩都显示出来&#xff0c;…

windows vs cmake项目+vcpkg

官方文档地址: vs中使用vcpkgcmake 官方文档地址&#xff1a;配置 CMake 调试会话 调整到CMake 目标视图&#xff0c;在对应的exe下右键选择“添加调试配置”切换回文件夹视图&#xff0c;在.vs下找到launch.vs.json文件&#xff0c;然后可以写调试使用的命令行参数 args&…

循环渲染ForEach

目录 1、接口说明 2、键值生成规则 3、组件创建规则 3.1、首次渲染 3.2、非首次渲染 4、使用场景 4.1、数据源不变 4.2、数据源组项发生变化 4.3、数据源数组项子属性变化 5、反例 5.1、渲染结果非预期 5.2、渲染性能降低 Android开发中我们有ListView组件、GridVi…

linux:IP地址、修改主机名、域名解析、虚拟机配置固定IP

一:IP地址 1、每一台联网的电脑都会有一个地址&#xff0c;用于和其它计算机进行通讯 2、IP地址主要有2个版本,V4版本和V6版本(V6很少用暂不涉及) 3、IPv4版本的地址格式是:a.b.c.d,其中abcd表示0~255的数字,如192.168.88.101就是一个标准的IP地址 4、可以通过命令:ifconfi…

视频监控技术经历了哪些发展阶段?视频监控技术未来趋势展望

随着城市经济的发展和进步&#xff0c;视频监控也已经应用在人们衣食住行的方方面面&#xff0c;成为社会主体的一个重要组成部分。随着视频监控的重要性越来越凸显&#xff0c;大家对视频监控技术的发展也非常关注。今天我们来简单阐述一下&#xff0c;视频监控技术经历的几个…

【delphi11】delphi进阶【九、自定义组件】

在 Delphi 中创建和使用自定义组件是一种扩展应用功能和重用代码的有效方法。自定义组件可以是可视化&#xff08;如按钮、编辑框&#xff09;或非可视化的&#xff08;如数据库连接、计时器&#xff09;。以下是一个详细介绍如何在 Delphi 中创建和使用自定义组件的指南&#…