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

打印 上一主题 下一主题

主题 1872|帖子 1872|积分 5616

1. 项目源代码

为了方便演示,以及大家上手实行,我搭建了一个简单的注册登录的后台,在不加 Redis 的环境下的源代码如下
  1. 通过网盘分享的文件:study-无redis.zip
  2. 链接: https://pan.baidu.com/s/1etc29in_6q8CDOFm-Gb7Nw?pwd=yuer 提取码: yuer
复制代码
2. 数据库结构

数据库结构如下所示:
  1. /*
  2. Navicat Premium Data Transfer
  3. Source Server         : localhost_3306
  4. Source Server Type    : MySQL
  5. Source Server Version : 80016
  6. Source Host           : localhost:3306
  7. Source Schema         : redis
  8. Target Server Type    : MySQL
  9. Target Server Version : 80016
  10. File Encoding         : 65001
  11. Date: 07/04/2025 10:55:27
  12. */
  13. SET NAMES utf8mb4;
  14. SET FOREIGN_KEY_CHECKS = 0;
  15. -- ----------------------------
  16. -- Table structure for usr
  17. -- ----------------------------
  18. DROP TABLE IF EXISTS `usr`;
  19. CREATE TABLE `usr`  (
  20.   `uid` int(11) NOT NULL,
  21.   `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  22.   `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  23.   PRIMARY KEY (`uid`) USING BTREE
  24. ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
  25. -- ----------------------------
  26. -- Records of usr
  27. -- ----------------------------
  28. INSERT INTO `usr` VALUES (1, 'yuer', 'yuerpass');
  29. INSERT INTO `usr` VALUES (686, '123', '456');
  30. SET FOREIGN_KEY_CHECKS = 1;
复制代码
3. Redis集成

接下来我们添加 Redis 支持:
3.1 添加 Redis 依赖

  1.                 <!-- Redis依赖 -->
  2.                 <dependency>
  3.                         <groupId>org.springframework.boot</groupId>
  4.                         <artifactId>spring-boot-starter-data-redis</artifactId>
  5.                 </dependency>
  6.                 <!-- 添加Jackson序列化依赖 -->
  7.                 <dependency>
  8.                         <groupId>com.fasterxml.jackson.core</groupId>
  9.                         <artifactId>jackson-databind</artifactId>
  10.                 </dependency>
复制代码
3.2 配置 Redis

在 config 包下新建一个 RedisConfig 类:

  1. package com.yuer.config;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.data.redis.connection.RedisConnectionFactory;
  5. import org.springframework.data.redis.core.RedisTemplate;
  6. import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
  7. import org.springframework.data.redis.serializer.StringRedisSerializer;
  8. @Configuration
  9. public class RedisConfig {
  10.     @Bean
  11.     public RedisTemplateredisTemplate(RedisConnectionFactory connectionFactory) {
  12.         RedisTemplateredisTemplate = new RedisTemplate<>();
  13.         redisTemplate.setConnectionFactory(connectionFactory);
  14.         // 使用StringRedisSerializer来序列化和反序列化redis的key值
  15.         redisTemplate.setKeySerializer(new StringRedisSerializer());
  16.         // 使用GenericJackson2JsonRedisSerializer来序列化和反序列化redis的value值
  17.         GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
  18.         redisTemplate.setValueSerializer(jsonRedisSerializer);
  19.         // Hash的key也采用StringRedisSerializer的序列化方式
  20.         redisTemplate.setHashKeySerializer(new StringRedisSerializer());
  21.         // Hash的value也采用GenericJackson2JsonRedisSerializer的序列化方式
  22.         redisTemplate.setHashValueSerializer(jsonRedisSerializer);
  23.         redisTemplate.afterPropertiesSet();
  24.         return redisTemplate;
  25.     }
  26. }
复制代码
3.3 配置 application.properties

  1. spring.redis.host=localhost
  2. spring.redis.port=6379
  3. # spring.redis.password=
  4. spring.redis.database=0
  5. spring.redis.timeout=3000
复制代码
3.4 修改 UserService 实现类

修改 userservice.impl 中的登录方法:
  1. @Override
  2. public User login(String username, String password) {
  3.     // 根据用户名查询用户
  4.     User user = userMapper.selectByUsername(username);
  5.     // 从缓存中读取登录的数据
  6.     User cachedUser = (User) redisTemplate.opsForValue().get("user:" + user.getUid().toString());
  7.     if(cachedUser != null) {
  8.         System.out.print("缓存命中!登录成功!");
  9.     } else {
  10.         System.out.print("未寻找到缓存,准备使用mysql查询");
  11.     }
  12.     // 如果用户存在且密码匹配,则登录成功,通过数据库,并且缓存redis
  13.     if (user != null && password.equals(user.getPassword())) {
  14.         redisTemplate.opsForValue().set("user:" + user.getUid().toString(), user);
  15.         return user;
  16.     }
  17.     // 登录失败
  18.     return null;
  19. }
复制代码
4. 登录流程演示(测试Redis)

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

第一次登录需要查询 MySQL:

4.2 第二次登录

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

5. 扫除 Redis 缓存

如果需要扫除 Redis 缓存数据,可以使用以下下令:
  1. # 连接到 Redis
  2. redis-cli
  3. # 清除当前数据库缓存
  4. flushdb
  5. # 清除所有缓存
  6. FLUSHALL
复制代码
[code][/code]
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莱莱

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表