springboot Jetcache redis集群接入,密码带@怎么办

2,825 阅读1分钟

jetcache官方文档 - 使用lettuce客户端连接redis

  statIntervalMinutes: 1 #统计间隔
  areaInCacheName: false
  local:
    default: #默认area
      type: caffeine
      keyConvertor: fastjson
  remote:
    default:
      type: redis.lettuce #使用lettuce
      keyConvertor: fastjson
      valueEncoder: java
      valueDecoder: java
      poolConfig:
        minIdle: 1
        maxIdle: 50
        maxTotal: 1000
        maxWait: 1000  
#     uri: ['redis://password@192.168.14.231:6379/0','redis://password@192.168.14.232:6379/0','redis://password@192.168.14.233:6379/0']
      uri:
        - redis://password@192.168.14.231:6379/0  #redis://密码@IP:端口/库
        - redis://password@192.168.14.232:6379/0
        - redis://password@192.168.14.233:6379/0
      readFrom: masterPreferred #master优先

本来是想通过配置文件接入的,但是uri的格式密码和ip是通过@来分割的,但是我的redis集群密码本身就带一个@,会导致uri解析失败,然后用他对象配置的方式

    @Bean
    public RedisClient redisClient(){
        RedisClient client = RedisClient.create("redis://127.0.0.1");
        client.setOptions(ClientOptions.builder().
               disconnectedBehavior(ClientOptions.DisconnectedBehavior.REJECT_COMMANDS)
               .build());
        return client;
    }

但是官网上的配置只是单个redis,并不支持集群,网上也没找到redis集群应该怎么配置 因为jetcache是通过lettuce连接redis,再了解lettuce,再瞄了一眼jetcache的源码后,猜测将RedisClient替换为RedisClusterClient应该就可以实现

@Configuration
@EnableMethodCache(basePackages = "com.company.mypackage")
@EnableCreateCacheAnnotation
public class JetCacheConfig {

//    @Bean
//    public RedisClient redisClient(){
//        RedisClient client = RedisClient.create("redis://127.0.0.1");
//        client.setOptions(ClientOptions.builder().
//                disconnectedBehavior(ClientOptions.DisconnectedBehavior.REJECT_COMMANDS)
//                .build());
//        return client;
//    }

    @Bean
    public RedisClusterClient redisClient(){
        ArrayList<RedisURI> list = new ArrayList<>();
        RedisURI redisURI = new RedisURI();
        redisURI.setHost("127.0.0.1");
        redisURI.setPassword("XXXX@XXXX");
        redisURI.setPort(1234);
        list.add(redisURI);
        RedisClusterClient client = RedisClusterClient.create(list);
        client.setOptions(ClusterClientOptions.builder().
                disconnectedBehavior(ClientOptions.DisconnectedBehavior.REJECT_COMMANDS)
                .build());
        return client;
    }

    @Bean
    public SpringConfigProvider springConfigProvider() {
        return new SpringConfigProvider();
    }

    @Bean
    public GlobalCacheConfig config(SpringConfigProvider configProvider, RedisClusterClient redisClient){
        Map localBuilders = new HashMap();
        EmbeddedCacheBuilder localBuilder = LinkedHashMapCacheBuilder
                .createLinkedHashMapCacheBuilder()
                .keyConvertor(FastjsonKeyConvertor.INSTANCE);
        localBuilders.put(CacheConsts.DEFAULT_AREA, localBuilder);

        Map remoteBuilders = new HashMap();
        RedisLettuceCacheBuilder remoteCacheBuilder = RedisLettuceCacheBuilder.createRedisLettuceCacheBuilder()
                .keyConvertor(FastjsonKeyConvertor.INSTANCE)
                .valueEncoder(JavaValueEncoder.INSTANCE)
                .valueDecoder(JavaValueDecoder.INSTANCE)
                .redisClient(redisClient);
        remoteBuilders.put(CacheConsts.DEFAULT_AREA, remoteCacheBuilder);

        GlobalCacheConfig globalCacheConfig = new GlobalCacheConfig();
        //globalCacheConfig.setConfigProvider(configProvider);//for jetcache <=2.5
        globalCacheConfig.setLocalCacheBuilders(localBuilders);
        globalCacheConfig.setRemoteCacheBuilders(remoteBuilders);
        globalCacheConfig.setStatIntervalMinutes(15);
        globalCacheConfig.setAreaInCacheName(false);

        return globalCacheConfig;
    }
}

最后成功接入jetcache缓存,也不用将redis集群的密码改掉