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{

    @Autowired
    ComMapper comMapper;

    @Autowired
    StringRedisTemplate stringRedisTemplate;//StringRedisTemplate模板用于从Redis存取字符串,注入该模板

    @Autowired
    RedisTemplate<String,Object> redisTemplate;//RedisTemplate模板用于从Redis存取对象,注入该模板

    @Override
    public String getPNameFromRedis(int pid) {
        Commodity commodity = comMapper.queryByPid(pid);//从MyBatis接口读取商品记录
        stringRedisTemplate.opsForValue().set("pname",commodity.getPname());//使用set()方法存入Redis
        return stringRedisTemplate.opsForValue().get("pname");//使用get()方法从Redis中获取
    }

    @Override
    public 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格式的序列化类
     */
    @Bean
    public 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的商品对象

相关推荐

  1. SpringBoot整合Redis

    2024-05-25 20:44:40       34 阅读
  2. SpringBoot3 整合Redis

    2024-05-25 20:44:40       33 阅读
  3. SpringBoot 整合 Redis 缓存

    2024-05-25 20:44:40       40 阅读
  4. SpringBoot 整合redis

    2024-05-25 20:44:40       35 阅读
  5. springboot整合redis

    2024-05-25 20:44:40       34 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-25 20:44:40       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-25 20:44:40       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-25 20:44:40       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-25 20:44:40       18 阅读

热门阅读

  1. 爬虫面试手册

    2024-05-25 20:44:40       8 阅读
  2. Mysql自增id、uuid、雪花算法id的比较

    2024-05-25 20:44:40       8 阅读
  3. 1.1 什么是internet?

    2024-05-25 20:44:40       8 阅读
  4. 最小生成树

    2024-05-25 20:44:40       8 阅读