Redis密码在springboot中自定义加解密实践

 更新时间:2026年01月12日 09:30:56   作者:MartinYangHJ  
文章介绍了在Spring Boot项目中自定义配置Redis密码的加解密方法,通过在`application.yml`文件中配置信息,并在`RedisConfig`类中实现加解密逻辑

Redis密码在springboot自定义加解密

1.application.yml文件配置信息

spring:
  # redis 配置
  redis:
    # 地址
    host: 192.168.1.xxx
    # 端口,默认为6379
    port: 6379
    # 数据库索引
    database: 0
    # 密码,DES加密后,有key值,此处只作为例子
    password: 1E903BC217660491
    # 连接超时时间
    timeout: 10s
    lettuce:
      pool:
        # 连接池中的最小空闲连接
        min-idle: 0
        # 连接池中的最大空闲连接
        max-idle: 8
        # 连接池的最大数据库连接数
        max-active: 8
        # #连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1ms

2.RedisConfig中代码

package com.framework.config;

import com.common.utils.sign.DESUtil;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;

/**
 * redis配置
 * 
 * @author elane
 */
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport
{
    private final Environment environment;
    public RedisConfig(Environment environment){
        this.environment=environment;
    }

    @Bean
    public RedisConnectionFactory myLettuceConnectionFactory(){
        RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(environment.getProperty("spring.redis.host"),Integer.parseInt(environment.getProperty("spring.redis.port")));
        redisStandaloneConfiguration.setDatabase(Integer.parseInt(environment.getProperty("spring.redis.database")));
        //获取application.yml 中的密码(密文)
        String password = environment.getProperty("spring.redis.password");
        //解密密码并停驾到配置中
        String pwd=DESUtil.encrypt("111111");//此处用于生成加密后的密码,配置在配置文件中
        redisStandaloneConfiguration.setPassword(DESUtil.decrypt(password));
        return new LettuceConnectionFactory(redisStandaloneConfiguration);
    }

    @Bean
    @SuppressWarnings(value = { "unchecked", "rawtypes" })
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory)
    {
        //connectionFactory获取到的密码就是解密后的密码
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);

        FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class);

        ObjectMapper mapper = new ObjectMapper();
        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
        serializer.setObjectMapper(mapper);

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

        // Hash的key也采用StringRedisSerializer的序列化方式
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(serializer);

        template.afterPropertiesSet();
        return template;
    }

    @Bean
    public DefaultRedisScript<Long> limitScript()
    {
        DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();
        redisScript.setScriptText(limitScriptText());
        redisScript.setResultType(Long.class);
        return redisScript;
    }

    /**
     * 限流脚本
     */
    private String limitScriptText()
    {
        return "local key = KEYS[1]\n" +
                "local count = tonumber(ARGV[1])\n" +
                "local time = tonumber(ARGV[2])\n" +
                "local current = redis.call('get', key);\n" +
                "if current and tonumber(current) > count then\n" +
                "    return tonumber(current);\n" +
                "end\n" +
                "current = redis.call('incr', key)\n" +
                "if tonumber(current) == 1 then\n" +
                "    redis.call('expire', key, time)\n" +
                "end\n" +
                "return tonumber(current);";
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Redis通过scan查找不过期的 key(方法详解)

    Redis通过scan查找不过期的 key(方法详解)

    SCAN 命令是一个基于游标的迭代器,每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程,对Redis scan 查找 key相关知识感兴趣的朋友一起看看吧
    2021-08-08
  • redis 哨兵集群搭建的实现

    redis 哨兵集群搭建的实现

    本文主要介绍了redis 哨兵集群搭建的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • 简介Redis中的showlog功能

    简介Redis中的showlog功能

    这篇文章主要介绍了简介Redis中的showlog功能,作者同时对比了DEL命令的性能,需要的朋友可以参考下
    2015-06-06
  • Redis删除缓存失败的原因和解决方案

    Redis删除缓存失败的原因和解决方案

    本文讨论了数据库操作成功但缓存删除失败时,线上环境下的应对策略,提出了一种更稳定的方法,包括主流程写库后再删除缓存、删除失败进入重试队列、超过重试上限进入死信队列并触发告警和补偿等措施,需要的朋友可以参考下
    2026-04-04
  • Redis全量同步和增量同步原理

    Redis全量同步和增量同步原理

    主从第一次同步是全量同步:也就是说,当你主从节点连接建立后,需要执行一次全量同步,但如果slave重启后同步,此时slave重启后,slave节点和master节点的数据之间有落后,因此需要进行增量同步,感兴趣的同学可以参考阅读
    2023-04-04
  • Redis中的过期策略和淘汰策略使用详解

    Redis中的过期策略和淘汰策略使用详解

    这篇文章主要介绍了Redis中的过期策略和淘汰策略使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • Redis集群水平扩展、集群中添加以及删除节点的操作

    Redis集群水平扩展、集群中添加以及删除节点的操作

    这篇文章主要介绍了Redis集群水平扩展、集群中添加以及删除节点的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Redis 搭建主从集群的操作指南

    Redis 搭建主从集群的操作指南

    单节点的 Redis 并发能力有限,要进一步提高 Redis 的并发能力,就需要搭建主从集群,实现读写分离,这篇文章主要给大家介绍了Redis搭建主从集群的操作指南,需要的朋友可以参考下
    2023-08-08
  • 使用Redis实现JWT令牌主动失效机制

    使用Redis实现JWT令牌主动失效机制

    JWT是一种轻量级的身份验证和授权机制,它是一种 JSON 格式的数据串,通常用于客户端和服务端之间的单点登录(Single Sign-On, SSO)场景,本文给大家介绍了如何使用Redis来实现JWT令牌主动失效机制,需要的朋友可以参考下
    2024-08-08
  • Redis 在真实世界的 5 个用法

    Redis 在真实世界的 5 个用法

    Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API这篇文章主要介绍了Redis 在真实世界的 5 个用法,需要的朋友可以参考下
    2018-03-03

最新评论