// Path: jbase-cache/src/main/java/com/jayqqaa12/jbase/cache/core/CacheConst.java
// public static final String REDIS_MODE_CLUSTER="cluster";
// 
// Path: jbase-cache/src/main/java/com/jayqqaa12/jbase/cache/core/Cache.java
// public interface Cache {
// 
//   CacheObject get(String key) throws CacheException;
// 
// 
//   void set(String key, CacheObject value) throws CacheException;
// 
// 
//   void set(String key, CacheObject value, int expire) throws CacheException;
// 
//   void delete(String key) throws CacheException;
// 
// 
// }
// 
// Path: jbase-cache/src/main/java/com/jayqqaa12/jbase/cache/core/CacheConfig.java
// @Data
// public class CacheConfig {
// 
//   /**
//    * 缓存提供者 可选
//    * <p>
//    * com.jayqqaa12.jbase.cache.provider.NullCacheProvider com.jayqqaa12.jbase.cache.provider.caffeine.CaffeineCacheProvider
//    * com.jayqqaa12.jbase.cache.provider.lettuce.LettuceCacheProvider
//    * <p>
//    * 根据加入顺序确定缓存级别 可自定义CacheProvider 进行扩展
//    */
//   private List<String> providerClassList = new ArrayList<>();
// 
//   private String cacheSerializerClass = "com.jayqqaa12.jbase.cache.serializer.FastJsonCacheSerializer";
// 
//   /**
//    * 自动加载的线程数
//    */
//   private int autoLoadThreadCount = 5;
// 
//   // 具体的缓存中间件相关配置
// 
//   private String redisMode = CacheConst.REDIS_MODE_SINGLE;
// 
//   private LettuceConfig lettuceConfig = new LettuceConfig();
// 
//   private NotifyConfig notifyConfig = new NotifyConfig();
// 
//   private Map<String, CaffeineConfig> caffeineConfig = new HashMap<>();
// 
//   @Data
//   public static class CaffeineConfig {
// 
//     private int size = 10_000;
//     private int expire = 0;
// 
//   }
// 
//   @Data
//   public static class NotifyConfig {
// 
//     private String notifyClass = "com.jayqqaa12.jbase.cache.notify.NullNotify";
//     private String notifyTopic = CacheConst.DEFAULT_TOPIC;
// 
//     private String host;
//     private String groupId = CacheConst.DEFAULT_TOPIC;
// 
// 
//   }
// 
// 
//   @Data
//   public class LettuceConfig {
// 
//     /**
//      * 命名空间 可以用来区分不同 项目
//      */
//     private String namespace = CacheConst.NAMESPACE;
//     /**
//      * single 单点 cluster 集群
//      */
//     private String schema = CacheConst.REDIS_MODE_SINGLE;
//     private String hosts = "127.0.0.1:6379";
//     private String password = "";
//     private int database = 0;
//     private int maxTotal = 100;
//     private int maxIdle = 10;
//     private int minIdle = 10;
//     private int timeout = 10000;
//     private int clusterTopologyRefresh = 3000;
// 
// 
//   }
// 
// 
// }
// 
// Path: jbase-cache/src/main/java/com/jayqqaa12/jbase/cache/provider/CacheProvider.java
// public interface CacheProvider {
// 
//   void init(CacheConfig cacheConfig);
// 
//   Cache buildCache(String region,int expire)  ;
//   Cache buildCache(String region )  ;
// 
// 
//   void stop();
// 
//    
// 
// }
// 
// Path: jbase-cache/src/main/java/com/jayqqaa12/jbase/cache/serializer/CacheSerializer.java
// public interface CacheSerializer {
// 
//     byte[] serialize(Object obj)  ;
// 
//     Object deserialize(byte[] bytes)  ;
// 
// }
// 
// Path: jbase-cache/src/main/java/com/jayqqaa12/jbase/cache/util/CacheException.java
// public class CacheException extends RuntimeException {
// 
//     private static final long serialVersionUID = -5112528854998647834L;
// 
//     public CacheException(String s) {
//         super(s);
//     }
// 
//     public CacheException(String s, Throwable e) {
//         super(s, e);
//     }
// 
//     public CacheException(Throwable e) {
//         super(e);
//     }
// 
// }


import static com.jayqqaa12.jbase.cache.core.CacheConst.REDIS_MODE_CLUSTER;
import com.jayqqaa12.jbase.cache.core.Cache;
import com.jayqqaa12.jbase.cache.core.CacheConfig;
import com.jayqqaa12.jbase.cache.provider.CacheProvider;
import com.jayqqaa12.jbase.cache.serializer.CacheSerializer;
import com.jayqqaa12.jbase.cache.util.CacheException;
import io.lettuce.core.AbstractRedisClient;
import io.lettuce.core.RedisClient;
import io.lettuce.core.RedisURI;
import io.lettuce.core.api.StatefulConnection;
import io.lettuce.core.cluster.ClusterClientOptions;
import io.lettuce.core.cluster.ClusterTopologyRefreshOptions;
import io.lettuce.core.cluster.RedisClusterClient;
import io.lettuce.core.support.ConnectionPoolSupport;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
package com.jayqqaa12.jbase.cache.provider.lettuce;





/**
 * @author jayqqaa12
 */
@Slf4j
public class LettuceCacheProvider implements CacheProvider {

  private static AbstractRedisClient redisClient;
  private GenericObjectPool<StatefulConnection<String, byte[]>> pool;

  private LettuceByteCodec codec = new LettuceByteCodec();

  private final ConcurrentHashMap<String, Cache> regions = new ConcurrentHashMap<>();
// Path: jbase-cache/src/main/java/com/jayqqaa12/jbase/cache/core/CacheConst.java
// public static final String REDIS_MODE_CLUSTER="cluster";
// 
// Path: jbase-cache/src/main/java/com/jayqqaa12/jbase/cache/core/Cache.java
// public interface Cache {
// 
//   CacheObject get(String key) throws CacheException;
// 
// 
//   void set(String key, CacheObject value) throws CacheException;
// 
// 
//   void set(String key, CacheObject value, int expire) throws CacheException;
// 
//   void delete(String key) throws CacheException;
// 
// 
// }
// 
// Path: jbase-cache/src/main/java/com/jayqqaa12/jbase/cache/core/CacheConfig.java
// @Data
// public class CacheConfig {
// 
//   /**
//    * 缓存提供者 可选
//    * <p>
//    * com.jayqqaa12.jbase.cache.provider.NullCacheProvider com.jayqqaa12.jbase.cache.provider.caffeine.CaffeineCacheProvider
//    * com.jayqqaa12.jbase.cache.provider.lettuce.LettuceCacheProvider
//    * <p>
//    * 根据加入顺序确定缓存级别 可自定义CacheProvider 进行扩展
//    */
//   private List<String> providerClassList = new ArrayList<>();
// 
//   private String cacheSerializerClass = "com.jayqqaa12.jbase.cache.serializer.FastJsonCacheSerializer";
// 
//   /**
//    * 自动加载的线程数
//    */
//   private int autoLoadThreadCount = 5;
// 
//   // 具体的缓存中间件相关配置
// 
//   private String redisMode = CacheConst.REDIS_MODE_SINGLE;
// 
//   private LettuceConfig lettuceConfig = new LettuceConfig();
// 
//   private NotifyConfig notifyConfig = new NotifyConfig();
// 
//   private Map<String, CaffeineConfig> caffeineConfig = new HashMap<>();
// 
//   @Data
//   public static class CaffeineConfig {
// 
//     private int size = 10_000;
//     private int expire = 0;
// 
//   }
// 
//   @Data
//   public static class NotifyConfig {
// 
//     private String notifyClass = "com.jayqqaa12.jbase.cache.notify.NullNotify";
//     private String notifyTopic = CacheConst.DEFAULT_TOPIC;
// 
//     private String host;
//     private String groupId = CacheConst.DEFAULT_TOPIC;
// 
// 
//   }
// 
// 
//   @Data
//   public class LettuceConfig {
// 
//     /**
//      * 命名空间 可以用来区分不同 项目
//      */
//     private String namespace = CacheConst.NAMESPACE;
//     /**
//      * single 单点 cluster 集群
//      */
//     private String schema = CacheConst.REDIS_MODE_SINGLE;
//     private String hosts = "127.0.0.1:6379";
//     private String password = "";
//     private int database = 0;
//     private int maxTotal = 100;
//     private int maxIdle = 10;
//     private int minIdle = 10;
//     private int timeout = 10000;
//     private int clusterTopologyRefresh = 3000;
// 
// 
//   }
// 
// 
// }
// 
// Path: jbase-cache/src/main/java/com/jayqqaa12/jbase/cache/provider/CacheProvider.java
// public interface CacheProvider {
// 
//   void init(CacheConfig cacheConfig);
// 
//   Cache buildCache(String region,int expire)  ;
//   Cache buildCache(String region )  ;
// 
// 
//   void stop();
// 
//    
// 
// }
// 
// Path: jbase-cache/src/main/java/com/jayqqaa12/jbase/cache/serializer/CacheSerializer.java
// public interface CacheSerializer {
// 
//     byte[] serialize(Object obj)  ;
// 
//     Object deserialize(byte[] bytes)  ;
// 
// }
// 
// Path: jbase-cache/src/main/java/com/jayqqaa12/jbase/cache/util/CacheException.java
// public class CacheException extends RuntimeException {
// 
//     private static final long serialVersionUID = -5112528854998647834L;
// 
//     public CacheException(String s) {
//         super(s);
//     }
// 
//     public CacheException(String s, Throwable e) {
//         super(s, e);
//     }
// 
//     public CacheException(Throwable e) {
//         super(e);
//     }
// 
// }


// Path: jbase-cache/src/main/java/com/jayqqaa12/jbase/cache/provider/lettuce/LettuceCacheProvider.java
import static com.jayqqaa12.jbase.cache.core.CacheConst.REDIS_MODE_CLUSTER;
import com.jayqqaa12.jbase.cache.core.Cache;
import com.jayqqaa12.jbase.cache.core.CacheConfig;
import com.jayqqaa12.jbase.cache.provider.CacheProvider;
import com.jayqqaa12.jbase.cache.serializer.CacheSerializer;
import com.jayqqaa12.jbase.cache.util.CacheException;
import io.lettuce.core.AbstractRedisClient;
import io.lettuce.core.RedisClient;
import io.lettuce.core.RedisURI;
import io.lettuce.core.api.StatefulConnection;
import io.lettuce.core.cluster.ClusterClientOptions;
import io.lettuce.core.cluster.ClusterTopologyRefreshOptions;
import io.lettuce.core.cluster.RedisClusterClient;
import io.lettuce.core.support.ConnectionPoolSupport;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;

package com.jayqqaa12.jbase.cache.provider.lettuce;





/**
 * @author jayqqaa12
 */
@Slf4j
public class LettuceCacheProvider implements CacheProvider {

  private static AbstractRedisClient redisClient;
  private GenericObjectPool<StatefulConnection<String, byte[]>> pool;

  private LettuceByteCodec codec = new LettuceByteCodec();

  private final ConcurrentHashMap<String, Cache> regions = new ConcurrentHashMap<>();
  private CacheConfig cacheConfig;