备注:记录一次spring-boot + redis 配置redis.database后,仍然使用db0默认库的情况。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- redis依赖commons-pool 这个依赖一定要添加 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
spring:
redis:
host: xxxxx
port: 6379
password: xxxx
database: 1
jedis:
pool:
max-active: 10
max-idle: 10
min-idle: 0
@Configuration
public class RedisConfig {
/**
* @Author: Huey
* @Date: 2024/1/12 18:24
* @Params:
* @Return:
* @Description: 初始化设置redis序列化类型,否则会出现乱码
**/
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
//使用fastjson序列化
FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);
// value值的序列化采用fastJsonRedisSerializer
template.setValueSerializer(fastJsonRedisSerializer);
template.setHashValueSerializer(fastJsonRedisSerializer);
// key的序列化采用StringRedisSerializer
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
完成以上配置,即redis已经正常集成进入项目。
<!-- redis便捷分布式锁管理 -->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>${redisson.version}</version>
</dependency>
@Configuration
public class RedissionConfig {
@Value("${spring.redis.host}")
private String redisHost;
@Value("${spring.redis.password}")
private String password;
@Value("${spring.redis.port}")
private int port;
@Value("${spring.redis.database}")
private int database;
@Bean
public RedissonClient getRedisson() {
Config config = new Config();
config.useSingleServer().
setAddress("redis://" + redisHost + ":" + port)
.setPassword(password)
config.setCodec(new JsonJacksonCodec());
return Redisson.create(config);
}
}
完成以上配置,即可正常使用了
@Autowired
private RedissonClient redissonClient;
RLock rLock = redissonClient.getLock(lockName);
if (rLock.isLocked()) {
//当前锁正在使用,当前用户还在同步订单,不处理业务
logger.info("method handleReceiptMsg重复加锁,请求入参:{},不处理业务,当前锁状态:{}", JSONObject.toJSONString(payRqst), rLock.isLocked());
return Result.error("handleReceiptMsg重复加锁");
}
boolean isLocked = rLock.tryLock(RedisLockNameConstants.ORDER_SYNC_LOCK_TIME, TimeUnit.SECONDS);
??????如果是单独仅集成redis,database 配置是肯定生效的,因为没有影响,这里记录一个遇到的情景:
??????即:当spring-boot集成redis后,同时集成redission使用redis锁相关管理插件,此时,配置了RedissonClient,注入了Config配置,即第二部中的代码部分。而第一步中集成redis时,使用redistemplate仅仅只是对其做了序列化,至于redistemplate加载的配置,全靠程序默认加载,那么这里就涉及了一个加载顺序问题。
??????springboot 的 @Configuration 也会默认加载redis的配置,步骤二中构建RedissonClient时候,也构建了Config对象,这个里面会覆盖掉RedisConfig里的配置,所以,在构建RedissonClient时候,设置database即可生效。
@Bean
public RedissonClient getRedisson() {
Config config = new Config();
config.useSingleServer().
setAddress("redis://" + redisHost + ":" + port)
.setPassword(password)
//指定redis db库
.setDatabase(database);
config.setCodec(new JsonJacksonCodec());
return Redisson.create(config);
}