SpringBoot3整合Redis基础操作

SpringBoot3整合Redis&基础应用

配套视频:SpringBoot3整合Redis&基础操作视频

1. 概述

SpringBoot是一种用于构建Java应用程序的开发框架,Redis是一个高性能的键值存储数据库,常用于缓存、会话管理、消息队列等应用场景,本文将给大家介绍,基于最新的的SpringBoot3基础上如何集成Redis,并实现Redis基本应用操作。

环境准备

  • Java17 或更高
  • Redis,版本无要求

2. 整合过程

  1. 创建项目

  2. Maven依赖

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
    </dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId>
    </dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
    </dependency>
    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
    </dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.5</version>
    </dependency>
    <!-- 注意,mybatisplus会自动引用mybatis,但mybatis-spring版本和springboot3+版本的spring会不匹配,所以要升版本-->
    <dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>3.0.3</version>
    </dependency>
    
  3. yml依赖,注意先创建好一个数据库testdb

    server:port: 9999spring:data:redis:host: localhostport: 6379datasource:username: rootpassword: 123456url: jdbc:mysql:///testdb        
    
  4. Redis配置类

    @Configuration
    @EnableCaching
    public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(factory);redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));return redisTemplate;}@Beanpublic RedisCacheManager redisCacheManager(RedisTemplate redisTemplate) {RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisTemplate.getConnectionFactory());RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig().serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer()));return new RedisCacheManager(redisCacheWriter, redisCacheConfiguration);}
    }
    

3. RedisTemplate操作

使用RedisTemplate进行常见的Redis操作,如存储、检索和删除数据。

  1. String

    // 普通字符串
    String key1 = "user:token:0001";
    redisTemplate.opsForValue().set(key1, UUID.randomUUID().toString(), 30, TimeUnit.MINUTES);
    System.out.println(redisTemplate.opsForValue().get(key1));// 计数
    String key2 = "article:A00001:viewsCount";
    redisTemplate.opsForValue().increment(key2);
    System.out.println(redisTemplate.opsForValue().get(key2));// 对象
    HashMap<String, Object> user = new HashMap<>();
    user.put("id", "0001");
    user.put("name", "张三疯");
    user.put("age", 28);
    user.put("birthday", new Date(2008 - 1900, 10, 03));
    String key3 = "user:0001";
    redisTemplate.opsForValue().set(key3, user);
    System.out.println(redisTemplate.opsForValue().get(key3));
    
  2. hash

    String key4 = "user:0001:cart";
    Map<String, Object> shoppingCart = new HashMap<>();
    shoppingCart.put("cartId", "123456789");
    shoppingCart.put("userId", "987654321");List<Map<String, Object>> items = List.of(Map.of("itemId", "1", "itemName", "手机", "price", 999.99, "quantity", 1),Map.of("itemId", "2", "itemName", "笔记本电脑", "price", 1499.99, "quantity", 2),Map.of("itemId", "3", "itemName", "耳机", "price", 49.99, "quantity", 3)
    );shoppingCart.put("items", items);
    shoppingCart.put("totalAmount", 3149.92);
    shoppingCart.put("creationTime", "2046-03-07T10:00:00");
    shoppingCart.put("lastUpdateTime", "2046-03-07T12:30:00");
    shoppingCart.put("status", "未结账");redisTemplate.opsForHash().putAll(key4, shoppingCart);
    System.out.println(redisTemplate.opsForHash().get(key4, "items"));
    
  3. set

    String key5 = "author:0001:fans";
    redisTemplate.opsForSet().add(key5, "张三", "李四", "王五");
    System.out.println("粉丝数:" + redisTemplate.opsForSet().size(key5));
    
  4. zset

    String key5 = "user:0001:friends";
    redisTemplate.opsForZSet().add(key5,"张三", System.currentTimeMillis());
    redisTemplate.opsForZSet().add(key5,"李四", System.currentTimeMillis());
    redisTemplate.opsForZSet().add(key5,"王五", System.currentTimeMillis());Set<String> friendList  = redisTemplate.opsForZSet().reverseRange(key5, 0L, -1L);
    System.out.println("好友列表:" + friendList );
    
  5. list

    String key6 = "order:queue";
    Map<String, Object> order1 = new HashMap<>();
    order1.put("orderId", "1001");
    order1.put("userId", "2001");
    order1.put("status", "已完成");
    order1.put("amount", 500.75);
    order1.put("creationTime", "2024-03-07T09:30:00");
    order1.put("lastUpdateTime", "2024-03-07T10:45:00");
    order1.put("paymentMethod", "在线支付");
    order1.put("shippingMethod", "自提");
    order1.put("remarks", "尽快处理");Map<String, Object> order2 = new HashMap<>();
    order2.put("orderId", "1002");
    order2.put("userId", "2002");
    order2.put("status", "待处理");
    order2.put("amount", 280.99);
    order2.put("creationTime", "2024-03-07T11:00:00");
    order2.put("lastUpdateTime", "2024-03-07T11:00:00");
    order2.put("paymentMethod", "货到付款");
    order2.put("shippingMethod", "快递配送");
    order2.put("remarks", "注意保鲜");
    // A程序接收订单请求并将其加入队列
    redisTemplate.opsForList().leftPush(key6,order1);
    redisTemplate.opsForList().leftPush(key6,order2);
    // B程序从订单队列中获取订单数据并处理
    System.out.println("处理订单:" + redisTemplate.opsForList().rightPop(key6));
    

4. @RedisHash注解

@RedisHash:用于将Java对象映射到Redis的Hash数据结构中,使得对象的存储和检索变得更加简单

  1. 创建实体类

    @Data
    @RedisHash
    public class User {@Idprivate Integer id;private String name;private Integer age;private String phone;
    }
    
  2. 创建接口,注意需要继承CrudRepository,这样改接口就具备对应实体的redis中的增删改查操作

    public interface UserRedisMapper extends CrudRepository<User,Integer> {
    }
    
  3. 操作

    @Autowired
    private UserRedisMapper userRedisMapper;@Test
    public void testRedisHash(){User user = new User();user.setId(100);user.setName("张三疯");user.setAge(18);user.setPhone("19988889999");// 保存userRedisMapper.save(user);// 读取User redisUser = userRedisMapper.findById(100).get();System.out.println("redisUser:" + redisUser);// 更新user.setPhone("18899998888");userRedisMapper.save(user);// 删除//userRedisMapper.deleteById(100);// 判断存在boolean exists = userRedisMapper.existsById(100);System.out.println("exists: " + exists);
    }
    

5. 缓存管理注解

Spring的缓存管理功能旨在帮助开发人员轻松地在应用程序中使用缓存,以提高性能和响应速度。它提供了一套注解和配置,使得开发人员可以在方法级别上进行缓存控制,并且支持多种缓存存储提供程序,如Caffeine、EhCache、Redis等。

注解说明
@Cacheable用于声明一个方法的返回值应该被缓存起来,以便下次相同的参数调用时可以直接返回缓存中的值,而不需要执行方法体。
@CachePut用于更新缓存中的数据,它会在方法执行后,将返回值更新到缓存中
@CacheEvict用于清除缓存中的数据,它可以根据条件清除指定的缓存项
  1. 准备表

    CREATE TABLE product (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255) NOT NULL,description TEXT,price DECIMAL(10, 2) NOT NULL,stock INT NOT NULL
    );
    
    INSERT INTO product (name, description, price, stock) VALUES
    ('iPhone 15', '最新的iPhone型号', 8999.99, 100),
    ('三星Galaxy S24', '旗舰安卓手机', 7899.99, 150),
    ('MacBook Pro', '专业人士的强大笔记本电脑', 15999.99, 50),
    ('iPad Air', '性能强劲的便携式平板电脑', 5599.99, 200),
    ('索尼PlayStation 6', '下一代游戏机', 4499.99, 75);
    
  2. 实体类

    @Data
    @TableName
    public class Product {@TableIdprivate Integer id;private String name;private String description;private Double price;private Integer stock;
    }
    
  3. Mapper

    public interface ProductMapper extends BaseMapper<Product> {
    }
    

    启动类添加注解 @MapperScan(“com.qqcn.*.mapper”)

  4. Service

    public interface ProductService {// 根据商品ID获取商品信息Product getProductById(Integer id);// 添加新商品Product addProduct(Product product);// 更新商品信息Product updateProduct(Product product);// 根据商品ID删除商品Integer deleteProductById(Integer id);
    }
    
    @Service
    public class ProductServiceImpl implements ProductService {@Resourceprivate ProductMapper productMapper;@Cacheable(value = "product", key = "'product:' + #id")@Overridepublic Product getProductById(Integer id) {return productMapper.selectById(id);}@CachePut(value = "product", key = "'product:' + #product.id")@Overridepublic Product addProduct(Product product) {productMapper.insert(product);return product;}@CachePut(value = "product", key = "'product:' + #product.id")@Overridepublic Product updateProduct(Product product) {productMapper.updateById(product);return product;}@CacheEvict(value = "product", key = "'product:' + #id")@Overridepublic Integer deleteProductById(Integer id) {productMapper.deleteById(id);return id;}
    }
    
  5. 测试

    @Autowired
    private ProductService productService;@Test
    public void testQuery(){Product product = productService.getProductById(1);System.out.println(product);
    }@Test
    public void testUpdate(){Product product = productService.getProductById(1);System.out.println(product);product.setName("苹果19");productService.updateProduct(product);System.out.println(productService.getProductById(1));
    }@Test
    public void testDelete(){productService.deleteProductById(1);
    }
    

结束语

以上就是本期分享内容,内容并不全面,旨在抛砖引玉,最重要的还是需要你到项目中,在合适的应用场景中去使用redis,发挥出redis的优势和价值。

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

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

相关文章

亚马逊云科技Glue

Glue 最重要的部分&#xff0c; ETL&#xff1a;用于从 A 点&#xff08;我们的源数据&#xff09;提取、转换和加载数据到 B 点&#xff08;目标文件或数据存储库&#xff09;。 AWS Glue 会为您执行大量此类工作。 转换通常是更繁重的工作&#xff0c;需要从各种来源进行组合…

【嵌入式DIY实例】-自动割草机器

自动割草机器 文章目录 自动割草机器1、割草机器介绍2、硬件准备3、功能设计4、硬件接线5、代码实现本文将介绍如何使用 Arduino 构建一个简易自动割草机机器人或割草机机器人。该机器人可以自动剪掉花园里多余的草。如果花园里有障碍物,它会自动改变方向。帮助以减少人力。 警…

【Elasticsearch】windows安装elasticsearch教程及遇到的坑

一、安装参考 1、安装参考&#xff1a;ES的安装使用(windows版) elasticsearch的下载地址&#xff1a;https://www.elastic.co/cn/downloads/elasticsearch ik分词器的下载地址&#xff1a;https://github.com/medcl/elasticsearch-analysis-ik/releases kibana可视化工具下载…

半小时搭建keycloak环境,构建强大的用户中心

第一步: 安装JDK 第二步: 安装Docker 第三步: 部署 keycloak 写一个dockerfile # docker file FROM quay.io/keycloak/keycloak:19.0.3 as builder# Enable health and metrics support ENV KC_HEALTH_ENABLED=true # 设置健康检查启用标志为true ENV KC_METRICS_EN…

Docker 解析:使用 Dockerfile 自动构建镜像

简介 Docker 容器是使用 基础 镜像创建的。一个镜像可以是基本的&#xff0c;只包含操作系统的基本要素&#xff0c;也可以包含一个准备好启动的复杂的预构建应用程序堆栈。 在使用 Docker 构建镜像时&#xff0c;每个操作&#xff08;例如执行的命令&#xff0c;比如 apt-get…

网络编程套接字——实现简单的UDP网络程序

目录 1、预备知识 1.1、认识端口号 1.2、端口号 vs 进程pid 1.3、认识TCP协议 1.4、认识UDP协议 1.5、网络字节序 2、socket编程接口 2.1、socket常见API 2.2、sockaddr结构 3、实现一个简易的UDP服务器和客户端通信 log.hpp UdpServer.hpp UdpClient.cc Main.cc…

upload-labs通关方式

pass-1 通过弹窗可推断此关卡的语言大概率为js&#xff0c;因此得出两种解决办法 方法一 浏览器禁用js 关闭后就逃出了js的验证就可以正常php文件 上传成功后打开图片链接根据你写的一句话木马执行它&#xff0c;我这里采用phpinfo&#xff08;&#xff09; 方法二 在控制台…

【网络编程基础(一)】网络基础和SOCKET

这里写目录标题 1、网络三要素2、IPV4和IPV6区别3、网络交互3.1、交互模型图3.2、基础通信协议3.3、OSI参考模型与TCP/IP参考模型对应关系 4、SOCKET网络套接字4.1、SOCKET分类4.2、基于流式套接字的编程流程4.3、网络通信雏形4.4、socket函数4.4.1、socket函数示例 4.5、bind函…

蓝桥杯小白赛第 7 场 3.奇偶排序(sort排序 + 双数组)

思路&#xff1a;在第一次看到这道题的时候我第一想法是用冒泡&#xff0c;但好像我的水平还不允许我写出来。我又读了遍题目发现它的数据很小&#xff0c;我就寻思着把它分成奇偶两部分。应该怎么分呢&#xff1f; 当然在读入的时候把这个问题解决就最好了。正好它的数据范围…

【相关问题解答1】bert中文文本摘要代码:import时无法找到包时,几个潜在的原因和解决方法

【相关问题解答1】bert中文文本摘要代码 写在最前面问题1问题描述一些建议import时无法找到包时&#xff0c;几个潜在的原因和解决方法1. 模块或包的命名冲突解决方法&#xff1a; 2. 错误的导入路径解决方法&#xff1a; 3. 第三方库的使用错误解决方法&#xff1a; 4. 包未正…

C++算法学习心得八.动态规划算法(4)

1.零钱兑换&#xff08;322题&#xff09; 题目描述&#xff1a; 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1。 你可以认为每种硬币的数量是无限的。…

CSDN学习笔记总索引(2024)——我的创作纪念日(1024)

2021-05-21至2024-03-17笔记&#xff0c;收集并展示浏览阅读点赞收藏等数据。 (本笔记适合初通Python&#xff0c;对其基本数据类型字符串str、列表list、元组tuple、字典dict初步了解&#xff0c;认识Linux获取Html文本指令crul、会使正则模块re的coder翻阅) 【学习的细节是欢…

【C++】每日一题 105 从前序和中序序列构造二叉树

给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 #include <iostream> #include <vector> #include <unordered_map>struct TreeN…

华为机试真题练习汇总(41~50)

华为机试真题练习汇总&#xff08;41~50&#xff09; 华为机试真题练习汇总&#xff08;41~50&#xff09;* HJ41 称砝码* HJ42 学英语* HJ43 迷宫问题* HJ44 SudokuHJ45 名字的漂亮度HJ46 截取字符串HJ48 从单向链表中删除指定值的节点** HJ50 四则运算 华为机试真题练习汇总&…

VS2019加QT5.14中Please assign a Qt installation in ‘Qt Project Settings‘.问题的解决

第一篇&#xff1a; 原文链接&#xff1a;https://blog.csdn.net/aoxuestudy/article/details/124312629 error:There’ no Qt version assigned to project mdi.vcxproj for configuration release/x64.Please assign a Qt installation in “Qt Project Settings”. 一、分…

修改Docker 默认存储路径,镜像容器移动到新路径

修改Docker 默认存储路径&#xff0c;镜像容器移动到新路径 查看当前docker的默认存储目录1 停止docker服务2 数据迁移3 配置目录4 重启docker服务5 查看 主机 ubuntu20.04 查看当前docker的默认存储目录 docker info显示 Docker Root Dir: /var/lib/docker1 停止docker服务…

船舶工控机维修 日本古野FURUNO工控机主板 船用雷达配件

古野海洋雷达是迄今为止为休闲划船者打造的最佳碰撞规避系统。雷达系统让您“看到”黑暗、薄雾和暴风雨天气条件。当仅在大型船舶上使用时&#xff0c;雷达设备现在结构紧凑&#xff0c;吸引很少的电能&#xff0c;并且尺寸适合小至 18 英尺的船只。雷达与带有最新数字图表的 A…

PPO:推动语言模型对齐的关键技术

PPO&#xff1a;推动语言模型对齐的关键技术 最新的人工智能研究揭示&#xff0c;通过人类反馈的强化学习(RLHF)是训练大型语言模型(LLMs)的关键技术。尽管某些AI从业者因熟悉监督学习而回避使用RL&#xff0c;但RL技术其实并不复杂&#xff0c;并能显著提升LLM的性能。本文深…

Linux基础开发工具之yum与vim

1. Linux软件包管理器——yum 1.1 什么是软件包&#xff1f; 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, …

Nginx离线安装(保姆级教程)

1、下载与安装gcc-c环境 获取rpm包的方式很多&#xff0c;在这里推荐使用yum工具获取&#xff0c;因为手动从官网下载&#xff0c;手动执行rpm -Uvh *.rpm --nodeps --force命令进行安装&#xff0c;可能会缺少某个依赖&#xff0c;我们也不确定到底需要哪些依赖。 因此需要准…