SpringBoot怎么整合Spring Cache实现Redis缓存

    1、简介

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

    Spring Cache 提供了一层抽象,底层可以切换不同的cache实现。

    具体就是通过 CacheManager 接口来统一不同的缓存技术。

    MySQL与PHP内置函数详解,助力数据处理和程序

    CacheManager 是 Spring 提供的各种缓存技术抽象接口,这是默认的缓存技术,是缓存在Map中的,这也说明当服务挂掉的时候,缓存的数据就没了。

    针对不同的缓存技术需要实现不同的 CacheManager

    CacheManager描述EhCacheCacheManager使用 EhCache 作为缓存技术GuavaCacheManager使用 Google 的 GuavaCache 作为缓存技术RedisCacheManager使用 Redis 作为缓存技术2、常用注解

    在 Spring Boot 项目中,使用缓存技术只需在项目中导入相关缓存技术的依赖包,并在启动类上使用 @EnableCaching 开启缓存支持即可。例如,使用 Redis 作为缓存技术,只需要导入 Spring data Redis 的 maven 坐标即可。常用的注解有如下几个:

    注解说明@EnableCaching开启缓存注解功能@Cacheable在方法执行前 spring 先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;
    若没有数据,调用方法并将方法返回值放到缓存中@CachePut将方法的返回值放到缓存中@CacheEvict将一条或多条数据从缓存中删除2.1、@EnableCaching

    这个注解的主要作用是启用缓存注解的功能,并使其他Spring Cache注解生效。使用方式也十分简单,直接将其加在项目的启动类上方即可。

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

    log.info("
    项目启动成功..."
    );

    }
    } 2.2、@Cacheable

    @Cacheable注解主要是在方法执行前 先查看缓存中是否有数据。如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中。

    注解中的参数传递主要使用的是**SpEL(Spring Expression Language)**对数据进行获取传递,这有点类似于JSP中的EL表达式,常用方式如下几种:

    • “#p0”:获取参数列表中的第一个参数。其中的“#p”为固定写法,0为下标,代表第一个;

    • “#root.args[0]”:获取方法中的第一个参数。其中0为下标,代表第一个。

    • “#user.id”:获取参数 user 的 id 属性。注意的是这里的 user 必须要和参数列表中的参数名一致

    • “#result.id”:获取返回值中的 id 属性。

    来自Spring Cache源码:Spring Expression Language (SpEL) expression used for making the method

    在@Cacheable注解中有几种常用的属性可进行需求性设置:

    • value:缓存的名称,每个缓存名称下面可以有多个 key

    • key:缓存的key。

    • condition:条件判断,满足条件时对数据进行缓存,值得注意的是该参数在Redis中无效

    • The parameter "unless" can be used in Redis as a conditional statement to avoid caching data if a certain condition is met.

    /**
    * @description 通过id获取用户信息
    * @author xBaozi
    * @date 14:23 2022/7/3
    **/
    @Cacheable(value = "
    userCache"
    , key = "
    #id"
    , unless = "
    #result == null"
    )
    @GetMapping("
    /{id}"
    )
    public User getById(@PathVariable Long id) {
    User user = userService.getById(id);

    return user;

    } 2.3、@CachePut

    @CachPut注解主要是将方法的返回值放到缓存中。这里同样是使用SpEL获取数据,常用的属性如下:

    • value:缓存的名称,每个缓存名称下面可以有多个 key

    • key:缓存的key。

    • condition:条件判断,满足条件时对数据进行缓存,值得注意的是该参数在Redis中无效

    • The parameter "unless" can be used in Redis as a conditional statement to avoid caching data if a certain condition is met.

    /**
    * @description 新增用户信息并返回保存的信息
    * @author xBaozi
    * @date 14:38 2022/7/3
    **/
    @CachePut(value = "
    userCache"
    , key = "
    #user.id"
    )
    @PostMapping
    public User save(User user) {
    userService.save(user);

    return user;

    } 2.4、@CacheEvict

    @CacheeEvict主要是将一条或多条数据从缓存中删除,同样使用SpEL获取数据,常用的属性如下:

    • value:缓存的名称,每个缓存名称下面可以有多个 key

    • key:缓存的key。

    • condition:条件判断,满足条件时对数据进行缓存,值得注意的是该参数在Redis中无效

    • The parameter "unless" can be used in Redis as a conditional statement to avoid caching data if a certain condition is met.

    /**
    * @description 更新用户信息
    * @author xBaozi
    * @date 14:41 2022/7/3
    **/
    @CacheEvict(value = "
    userCache"
    , key = "
    #result.id"
    )
    @PutMapping
    public User update(User user) {
    userService.updateById(user);

    return user;

    } 3、使用Redis当作缓存产品

    因为 Spring 默认的缓存技术无法持久化保存缓存数据,即服务挂了缓存也挂了,因此就需要使用Redis进行操作(其实也是因为学习了Redis)

    前面的SpringBoot整合Redis缓存验证码里面有记录着一些Redis的基本操作。

    3.1、坐标导入

    导入 maven 坐标:spring-boot-starter-data-redis、spring-boot-starter-cache

    <
    !--Spring Data Redis-->

    <
    dependency>

    <
    groupId>
    org.springframework.boot<
    /groupId>

    <
    artifactId>
    spring-boot-starter-data-redis<
    /artifactId>

    <
    /dependency>

    <
    !--Spring Cache-->

    <
    dependency>

    <
    groupId>
    org.springframework.boot<
    /groupId>

    <
    artifactId>
    spring-boot-starter-cache<
    /artifactId>

    <
    /dependency>
    3.2、yml配置

    spring: redis: host: localhost port: 6379 password: 123456 database: 0 cache: redis: time-to-live: 1800000 # 设置缓存有效期

    3.3、开启注解功能

    在启动类 com/itheima/CacheDemoApplication.java 上加入 @EnableCaching 注解,开启缓存注解功能

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

    log.info("
    springBoot项目启动成功……"
    );

    }
    } 3.4、使用@Cacheable

    需要提醒的是,在使用缓存的时候,返回值必须实现 Serializable 序列化接口,否则会抛出错误。

    这是因为在 NoSql 数据库中,并没有与我们 Java 基本类型对应的数据结构,所以在往 NoSql 数据库中存储时,我们就必须将对象进行序列化,同时在网络传输中我们要注意到两个应用中 javabean 的 serialVersionUID 要保持一致,不然就不能正常的进行反序列化。

    /**
    * @description 新增套餐信息
    * @author xBaozi
    * @date 17:55 2022/5/13
    * @param setmealDto 需要新增套餐的数据
    **/
    @CacheEvict(value = "
    setmealCache"
    ,allEntries = true)
    @PostMapping
    public Result<
    String>
    save(@RequestBody SetmealDto setmealDto) {
    log.info("
    套餐信息为{}"
    , setmealDto);

    setmealService.saveWithDish(setmealDto);

    return Result.success("
    套餐"
    + setmealDto.getName() + "
    新增成功"
    );

    } 3.5、使用@CacheEvict

    该新属性称为allEntries,它是一个布尔类型,用于指示是否需要清除缓存中的所有元素。默认为false,表示不需要。如果将 allEntries 设置为 true,Spring Cache 将不考虑指定的 key。有时候,把所有元素一次性清除并缓存比逐个清除元素更高效。

    /**
    * @description 更新套餐信息并更新其关联的菜品
    * @author xBaozi
    * @date 11:28 2022/5/14
    * @param setmealDto 需要更新的套餐信息
    **/
    @CacheEvict(value = "
    setmealCache"
    ,allEntries = true)
    @PutMapping
    public Result<
    String>
    updateWithDish(@RequestBody SetmealDto setmealDto) {
    log.info(setmealDto.toString());

    setmealService.updateWithDish(setmealDto);

    return Result.success("
    套餐修改成功"
    );

    } 4、测试

    代码编写完成之后,重启工程,然后访问后台管理系统,对套餐数据进行新增以及删除,而后观察Redis中的数据发现写的代码是能正常跑到!成功!



    MySQL是一款开源的关系型数据库管理系统,而PHP是一种广泛应用于Web开发的脚本语言,二者结合起来,可以进行高效的数据处理和程序开发。其中,内置函数是MySQL和PHP中的重要部分,为开发者提供了许多方便快捷的操作方法。本文将详细介绍MySQL与PHP中的内置函数,为开发者提供实用的指导。
    I. MySQL内置函数
    MySQL内置函数可分为以下几类:数学函数、日期和时间函数、字符串函数、聚合函数和系统函数等。我们将依次介绍这些函数。
    1. 数学函数
    数学函数主要用于对数据进行算术运算、取绝对值、取随机数、获取最值等操作。常见的数学函数有ABS、ROUND、RAND、MIN和MAX等。
    2. 日期和时间函数
    日期和时间函数主要用于对日期和时间进行操作,如获取当前时间、获取特定日期、获取时分秒等。MySQL中的日期和时间函数有NOW、CURDATE、YEAR、MONTH和DAY等。
    3. 字符串函数
    字符串函数主要用于对文本和字符串进行操作,如复制、截取、替换、拼接等。MySQL中的字符串函数有CONCAT、SUBSTRING、REPLACE、LEFT和RIGHT等。
    4. 聚合函数
    聚合函数主要用于对数据进行聚合运算,如计算平均值、求和、最大值和最小值等。MySQL中的聚合函数有AVG、SUM、MAX和MIN等。
    5. 系统函数
    系统函数主要用于获取关于系统和内存的信息,如获取MySQL版本、获取当前用户、获取进程ID等。MySQL中的系统函数有VERSION、USER、CONNECTION_ID和GET_LOCK等。
    II. PHP内置函数
    PHP内置函数可以分为以下几类:字符串处理函数、数组处理函数、日期和时间函数、文件处理函数以及其他函数等。我们将依次介绍这些函数。
    1. 字符串处理函数
    字符串处理函数主要用于对文本和字符串进行处理,如分割字符串、比较字符串、转换大小写、获取长度等。PHP中的字符串处理函数有explode、strcasecmp、strtolower、strlen和substr等。
    2. 数组处理函数
    数组处理函数主要用于处理数组,如添加元素、删除元素、排序、翻转等。PHP中的数组处理函数有array_push、array_pop、sort、array_reverse和array_key_exists等。
    3. 日期和时间函数
    日期和时间函数主要用于获取当前时间、格式化日期、计算日期差值等。PHP中的日期和时间函数有date、time、strtotime、date_diff和date_format等。
    4. 文件处理函数
    文件处理函数主要用于对文件进行操作,如读取文件内容、写入文件内容、获取文件大小等。PHP中的文件处理函数有fread、fwrite、filesize和file_get_contents等。
    5. 其他函数
    其他函数主要包括数学函数、网络函数和XML函数等。其中,数学函数主要用于算术运算和数值处理,网络函数主要用于网络通信和URL操作,XML函数主要用于XML数据的处理。PHP中的其他函数有pow、curl和simplexml_load_string等。
    总结:
    MySQL和PHP内置函数是两个重要的工具,开发者们应该尽可能多地了解和使用内置函数,以提高程序的效率和性能。本文已经详细介绍了MySQL和PHP内置函数中的常用函数及其用法,相信对开发者们有所帮助。接下来,让我们一起实践吧!