Springboot 利用 Jedis代码动态配置Redis

Springboot 利用 Jedis代码动态配置Redis

项目需求,甲方需求是处于安全的目的不想让properties里的部分配置信息体现在文件中,而且可能在之后需要通过页面修改对应的配置,所以出的解决方案就是部分配置信息存储在数据库里,然后利用@Bean注入的方式将其注入到springboot中,然后直接代码配置,例如:Redis。

环境

  • Java 1.8
  • Springboot 2.0
  • MySQL 5.7
  • Redis 3.0

pom

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.21</version>
</dependency>
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.1.1</version>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
</dependency>

创建一个对象,用于保存Redis相关配置信息,这里简单设置了url和port

public class RedisConfig {
    private String url;
    private int port;
    //省略get set
}

从数据库获取对应的配置信息,因为数据库的设计有点问题,结构为id,keyName,value,所以暂时获取一个配置url

@Mapper
public interface ConfiguresMapper {
    @Select("SELECT * FROM configures WHERE keyName = #{key}")
    Configures getOneByKey(@Param("key") String key);
}

然后就是在入口文件进行@Bean的注入,这样就可以在全局使用@Autowired进行自动注入引入

@SpringBootApplication
public class DemoApplication {
    @Autowired
    private ConfiguresMapper configuresMapper;

    @Bean
    public RedisConfig configures() {
        //从数据库获取url,也就是host
        Configures configures = configuresMapper.getOneByKey("redisURL");
        RedisConfig redisConfig = new RedisConfig();
        //直接设置port,实际是从数据库获取,等待数据表结构重新设计后,进行更改
        redisConfig.setPort(6379);
        redisConfig.setUrl(configures.getValue());
        return redisConfig;
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

至此注入的过程就完成,接下来就是引入使用。

使用Jedis进行操作Redis

import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

@Configuration
@EnableAutoConfiguration
public class RedisConfig {
    private static final Logger logger = LoggerFactory.getLogger(RedisConfig.class);
    //因为命名出现了重复,所以需要注入引入的路径
    @Autowired
    private com.example.demo.Entity.RedisConfig redisConfig;
    @Bean
    public JedisPoolConfig getRedisConfig() {
        JedisPoolConfig config = new JedisPoolConfig();
        return config;
    }

    @Bean
    public JedisPool getJedisPool() {
        JedisPoolConfig config = getRedisConfig();
        logger.info("---------"+redisConfig.getUrl());
        logger.info("---------"+redisConfig.getPort());
        JedisPool jp = new JedisPool(config, redisConfig.getUrl(), redisConfig.getPort());
        return jp;
    }
}

Jedis操作

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

@Service
public class RedisService {
    private static final Logger logger = LoggerFactory.getLogger(RedisService.class);
    @Autowired
    private JedisPool jedisPool;

    public String get(String key) {
        Jedis jedis = null;
        String result = null;
        try {
            jedis = jedisPool.getResource();
            String str = jedis.get(key);
            logger.info("Redis get success - " + key + ", value:" + str);
            result = str;
        } catch (Exception e) {
            logger.error(e.getMessage());
        }
        return result;
    }
}

这里一个问题是,没有释放jedis,所以需要添加释放的操作

写一个Controller进行测试

@RestController
@RequestMapping("/test")
public class TestController{
    @Autowired
    private RedisConfig redisConfig;
    @Autowired
    private RedisService redisService;

    @RequestMapping(value = {"/", ""})
    public String hellTask() {
        Configures configures = new Configures();
        int port = redisConfig.getPort();
        String url = redisConfig.getUrl();
        String value = redisService.get("ket");
        return "Port: " + port + "-----" + url + "---value---" + value;
    }
}

然后访问 localhost:8080/test/
这里写图片描述

至此整体需求满足,剩下的就是应用到实际的项目里进行测试。

猜你喜欢

转载自blog.csdn.net/xinxin6193/article/details/79972197