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/
至此整体需求满足,剩下的就是应用到实际的项目里进行测试。