Maison  >  Article  >  base de données  >  Comment SpringBoot intègre le code de vérification du cache Redis

Comment SpringBoot intègre le code de vérification du cache Redis

王林
王林avant
2023-05-27 21:16:23711parcourir

1. Introduction

Redis est un magasin de structures de données en mémoire open source (sous licence BSD), utilisé comme base de données, cache et courtier de messages.

Traduction : Redis est un système de stockage de structures de données en mémoire open source. , il peut être utilisé comme : base de données, cache et middleware de messages.

Redis est une base de données clé-valeur open source haute performance développée en langage C. Les données officiellement fournies peuvent atteindre **100 000+** QPS.

QPS (Requêtes par seconde), le nombre de requêtes par seconde. (Encyclopédie Baidu)

Il stocke un riche ensemble de types de valeurs et est également appelé base de données NoSQL structurée.

NoSQL (Not only SQL), pas seulement SQL, fait référence aux bases de données non relationnelles en général.

La base de données NoSQL n'est pas destinée à remplacer les bases de données relationnelles, mais à les compléter.

Base de données relationnelle (SGBDR)

  • MySQL

  • Oracle

  • DB2

  • SQL Server

Base de données non relationnelle (NoSQL)

  • Redis

  • Mongo db

  • MemCached

Scénario d'application Redis

  • caching

  • file d'attente des tâches

  • file d'attente des messages

  • verrouillage distribué

2. Introduction

Officiellement recommandé par Reddis Il existe trois types de clients Java : Jedis, Lettuce et Redisson.

Spring intègre le client Redis et fournit Spring Data Redis.

Le Starter correspondant est également fourni dans le projet Spring Boot, à savoir spring-boot-starter-data-redis.

Spring Data Redis est utilisé directement ici, et le processus de téléchargement et d'installation de Redis n'est pas affiché.

3. Configuration préliminaire

3.1. Importation de coordonnées

Après avoir créé le projet Spring Boot, ajoutez les coordonnées dépendantes de spring-boot-start-data-redis dans pom.xmlspring-boot-start-data-redis的依赖坐标

<!--Spring Data Redis-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

3.2、配置文件

这里忽略了其他的配置如MySQL这些,只突出Redis的配置信息

spring: 
  # Redis配置
  redis:
    host: localhost
    port: 6379
    # 根据自己设置的密码决定
    password: 123456
    # 操作0号数据库,默认有16个数据库
    database: 0
    jedis:
      pool:
        max-active: 8 # 最大连接数
        max-wait: 1ms # 连接池最大阻塞等待时间
        max-idle: 4   # 连接池中的最大空闲连接
        min-idle: 0   # 连接池中的最小空闲连接

3.3、配置类

使用专门的客户端接口操作,将 Redis 整合到 Spring Boot 中。这里采用的是 RedisTemplate 工具类,该工具类由 SpringBoot 框架提供。

RedisTemplate 在处理 key 和 value 时,会对其进行序列化操作,这就会导致一些问题。

比如:输入的 key 值是 city,但 redis 获得到的 key 值却是 xac]xedx00x05tx00x04city

/**
 * @classname RedisConfig
 * @description Redis配置类,更换key的默认序列化器
 * @author xBaozi
 * @date 19:04 2022/7/2
 **/
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setConnectionFactory(connectionFactory);
        return redisTemplate;
    }
}

3.2. . Fichier de configuration

Les autres configurations telles que MySQL sont ignorées ici, et seules les informations de configuration de Redis sont mises en évidence

spring :
# Configuration Redis
redis :
hôte : localhost Port : 6379
# Déterminer en fonction du mot de passe que vous avez défini
Mot de passe : 123456
# Utiliser la base de données n° 0, il y a 16 bases de données par défaut
Base de données : 0
jedis :
pool :
max-active : 8 # Nombre maximum de connexions
max-wait : 1ms # Temps d'attente maximum de blocage du pool de connexions
max- ralenti : 4 # Pool de connexions La connexion inactive maximale
        min-idle : 0   # La connexion inactive minimale dans le pool de connexions

3.3. La classe de configuration

utilise des opérations d'interface client spécialisées pour intégrer Redis dans Démarrage de printemps. La classe d'outils RedisTemplate est utilisée ici, qui est fournie par le framework SpringBoot.

RedisTemplate sérialisera la clé et la valeur lors de leur traitement, ce qui entraînera certains problèmes.

Comment SpringBoot intègre le code de vérification du cache RedisPar exemple : la valeur de la clé d'entrée est city, mais la valeur de la clé obtenue par redis est xac]xedx00x05tx00x04city.

Par conséquent, une classe de configuration spéciale est nécessaire pour traiter spécifiquement les problèmes causés par le traitement de sérialisation par défaut de RedisTemplate.

Il est à noter qu'ici un nouveau sérialiseur est rechargé pour remplacer le sérialiseur d'origine, ce qui prouve qu'il avait à l'origine son propre sérialiseur par défaut JdkSerializationRedisSerializer. Comment SpringBoot intègre le code de vérification du cache Redis

@PostMapping("/sendMsg")
public Result<String> sendMsg(@RequestBody User user, HttpSession session) {
    // 获取需要发送短信的手机号
    String userPhone = user.getPhone();
    if (StringUtils.isNotEmpty(userPhone)) {
        // 随机生成4位验证码
        String checkCode = ValidateCodeUtils.generateValidateCode4String(4);
        // 将生成的验证码保存到Redis中并设置有效期五分钟
        redisTemplate.opsForValue().set(userPhone, checkCode, 5, TimeUnit.MINUTES);
        return Result.success(checkCode);
    }
    return Result.error("短信发送错误");
}

4. Fonctionnement Java de Redis🎜🎜Étant donné que le code est relativement privé ici (principalement parce que je suis trop paresseux pour trier les interfaces de génération de code de connexion et de vérification), j'utiliserai directement la classe de test pour la démonstration ici. 🎜🎜Envoyer le code de vérification🎜
@PostMapping("/login")
public Result<User> login(@RequestBody Map map, HttpSession session) {
    log.info("map: {}", map);
    // 获取用户输入信息
    String phone = (String)map.get("phone");
    String code = (String)map.get("code");
    // 从Redis中取出验证码
    String checkCode = redisTemplate.opsForValue().get(phone);
    // 比对验证码是否一致
    if (StringUtils.isNotEmpty(checkCode) && checkCode.equals(code.toLowerCase())) {
        // 将用户id存放到session中
        session.setAttribute("user", user.getId());
        // 登录成功,删除Redis中的验证码
        redisTemplate.delete(phone);
        // 将用户信息返回到前端
        return Result.success(user);
    }
    return Result.error("登录失败,请检查手机号或验证码是否正确");
}
🎜🎜🎜🎜Entrez le code de vérification pour vous connecter🎜rrreee🎜🎜🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer