备注:记录一次spring-boot + redis 配置redis.database后,仍然使用db0默认库的情况。
springboot集成redis及相关问题
- 1. spring boot集成redis
- redis集成依赖:
- redis配置
- 序列化
- 2. 集成redission redis分布式锁等快捷管理工具
- 集成依赖
- 配置注入
- 示例
- 3. 配置redis database不生效
1. spring boot集成redis
redis集成依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency>
redis配置
spring:redis:host: xxxxxport: 6379password: xxxxdatabase: 1jedis:pool:max-active: 10max-idle: 10min-idle: 0
序列化
@Configurationpublic class RedisConfig {/** * @Author: Huey * @Date: 2024/1/12 18:24 * @Params: * @Return: * @Description: 初始化设置redis序列化类型,否则会出现乱码 **/@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<String, Object> template = new RedisTemplate<>();//使用fastjson序列化FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);// value值的序列化采用fastJsonRedisSerializertemplate.setValueSerializer(fastJsonRedisSerializer);template.setHashValueSerializer(fastJsonRedisSerializer);// key的序列化采用StringRedisSerializertemplate.setKeySerializer(new StringRedisSerializer());template.setHashKeySerializer(new StringRedisSerializer());template.setConnectionFactory(redisConnectionFactory);return template;}}
完成以上配置,即redis已经正常集成进入项目。
2. 集成redission redis分布式锁等快捷管理工具
集成依赖
<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>${redisson.version}</version></dependency>
配置注入
@Configurationpublic 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;@Beanpublic RedissonClient getRedisson() {Config config = new Config();config.useSingleServer().setAddress("redis://" + redisHost + ":" + port).setPassword(password)config.setCodec(new JsonJacksonCodec());return Redisson.create(config);}}
示例
完成以上配置,即可正常使用了
@Autowiredprivate 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);
3. 配置redis database不生效
如果是单独仅集成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);}