当前位置: 首页 > news >正文

Spring Boot 下 MySQL Redis双重复用提高服务器性能

1. 项目源代码

为了方便演示,以及大家上手实验,我搭建了一个简单的注册登录的后台,在不加 Redis 的情况下的源代码如下

通过网盘分享的文件:study-无redis.zip
链接: https://pan.baidu.com/s/1etc29in_6q8CDOFm-Gb7Nw?pwd=yuer 提取码: yuer

2. 数据库结构

数据库结构如下所示:

/*
 Navicat Premium Data Transfer

 Source Server         : localhost_3306
 Source Server Type    : MySQL
 Source Server Version : 80016
 Source Host           : localhost:3306
 Source Schema         : redis

 Target Server Type    : MySQL
 Target Server Version : 80016
 File Encoding         : 65001

 Date: 07/04/2025 10:55:27
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for usr
-- ----------------------------
DROP TABLE IF EXISTS `usr`;
CREATE TABLE `usr`  (
  `uid` int(11) NOT NULL,
  `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  PRIMARY KEY (`uid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of usr
-- ----------------------------
INSERT INTO `usr` VALUES (1, 'yuer', 'yuerpass');
INSERT INTO `usr` VALUES (686, '123', '456');

SET FOREIGN_KEY_CHECKS = 1;

3. Redis集成

接下来我们添加 Redis 支持:

3.1 添加 Redis 依赖

		<!-- Redis依赖 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>
		<!-- 添加Jackson序列化依赖 -->
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
		</dependency>

3.2 配置 Redis

在 config 包下新建一个 RedisConfig 类:

package com.yuer.config;

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.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplateredisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplateredisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(connectionFactory);

        // 使用StringRedisSerializer来序列化和反序列化redis的key值
        redisTemplate.setKeySerializer(new StringRedisSerializer());

        // 使用GenericJackson2JsonRedisSerializer来序列化和反序列化redis的value值
        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        redisTemplate.setValueSerializer(jsonRedisSerializer);

        // Hash的key也采用StringRedisSerializer的序列化方式
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        // Hash的value也采用GenericJackson2JsonRedisSerializer的序列化方式
        redisTemplate.setHashValueSerializer(jsonRedisSerializer);

        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

3.3 配置 application.properties

spring.redis.host=localhost
spring.redis.port=6379
# spring.redis.password=
spring.redis.database=0
spring.redis.timeout=3000

3.4 修改 UserService 实现类

修改 userservice.impl 中的登录方法:

@Override
public User login(String username, String password) {
    // 根据用户名查询用户
    User user = userMapper.selectByUsername(username);

    // 从缓存中读取登录的数据
    User cachedUser = (User) redisTemplate.opsForValue().get("user:" + user.getUid().toString());
    if(cachedUser != null) {
        System.out.print("缓存命中!登录成功!");
    } else {
        System.out.print("未寻找到缓存,准备使用mysql查询");
    }

    // 如果用户存在且密码匹配,则登录成功,通过数据库,并且缓存redis
    if (user != null && password.equals(user.getPassword())) {
        redisTemplate.opsForValue().set("user:" + user.getUid().toString(), user);
        return user;
    }

    // 登录失败
    return null;
}

4. 登录流程演示(测试Redis)

当用户首次登录时,需要从 MySQL 查询用户信息,之后可以缓存登录的数据。

4.1 第一次登录

第一次登录需要查询 MySQL:

4.2 第二次登录

第二次登录时,已缓存登录数据:

5. 清除 Redis 缓存

如果需要清除 Redis 缓存数据,可以使用以下命令:

# 连接到 Redis
redis-cli

# 清除当前数据库缓存
flushdb

# 清除所有缓存
FLUSHALL

                

相关文章:

  • 春芽儿智能跳绳:以创新技术引领运动健康新潮流
  • C++(18)—类和对象(下) ③static成员
  • 再看自适应RAG方法:SEAKR|PIKE-RAG|DeepRAG
  • skynet.dispatch可用的已注册的协议类型
  • 前端开发中的单引号(‘ ‘)、双引号( )和反引号( `)使用
  • 【AIGC】零样本学习方法综述(TPAMI 2023 研究综述)
  • java面向对象练习
  • Linux进程控制(五)之做一个简易的shell
  • 玄机靶场:apache日志分析
  • 4.7-python request库的基本使用
  • 【区块链安全 | 第三十三篇】备忘单
  • 其它理论原则
  • 从存储仓库到智能中枢:AI时代NAS的进化革命
  • Android使用声网SDK实现音视频互动(RTC)功能
  • 【算法应用】基于融合A星-粒子群算法求解六边形栅格地图路径规划
  • 分行经理个人简历
  • scala课后总结(7)
  • 虚引用软引用强引用弱引用
  • 多模态大语言模型arxiv论文略读(四)
  • 【Django】教程-11-ajax弹窗实现增删改查
  • 昆明网页制作开发/哈尔滨seo优化
  • 电商网站开发公司哪家好/站内营销推广方案
  • 哪里可以做购物网站/网站域名解析ip
  • 阳江市做网站/网络热词英语
  • 如何建设网站/萝卜建站
  • 重庆 企业网站建设/西安网是科技发展有限公司