【spring boot】在Java中操作缓存:

文章目录

        • 一、Jedis
        • 二、Spring Data Redis(常用)
            • 【1】pom.xml
            • 【2】application.yml
            • 【3】RedisConfig
            • 【4】RuiJiWaiMaiApplicationTests
        • 三、Spring Cache
          • 【1】常用注解:
          • 【2】使用案例
          • 【3】底层不使用redis,重启服务,内存丢失=>解决:
            • pom.xml
            • application.yml
            • 启动类:
            • Result:
            • 注解使用:


一、Jedis

在这里插入图片描述

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
</dependency>
<dependency>
   <groupId>redis.clients</groupId>
   <artifactId>jedis</artifactId>
   <version>2.8.0</version>
</dependency>

在这里插入图片描述

二、Spring Data Redis(常用)

【1】pom.xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
【2】application.yml

在这里插入图片描述

spring:
  redis:    #redis配置
    host: localhost
    port: 6379
    #password:
    database: 0   #默认提供16个数据库,0:0号数据库
    jedis:
      pool:  #redis连接池配置
        max-active: 8   #最大连接数
        max-idle: 4     #最大空闲连接
        max-wait: 1ms   #最大阻塞等待时间
        min-idle: 0     #最小空闲连接

在这里插入图片描述

【3】RedisConfig
package com.example.ruijiwaimai.config;

import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig extends CachingConfigurerSupport {
    @Bean
    public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory connectionFactory){
        RedisTemplate<Object,Object> redisTemplate=new RedisTemplate<>();

        // 默认的key序列化器为:JdkSerializationRedisSerializer
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setConnectionFactory(connectionFactory);
        return redisTemplate;
    }
}
【4】RuiJiWaiMaiApplicationTests
package com.example.ruijiwaimai;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.connection.DataType;
import org.springframework.data.redis.core.*;

import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

@SpringBootTest
class RuiJiWaiMaiApplicationTests {

    @Autowired
    private RedisTemplate redisTemplate;

    /*
     * 操作String类型数据=>ValueOperations:简单K-V操作
     * */
    @Test
    public void testString() {
        redisTemplate.opsForValue().set("city123", "shenzhen");    //  \xac\xed\x00\x05t\x00\x04city做了序列化,无法用get city获取=》config配置RedisConfig
        String value = (String) redisTemplate.opsForValue().get("city123");
        System.out.println(value);

        redisTemplate.opsForValue().set("key1", "value1", 10, TimeUnit.SECONDS);

        Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("city1234", "nanjing");
        System.out.println(aBoolean);
    }

    /*
     * 操作Hash类型数据=>HashOperations:针对map类型的数据操作
     * */
    @Test
    public void testHash() {
        HashOperations hashOperations = redisTemplate.opsForHash();
        hashOperations.put("002", "name", "xiaoming");
        hashOperations.put("002", "age", "20");

        String age = (String) hashOperations.get("002", "age");
        System.out.println(age);

        // 获取所有字段
        Set keys = hashOperations.keys("002");
        for (Object key : keys) {
            System.out.println(key);
        }
        // 获取所有值
        List values = hashOperations.values("002");
        for (Object value : values) {
            System.out.println(value);
        }
    }

    /*
     * 操作List类型数据=>ListOperations:针对list类型的数据操作
     * */
    @Test
    public void testList() {
        ListOperations listOperations = redisTemplate.opsForList();
        //存值
        listOperations.leftPush("mylist", "a");
        listOperations.leftPushAll("mylist", "b", "c", "d");
        //取值
        List<String> mylist = listOperations.range("mylist", 0, -1);
        for (String value : mylist) {
            System.out.println(value);
        }
        //获得列表长度
        Long size = listOperations.size("mylist");
        int lSize = size.intValue();
        for (int i = 0; i < lSize; i++) {
            //出队列
            Object element = listOperations.rightPop("mylist");
            System.out.println("出队列:" + element);
        }
    }

    /*
     * 操作Set(无序集合)类型数据=>SetOperations:set类型数据操作
     * */
    @Test
    public void testSet() {
        SetOperations setOperations = redisTemplate.opsForSet();
        //存值
        setOperations.add("myset", "a", "b", "c", "a");
        //取值
        Set<String> myset = setOperations.members("myset");
        for (String o : myset) {
            System.out.println(o);
        }
        //删除成员
        setOperations.remove("myset", "a", "b");

        myset = setOperations.members("myset");
        for (String o : myset) {
            System.out.println("删除后的数据:" + o);
        }
    }

    /*
     * 操作ZSet(有序集合)类型数据=>ZSetOperations:zset类型数据操作
     * */
    @Test
    public void testZSet() {
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();
        //存值
        zSetOperations.add("myZset", "a", 10.0);
        zSetOperations.add("myZset", "b", 11.0);
        zSetOperations.add("myZset", "c", 12.0);
        zSetOperations.add("myZset", "a", 13.0);
        //取值
        Set<String> myZet = zSetOperations.range("myZset", 0, -1);
        for (String s : myZet) {
            System.out.println(s);
        }
        //修改分数
        zSetOperations.incrementScore("myZset", "b", 20.0);
        myZet = zSetOperations.range("myZset", 0, -1);
        for (String s : myZet) {
            System.out.println("修改分数: " + s);
        }
        //删除成员
        zSetOperations.remove("myZset", "a", "b");
        myZet = zSetOperations.range("myZset", 0, -1);
        for (String s : myZet) {
            System.out.println("删除后的成员: " + s);
        }
    }

    /*
     * 通用操作
     * */
    @Test
    public void testCommon() {
        //获取redis中所有的key
        Set keys = redisTemplate.keys("*");
        for (Object key : keys) {
            System.out.println(key);
        }
        //判断某个key是否存在
        Boolean itcast = redisTemplate.hasKey("itcast");
        System.out.println("判断某个key是否存在:"+itcast);
        //删除指定key
        redisTemplate.delete("myZset");
        //获取指定key对应的value的数据类型
        DataType dataType = redisTemplate.type("001");
        System.out.println("获取指定key对应的value的数据类型:"+dataType.name());
    }
}

在这里插入图片描述

三、Spring Cache

【1】常用注解:
注解说明
@EnableCaching开启缓存注解功能
@Cacheable判断是否有缓存数据,有=》返回缓存数据;没有=》放到缓存中
@CachePut将方法的返回值放到缓存中
@CacheEvict将一条或多条数据从缓存中删除
【2】使用案例
package com.itheima.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itheima.entity.User;
import com.itheima.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {

    @Autowired
    private CacheManager cacheManager;

    @Autowired
    private UserService userService;

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

    /**
     * CacheEvict:清理指定缓存
     * value:缓存的名称,每个缓存名称下面可以有多个key
     * key:缓存的key
     */
    @CacheEvict(value = "userCache",key = "#p0")
    //@CacheEvict(value = "userCache",key = "#root.args[0]")
    //@CacheEvict(value = "userCache",key = "#id")
    @DeleteMapping("/{id}")
    public void delete(@PathVariable Long id){
        userService.removeById(id);
    }

    //@CacheEvict(value = "userCache",key = "#p0.id")
    //@CacheEvict(value = "userCache",key = "#user.id")
    //@CacheEvict(value = "userCache",key = "#root.args[0].id")
    @CacheEvict(value = "userCache",key = "#result.id")
    @PutMapping
    public User update(User user){
        userService.updateById(user);
        return user;
    }

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

    @Cacheable(value = "userCache",key = "#user.id + '_' + #user.name")
    @GetMapping("/list")
    public List<User> list(User user){
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(user.getId() != null,User::getId,user.getId());
        queryWrapper.eq(user.getName() != null,User::getName,user.getName());
        List<User> list = userService.list(queryWrapper);
        return list;
    }
}
【3】底层不使用redis,重启服务,内存丢失=>解决:
pom.xml
<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:    #redis配置
    host: 192.168.139.128
    port: 6379
    #password:
    database: 0   #默认提供16个数据库,0;0号数据库
  cache:
    redis:
      time-to-live: 1800000 #设置缓存数据的过期时间
启动类:

在这里插入图片描述

Result:

在这里插入图片描述

注解使用:
    @PostMapping()
    @CacheEvict(value = "setmealCache",allEntries = true)
    public Result<String> save(@RequestBody SetmealDto setmealDto) {
        log.info("套餐信息:{}", setmealDto);
        setmealService.saveWithDish(setmealDto);
        return null;
    }
    
    //删除套餐
    @DeleteMapping()
    @CacheEvict(value = "setmealCache",allEntries = true)//清除setmealCache下的所有缓存
    public Result<String> delete(@RequestParam List<Long> ids){
        setmealService.removeWithDish(ids);
        return Result.success("套餐数据删除成功");
    }

    /**
     * 根据条件查询套餐数据
     * @param setmeal
     * @return
     */
    @GetMapping("/list")
    @Cacheable(value = "setmealCache",key = "#setmeal.categoryId + '_' + #setmeal.status")
    public Result<List<Setmeal>> list(Setmeal setmeal){
        LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(setmeal.getCategoryId() != null,Setmeal::getCategoryId,setmeal.getCategoryId());
        queryWrapper.eq(setmeal.getStatus() != null,Setmeal::getStatus,setmeal.getStatus());
        queryWrapper.orderByDesc(Setmeal::getUpdateTime);

        List<Setmeal> list = setmealService.list(queryWrapper);

        return Result.success(list);
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

两句话,ChatGPT帮我写一个打飞机的游戏

大家好&#xff0c;我是全村的希望今天的主题是让 chatGPT 来帮我们写一个打飞机的游戏记得我刚学 Python 的时候&#xff0c;看的那本很经典的入门书《Python 编程&#xff1a;从入门到实践》&#xff0c;里面就有小项目就是教你编写一个打飞机的游戏我那时候是对着书一个一个…

4.8 Beijing Rust Meetup | Call For Presenters

如果你有兴趣参与探讨Rust作为一种强调性能、安全和并发性的编程语言的各种应用、实践和无限可能性的头脑风暴&#xff0c;就一定不能错过这场来自达坦科技、南京大学、CloudWeGo、华为等技术专家带来的关于Rust编程语言相关应用的线下Meetup。我们的主题是Rust &#x1f4a1;X…

优维科技联合广发证券发起「CD持续交付一期项目复盘会」

2023年3月16日&#xff0c;由优维科技联合广发证券共同发起的「广发证券CD持续交付一期项目复盘会」在广发总部大厦闭幕。 复盘目的 为了对广发证券CD持续交付一期项目的总体执行请看落实“回头看”方阵&#xff0c;充分挖掘项目的落地价值&#xff0c;总结项目未来可持续性开…

基于springboot实现广场舞团管理系统演【附项目源码】

基于springboot实现广场舞团管理系统演开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#…

【OS面试】说说你对IO多路复用的理解

面试官&#xff1a; 说说你对IO多路复用的理解&#xff1f; 我&#xff1a; IO多路复用是一种高效地管理多个文件描述符&#xff08;FD&#xff09;的方式&#xff0c;它允许同时监听多个IO事件并在有事件发生时立即响应。 在传统的IO编程中&#xff0c;每个socket连接都需要…

Linux中,和,|和||区别

1、& 表示任务在后台执行&#xff0c;比如运行一个jar文件&#xff0c;但是希望是后台运行可以执行 java -jar test.jar & 2、&& 表示前一条命令执行成功时&#xff0c;才执行后一条命令 &#xff0c;如 echo step1‘ && echo ‘step2’ step1执行成功…

个人百度百科词条创建怎么收费?

互联网时代&#xff0c;百科营销起到举足轻重的作用&#xff0c;因为现在几乎人人都会在百度上去搜索答案&#xff0c; 当用户不了解你的时候&#xff0c;考虑是否和你合作的时候&#xff0c;也会下意识地去百度上搜索一下&#xff0c;看看有没有相关介绍。 这个时候创建一个百…

大屏使用dv-digital-flop定时刷新显示总人数

本文在基础上进行改进&#xff0c;后端使用若依后端IofTV-Screen: &#x1f525;一个基于 vue、datav、Echart 框架的物联网可视化&#xff08;大屏展示&#xff09;模板&#xff0c;提供数据动态刷新渲染、屏幕适应、数据滚动配置&#xff0c;内部图表自由替换、Mixins注入等功…

OSPF(开放式最短路径优先协议2)

OSPF的不规则区域 远离骨干的非骨干区域 不连续骨干 使用tunnel隧道 在R2和R3之间构建一条隧道&#xff0c;之后&#xff0c;将这个隧道宣告到Area0&#xff0c;相当于将R3这个非法的ABR设备合法 化。 使用vpn隧道解决不规则区域的问题 可能产生选路不佳可能造成重复更新因为…

vue打包上线利用插件去除 console

开发阶段&#xff0c;我们会编写大量的 console 语句用于测试 使用 build 命令打包时&#xff0c;会作为警告提出&#xff0c;因为上线之后&#xff0c;这些 console 语句是没有任何作用的&#xff0c;所以警告你应该移除 挨个文件手动删除的方法&#xff0c;会有两个问题 耗…

用ChatGPT学习多传感器融合中的基础知识

困惑与解答&#xff1a; 问题&#xff1a;匈牙利算法中的增广矩阵路径是什么意思 解答&#xff1a; 匈牙利算法是解决二分图最大匹配的经典算法之一。其中的增广矩阵路径指的是在当前匹配下&#xff0c;从一个未匹配节点开始&#xff0c;沿着交替路&#xff08;交替路是指依次…

C++的异常机制导致的crash问题

问题背景 最近工作中遇到了一个非常奇怪的crash问题&#xff0c;反反复复分析了好久。由于保密原因&#xff0c;这里只记录一下分析思路&#xff0c;不会涉及到代码。 初步log分析 tombstone显示这是一个abort&#xff1a;Cmdline: /vendor/bin/hw/vendor.qti.camera.provid…

HAL库(STM32CubeMX)之外部中断(STM32F103C8T6)

系列文章目录 HAL库&#xff08;STM32CubeMX&#xff09;——ADC学习总结&#xff08;包含单次/连续模式下的轮询/中断/DMA&#xff09;&#xff08;蓝桥杯STM32G431RBT6&#xff09; HAL库(STM32CubeMX)——DAC学习&#xff08;STM32G431RBT6&#xff09; HAL库(STM32CubeM…

【Spring源码】讲讲Bean的生命周期

1、前言 面试官&#xff1a;“看过Spring源码吧&#xff0c;简单说说Spring中Bean的生命周期” 大神仙&#xff1a;“基本生命周期会经历实例化 -> 属性赋值 -> 初始化 -> 销毁”。 面试官&#xff1a;“......” 2、Bean的生命周期 如果是普通Bean的生命周期&am…

ZYNQ中的AXI DMA

AXI DMA简介 DMA—直接内存访问—从外设到内存或者从内存到外设&#xff0c;不干涉CPU 硬核DMA和DMA软核如何选择 硬核—内存到内存、内存到PL&#xff08;通过GP传输速率低&#xff09;、内存到IO外设软核—从PL部分将大量数据进行搬运到内存&#xff08;连接到HP速率更高&am…

【中级软件设计师】—数据结构与算法基础考点总结篇(八)

【中级软件设计师】—数据结构与算法基础考点总结篇&#xff08;八&#xff09; 课程大纲 1.1 数组 按行存储&#xff1a;a(2*53)*2 其中a表示的就是a[0][0] 1.2 稀疏矩阵 本题采用代入法&#xff0c;首先代入A0,0&#xff0c;A0,0存入的位置是M【1】&#xff0c;把i0,j0分别…

[网络原理] TCP 协议的相关特性

TCP和UDP都是传输层的协议. 文章目录1. TCP协议格式2. TCP连接及断开连接管理2.1 三次握手2.2 四次挥手3. TCP可靠性机制3.1 确认应答3.2 超时重传4. 滑动窗口5. 流量控制6. 拥塞控制7. 延迟应答8. 捎带应答9. 面向字节流10. 异常情况1. TCP协议格式 TCP的特点是有连接,可靠性…

Ceres 自动求导解析-从原理到实践

Ceres 自动求导解析-从原理到实践 文章目录Ceres 自动求导解析-从原理到实践1.0 前言2.0 Ceres求导简介3.0 Ceres 自动求导原理3.1 官方解释3.2 自我理解4.0 实践4.1 Jet 的实现4.2 多项式函数自动求导4.3 BA 问题中的自动求导Reference1.0 前言 Ceres 有一个自动求导功能&…

Java 读取Excel模板中的数据到实体类

目录一. 前提条件1.1 需求1.2 分析二. 准备2.1 自定义注解2.2 封装Excel的实体类三. 前台四. Controller层五. Service层&#x1f4aa;&#x1f4aa;&#x1f4aa;六. 效果一. 前提条件 1.1 需求 从指定的Excel模板中读取数据&#xff0c;将读取到的数据存储到数据库中。 1.2…

VBA定位文本框控件中光标位置

实例需求&#xff1a;用户窗体中有如下4个TextBox控件&#xff0c;TextBox1中已经有文字内容&#xff0c;点击【定位】按钮&#xff0c;统计TextBox1中段落数量&#xff0c;并定位TextBox1中光标位置&#xff08;箭头处&#xff09;&#xff0c;如下图所示。 示例代码如下。 P…