SpringBoot——整合Redis

目录

Redis

创建Commodity表

启动MySQL和Redis

新建一个SpringBoot项目

pom.xml

application.properties

Commodity实体类

 ComMapper接口

ComService业务层接口

ComServiceImpl业务接口的实现类

ComController控制器

RedisConfig配置类

SpringbootRdisApplication启动类

启动项目,进行测试 


Redis

  • Redis是一个高性能的 key-value 数据库,支持多种数据结构,常用作缓存、消息代理和配置中心
  • 用途:
    • 1、缓存热点数据
      • 由于Redis的访问速度快、支持的数据类型很丰富,所以很适合用来存储热点数据,其内置的expire可以对缓存的数据设置过期时间,在缓存的数据过期后再设置新的缓存数据
    • 2、计数器
      • Redis的incrby命令是原子性地递增,因此可以运用于商城系统的高并发的秒杀活动、分布式序列号的生成等场景
    • 3、排行榜
      • 可以使用Redis的SortedSet进行热点数据的排序
    • 4、分布式锁
      • Redis的setnx命令的作用是,如果当前的缓存数据,不存在则设置缓存成功并返回1,否则设置缓存失败并返回0。可以利用这个特性在Redis集群中检测锁的有效时间,如果超时,那么等待的进程将有机会获得锁,从而防止项目出现死锁
  • 在SpringBoot中要存储和访问Redis中的数据,可以使用 RedisTemplate 和 StringRedisTemplate 模板类,用模板操作Redis实际就是通过set()/get()方法存取数据
    • StringRedisTemplate 是 RedisTemplate 的子类
    • StringRedisTemplate 只针对键值都是字符串类型的数据,而 RedisTemplate 可以操作对象类型的数据
    • StringRedisTemplate 默认使用 StringRedisSerializer 序列化器,而 RedisTemplate 默认使用 JdkSerializationRedisSerializer 序列化器
    • RedisTemplate 提供了5种数据结构的操作方法
      • opsForValue:操作字符串类型
      • opsForHash:操作哈希类型
      • opsForList:操作列表类型
      • opsForSet:操作集合类型
      • opsForZSet:操作有序集合类型
  • 当数据存储到 Redis中时,键和值都是通过SpringBoot提供的序列化器(Serializer)序列化到内存数据库中

项目总结

  1.  引入依赖:首先,在 pom.xml 文件中引入 Spring Boot Starter Data Redis 依赖,以便使用 Spring Boot 提供的 Redis 支持。
  2. 配置 Redis 连接信息:在 Spring Boot 项目的配置文件(如 application.properties 或 application.yml)中配置 Redis 的连接信息,包括主机地址、端口、密码等。
  3. 编写 Redis 配置类:如果需要自定义 RedisTemplate 的配置,可以创建一个 Redis 配置类,在其中配置 RedisTemplate。你可以自定义键值的序列化器、连接工厂等配置。
  4. 使用 RedisTemplate 进行操作:通过在需要使用 Redis 的地方注入 RedisTemplate,即可使用它来进行 Redis 的操作,包括存储、读取、删除等操作。
    1. 比如本项目中就是在ComServiceImpl业务接口的实现类中编写业务逻辑代码时,使用到了Redis进行数据的存取 
  5. 测试:编写单元测试或集成测试来验证 Redis 的功能是否正常。
  6. 这就是整合 Spring Boot 与 Redis 的基本工作流程和思路。通过这些步骤,你可以在 Spring Boot 项目中方便地使用 Redis 来实现缓存、分布式锁等功能。

创建Commodity表

CREATE DATABASE netshop;
USE netshop;
CREATE TABLE commodity(Pid INT(8) NOT NULL PRIMARY KEY,TCode CHAR(3) NOT NULL,SCode CHAR(8) NOT NULL,PName VARCHAR(32) NOT NULL,PPrice DECIMAL(7,2) NOT NULL,Stocks INT UNSIGNED DEFAULT 0
);
INSERT INTO commodity(Pid,TCode,SCode,PName,PPrice,Stocks) VALUES(1,'11A','SXLC001A','洛川红富士苹果冰糖心10斤箱装',44.80,3601);
INSERT INTO commodity(Pid,TCode,SCode,PName,PPrice,Stocks) VALUES(2,'11A','SXLC002A','烟台红富士苹果10斤箱装',29.80,5698);
INSERT INTO commodity(Pid,TCode,SCode,PName,PPrice,Stocks) VALUES(3,'11A','SXLC003A','库尔勒香梨10斤箱装',69.80,8902);

启动MySQL和Redis

命令行启动MySQL,不要关闭小黑窗

双击redis-server.exe,启动redis服务器

新建一个SpringBoot项目

  • 添加Spring Boot基本框架:Spring Web
  • Lombok模型简化组件:Lombok
  • MyBatis框架:MyBatis Framework
  • MySQL的驱动:MySQL Driver
  • Redis框架:Spring Data Redis(Access+Driver)

项目结构:

pom.xml

  • 常见报错的解决办法:加个版本号<version>,或者降一下版本号
  • 推荐使用spring-boot-starter-data-redis,我查了很多办法也解决不了这个依赖的报错,所以在此用了spring-data-redis,需要手动配置Redis 相关的 bean 和属性。这可能导致配置错误或遗漏,从而导致应用无法正确连接到 Redis。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.12.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.study</groupId><artifactId>springboot_redis</artifactId><version>0.0.1-SNAPSHOT</version><name>springboot_redis</name><description>Demo project for Spring Boot</description><properties><java.version>8</java.version></properties><dependencies><!--推荐使用spring-boot-starter-data-redis,免去手动配置--><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>2.4.1</version></dependency><!--SpringBoot默认使用Lettuce客户端,相比于Jedis,线程安全且可支持并发访问--><dependency><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</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>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter-test</artifactId><version>2.2.2</version><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>

application.properties配置文件

# 连接MySQL数据库
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/netshop?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=true
spring.datasource.username=root
spring.datasource.password=admin
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver# 连接Redis
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=
# Redis数据库索引(默认为0)
spring.redis.database=0

Commodity实体类

package com.study.springboot_redis.model;import lombok.Data;
import java.io.Serializable;@Data //该注解包含了getter,setter,toString()等方法
public class Commodity implements Serializable {//序列化private int pid;//商品号private String tcode;//商品分类编码private String scode;//商家编码private String pname;//商品名称private float pprice;//商品价格private int stocks;//商品库存
}

 ComMapper接口

package com.study.springboot_redis.mapper;import com.study.springboot_redis.model.Commodity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;/*** 这是一个公共接口,定义了与commodity表进行交互的方法*/
@Mapper //这个注解表示该接口是一个Mapper接口,用于与数据库进行交互
public interface ComMapper {//@Param("pid")注解用于将方法参数与SQL语句中的pid参数进行映射@Select("SELECT * FROM commodity WHERE Pid = #{pid}")Commodity queryByPid(@Param("pid") int pid);
}

ComService业务层接口

package com.study.springboot_redis.service;import com.study.springboot_redis.model.Commodity;/*** 业务层*/
public interface ComService {public String getPNameFromRedis(int pid);//从Redis获取商品名称public Commodity getComFromRedis(int pid);//从Redis获取商品记录对象
}

ComServiceImpl业务接口的实现类

package com.study.springboot_redis.service;import com.study.springboot_redis.mapper.ComMapper;
import com.study.springboot_redis.model.Commodity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.data.redis.core.StringRedisTemplate;/*** 业务接口的实现类* 用模板操作Redis实际就是通过set()/get()方法存取数据*/
@Service //将一个类标识为服务层组件
public class ComServiceImpl implements ComService{@AutowiredComMapper comMapper;@AutowiredStringRedisTemplate stringRedisTemplate;//StringRedisTemplate模板用于从Redis存取字符串,注入该模板@AutowiredRedisTemplate<String,Object> redisTemplate;//RedisTemplate模板用于从Redis存取对象,注入该模板@Overridepublic String getPNameFromRedis(int pid) {Commodity commodity = comMapper.queryByPid(pid);//从MyBatis接口读取商品记录stringRedisTemplate.opsForValue().set("pname",commodity.getPname());//使用set()方法存入Redisreturn stringRedisTemplate.opsForValue().get("pname");//使用get()方法从Redis中获取}@Overridepublic Commodity getComFromRedis(int pid) {Commodity commodity = comMapper.queryByPid(pid);redisTemplate.opsForValue().set(String.valueOf(commodity.getPid()),commodity);return (Commodity) redisTemplate.opsForValue().get(String.valueOf(pid));}
}

ComController控制器

package com.study.springboot_redis.controller;import com.study.springboot_redis.model.Commodity;
import com.study.springboot_redis.service.ComServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("com")
public class ComController {@Autowired //注入业务层操作Redis的服务实体ComServiceImpl comService;@RequestMapping("getpname")//从Redis获取商品名称public String getPNameByPid(int pid){return comService.getPNameFromRedis(pid);}@RequestMapping("getcom")//从Redis获取商品记录对象public Commodity getComByPid(int pid){return comService.getComFromRedis(pid);}
}

RedisConfig配置类

package com.study.springboot_redis.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration //声明该类为配置类
public class RedisConfig {/*** RedisTemplate使用JdkSeriallizationRedisSerializer来序列化数据,以二进制的形式存储,不便可视化,所以在此自定义序列化器* 在此自定义一个JSON格式的序列化类*/@Beanpublic RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory connectionFactory) {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setKeySerializer(new StringRedisSerializer());//GenericJackson2JsonRedisSerializer这个序列化器是一个通用的 JSON 序列化器,// 它可以序列化和反序列化任意类型的对象,而不需要指定对象的类型redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());redisTemplate.setConnectionFactory(connectionFactory);return redisTemplate;}
}

SpringbootRdisApplication启动类

package com.study.springboot_redis;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class SpringbootRedisApplication {public static void main(String[] args) {SpringApplication.run(SpringbootRedisApplication.class, args);}
}

启动项目,进行测试 

  • 访问网址:http://localhost:8080/com/getpname?pid=1
  • 取出pid=1的商品名称,页面返回一个字符串

  • 访问网址:http://localhost:8080/com/getcom?pid=1 
  • 取出pid=1的商品对象

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

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

相关文章

在Visual Studio Code和Visual Studio 2022下配置Clang-Format,格式化成Google C++ Style

项目开发要求好的编写代码格式规范&#xff0c;常用的是根据Google C Style Guide 网上查了很多博文&#xff0c;都不太一样有的也跑不起来&#xff0c;通过尝试之后&#xff0c;自己可算折腾好了&#xff0c;整理一下过程 背景&#xff1a; 编译器主要有三部分&#xff1a;前…

C++第三方库 【HTTP/HTTPS】— httplib库

目录 认识httplib库 安装httplib库 httplib的使用 httplib请求类 httplib响应类 Server类 Client类 httplib库搭建简单服务器&客户端 认识httplib库 httplib库&#xff0c;是一个C11单头文件的&#xff0c;轻量级的跨平台HTTP/HTTPS库&#xff0c;可以用来创建简单的…

【Text2SQL】WikiSQL 数据集与 Seq2SQL 模型

论文&#xff1a;Seq2SQL: Generating Structured Queries from Natural Language using Reinforcement Learning ⭐⭐⭐⭐⭐ ICLR 2018 Dataset: github.com/salesforce/WikiSQL Code&#xff1a;Seq2SQL 模型实现 一、论文速读 本文提出了 Text2SQL 方向的一个经典数据集 —…

Linux--10---安装JDK、MySQL

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 安装JDK[Linux命令--03----JDK .Nginx. 数据库](https://blog.csdn.net/weixin_48052161/article/details/108997148) 第一步 查询系统中自带的JDK第二步 卸载系统中…

Unity Physics入门

概述 在unity中物理属性是非常重要的&#xff0c;它可以模拟真实物理的效果在unity中&#xff0c;其中的组件是非常多的&#xff0c;让我们来学习一下这部分的内容吧。 Unity组件入门篇总目录----------点击导航 Character Controller(角色控制) 说明&#xff1a;组件是Unity提…

华为编程题目(实时更新)

1.大小端整数 计算机中对整型数据的表示有两种方式&#xff1a;大端序和小端序&#xff0c;大端序的高位字节在低地址&#xff0c;小端序的高位字节在高地址。例如&#xff1a;对数字 65538&#xff0c;其4字节表示的大端序内容为00 01 00 02&#xff0c;小端序内容为02 00 01…

【案例分享】医疗布草数字化管理系统:聚通宝赋能仟溪信息科技

内容概要 本文介绍了北京聚通宝科技有限公司与河南仟溪信息科技有限公司合作开发的医疗布草数字化管理系统。该系统利用物联网技术实现了医疗布草生产过程的实时监控和数据分析&#xff0c;解决了医疗布草洗涤厂面临的诸多挑战&#xff0c;包括人工记录、生产低效率和缺乏实时…

DNF手游攻略:角色培养与技能搭配!游戏辅助!

角色培养和技能搭配是《地下城与勇士》中提升战斗力的关键环节。每个职业都有独特的技能和发展路线&#xff0c;合理的属性加点和技能搭配可以最大化角色的潜力&#xff0c;帮助玩家在各种战斗中立于不败之地。接下来&#xff0c;我们将探讨如何有效地培养角色并搭配技能。 角色…

JavaEE之线程(9) _定时器的实现代码

前言 定时器也是软件开发中的一个重要组件. 类似于一个 “闹钟”。 达到一个设定的时间之后&#xff0c;就执行某个指定好的代码&#xff0c;比如&#xff1a; 在受上述场景中&#xff0c;当客户端发出去请求之后&#xff0c; 就要等待响应&#xff0c;如果服务器迟迟没有响应&…

大小字符判断

//函数int my_isalpha(char c)的功能是返回字符种类 //大写字母返回1&#xff0c;小写字母返回-1.其它字符返回0 //void a 调用my_isalpha()&#xff0c;返回大写&#xff0c;输出*&#xff1b;返回小写&#xff0c;输出#&#xff1b;其它&#xff0c;输出&#xff1f; #inclu…

【Linux】Linux的安装

文章目录 一、Linux环境的安装虚拟机 镜像文件云服务器&#xff08;可能需要花钱&#xff09; 未完待续 一、Linux环境的安装 我们往后的学习用的Linux版本为——CentOs 7 &#xff0c;使用 Ubuntu 也可以 。这里提供几个安装方法&#xff1a; 电脑安装双系统&#xff08;不…

深入解析力扣162题:寻找峰值(线性扫描与二分查找详解)

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

virtual box ubuntu20 全屏展示

virtual box 虚拟机 ubuntu20 系统 全屏展示 ubuntu20.04 视图-自动调整窗口大小 视图-自动调整显示尺寸 系统黑屏解决 ##设备-安装增强功能 ##进入终端 ##终端打不开&#xff0c;解决方案-传送门ubuntu Open in Terminal打不开终端解决方案-CSDN博客 ##点击cd盘按钮进入文…

【RabbitMQ】使用SpringAMQP的Publish/Subscribe(发布/订阅)

Publish/Subscribe **发布(Publish)、订阅(Subscribe)&#xff1a;**允许将同一个消息发送给多个消费者 **注意&#xff1a;**exchange负责消息路由&#xff0c;而不是存储&#xff0c;路由失败则消息丢失 常见的**X(exchange–交换机)***类型&#xff1a; Fanout 广播Direc…

【设计模式】JAVA Design Patterns——Callback(回调模式)

&#x1f50d;目的 回调是一部分被当为参数来传递给其他代码的可执行代码&#xff0c;接收方的代码可以在一些方便的时候来调用它。 &#x1f50d;解释 真实世界例子 我们需要被通知当执行的任务结束时。我们为调用者传递一个回调方法然后等它调用通知我们。 通俗描述 回调是一…

试用百川智能的百小应-说的太多,做的太少

“百小应”的品牌标识&#xff08;logo&#xff09;上有一缕黄色&#xff0c;这是王小川特意设计的。他说&#xff0c;其他AI应用都在强调科技感&#xff0c;更愿意用蓝色或者冷色调。但他觉得这一代科技与上个时代不一样&#xff0c;现代科技应该像人&#xff0c;所以选择使用…

Java进阶学习笔记5——Static应用知识:单例设计模式

设计模式&#xff1a; 架构师会使用到设计模式&#xff0c;开发框架&#xff0c;就需要掌握很多设计模式。 在Java基础阶段学习设计模式&#xff0c;将来面试笔试的时候&#xff0c;笔试题目会经常靠到设计模式。 将来会用到设计模式。框架代码中会用到设计模式。 什么是设计…

linux常用软件源码安装-2

jdk、tomcat、Apache、nginx、mysql、redis、maven、nexus安装文档&#xff1a;linux常用软件源码安装 9.sonarqube安装 前置条件&#xff1a;mysql5.6和jdk8 1.下载 官网 2.安装unzip并解压sonarqube&#xff0c;然后移动到/usr/local yum install -y unzip unzip sonarq…

基于Matlab完整版孤立词识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 孤立词识别是语音识别领域的一个重要分支&#xff0c;其目标是将输入的语音信号转换为计算机可…

收入极高的副业兼职,单价179元的养生爆款卖出3000份

做养生赛道切忌不要只靠接广告变现&#xff0c;换个思路以产品为核心&#xff0c;走低粉高变现才是变现效率最高的。 周周近财&#xff1a;让网络小白少花冤枉钱&#xff0c;赚取第一桶金 今天&#xff0c;我们要分析的这位养生博主&#xff0c;仅凭一款售价为179元的温通膏&a…