<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      SpringBoot實現redis切換dbindex

      前言

      在實際springboot集成redis使用過程中,針對不同類型的業務數據,可能存在不同的dbindex中,例如token存儲db0,redis全局鎖存儲dbindex1,需要我們對RedisTemplate操作進行擴展,支持單次操作不同的dbindex

      方案

      系統加載時初始化根據redis使用庫的dbindex,初始化對應個數的RedisTemplate,調用時根據dbindex獲取對應的操作對象實例,本次實現是將15個db全部初始化

      RedisRegist

      初始化redis的Factory,線程池配置及RedisTemplate,StringRedisTemplate的Bean對象

      public class RedisRegist implements EnvironmentAware,ImportBeanDefinitionRegistrar {
          private static final Logger logger = LoggerFactory.getLogger(RedisRegist.class);
      
          private static Map<String, Object> registerBean = new ConcurrentHashMap<>();
      
          private Environment environment;
          private Binder binder;
      
      
          @Override
          public void setEnvironment(Environment environment) {
              this.environment = environment;
              this.binder = Binder.get(this.environment);
          }
      
      
          @Override
          public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
              RedisEntity redisEntity;
              try {
                  redisEntity = binder.bind("spring.redis", RedisEntity.class).get();
              } catch (NoSuchElementException e) {
                  logger.error("redis not setting.");
                  return;
              }
              boolean onPrimary = true;
      
              //根據多個庫實例化出多個連接池和Template
      
              for (int i = 0; i < 15; i++) {
                  int database = i;
                  //單機模式
                  RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration();
                  configuration.setHostName(String.valueOf(redisEntity.getHost()));
                  configuration.setPort(Integer.parseInt(String.valueOf(redisEntity.getPort())));
                  configuration.setDatabase(database);
                  String password = redisEntity.getPassword();
                  if (password != null && !"".equals(password)) {
                      RedisPassword redisPassword = RedisPassword.of(password);
                      configuration.setPassword(redisPassword);
                  }
      
                  //池配置
                  GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
      
                  RedisProperties.Pool pool = redisEntity.getLettuce().getPoolEntity();
                  genericObjectPoolConfig.setMaxIdle(pool.getMaxIdle());
                  genericObjectPoolConfig.setMaxTotal(pool.getMaxActive());
                  genericObjectPoolConfig.setMinIdle(pool.getMinIdle());
                  if (pool.getMaxWait() != null) {
                      genericObjectPoolConfig.setMaxWaitMillis(pool.getMaxWait().toMillis());
                  }
                  Supplier<LettuceConnectionFactory> lettuceConnectionFactorySupplier = () -> {
                      LettuceConnectionFactory factory = (LettuceConnectionFactory) registerBean.get("LettuceConnectionFactory" + database);
                      if (factory != null) {
                          return factory;
                      }
                      LettucePoolingClientConfiguration.LettucePoolingClientConfigurationBuilder builder = LettucePoolingClientConfiguration.builder();
                      Duration shutdownTimeout = redisEntity.getLettuce().getShutdownTimeout();
                      if(shutdownTimeout == null){
                          shutdownTimeout = redisEntity.getTimeout();
                      }
                      if (shutdownTimeout != null) {
                          builder.shutdownTimeout(shutdownTimeout);
                      }
                      LettuceClientConfiguration clientConfiguration = builder.poolConfig(genericObjectPoolConfig).build();
                      factory = new LettuceConnectionFactory(configuration, clientConfiguration);
                      registerBean.put("LettuceConnectionFactory" + database, factory);
                      return factory;
                  };
      
                  LettuceConnectionFactory lettuceConnectionFactory = lettuceConnectionFactorySupplier.get();
                  BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(LettuceConnectionFactory.class, lettuceConnectionFactorySupplier);
                  AbstractBeanDefinition factoryBean = builder.getRawBeanDefinition();
                  factoryBean.setPrimary(onPrimary);
                  registry.registerBeanDefinition("lettuceConnectionFactory" + database, factoryBean);
                  // StringRedisTemplate
                  GenericBeanDefinition stringRedisTemplate = new GenericBeanDefinition();
                  stringRedisTemplate.setBeanClass(StringRedisTemplate.class);
                  ConstructorArgumentValues constructorArgumentValues = new ConstructorArgumentValues();
                  constructorArgumentValues.addIndexedArgumentValue(0, lettuceConnectionFactory);
                  stringRedisTemplate.setConstructorArgumentValues(constructorArgumentValues);
                  stringRedisTemplate.setAutowireMode(AutowireCapableBeanFactory.AUTOWIRE_BY_NAME);
                  registry.registerBeanDefinition("stringRedisTemplate" + database, stringRedisTemplate);
      
                  // 定義RedisTemplate對象
                  GenericBeanDefinition redisTemplate = new GenericBeanDefinition();
                  redisTemplate.setBeanClass(RedisTemplate.class);
                  redisTemplate.getPropertyValues().add("connectionFactory", lettuceConnectionFactory);
                  redisTemplate.setAutowireMode(AutowireCapableBeanFactory.AUTOWIRE_BY_NAME);
      
      
                  RedisSerializer stringSerializer = new StringRedisSerializer();
                  Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
                  // key采用String的序列化方式,value采用json序列化方式
                  redisTemplate.getPropertyValues().add("keySerializer",new StringRedisSerializer());
                  redisTemplate.getPropertyValues().add("hashKeySerializer",stringSerializer);
                  redisTemplate.getPropertyValues().add("valueSerializer",jackson2JsonRedisSerializer);
                  redisTemplate.getPropertyValues().add("hashValueSerializer",stringSerializer);
      
                  //注冊Bean
                  registry.registerBeanDefinition("redisTemplate" + database, redisTemplate);
                  //logger.info("Registration redis ({}) !", database);
                  if (onPrimary) {
                      onPrimary = false;
                  }
              }
          }
      
      }
      

      RedisManage

      RedisTemplate,StringRedisTemplate的Bean對象統一管理定義

      public class RedisManage {
          private Map<String, RedisTemplate> redisTemplateMap;
      
          private Map<String, StringRedisTemplate> stringRedisTemplateMap;
      
          public RedisManage(Map<String, RedisTemplate> redisTemplateMap,
                             Map<String, StringRedisTemplate> stringRedisTemplateMap) {
              this.redisTemplateMap = redisTemplateMap;
              this.stringRedisTemplateMap = stringRedisTemplateMap;
          }
      
          public RedisTemplate redisTemplate(int dbIndex) {
              RedisTemplate redisTemplate = redisTemplateMap.get("redisTemplate" + dbIndex);
              return redisTemplate;
          }
      
          public StringRedisTemplate stringRedisTemplate(int dbIndex) {
              StringRedisTemplate stringRedisTemplate = stringRedisTemplateMap.get("stringRedisTemplate" + dbIndex);
              stringRedisTemplate.setEnableTransactionSupport(true);
              return stringRedisTemplate;
          }
      
          public Map<String, RedisTemplate> getRedisTemplateMap() {
              return redisTemplateMap;
          }
      
          public Map<String, StringRedisTemplate> getStringRedisTemplateMap() {
              return stringRedisTemplateMap;
          }
      
      }
      

      RedisConfig

      將操作類Bean對象注入道RedisManage中

      @AutoConfigureBefore({RedisAutoConfiguration.class})
      @Import(RedisRegist.class)
      @Configuration
      public class RedisConfig implements EnvironmentAware, ApplicationContextAware {
          private static final Logger logger = LoggerFactory.getLogger(RedisConfig.class);
      
          private static String key1 = "redisTemplate";
          private static String key2 = "stringRedisTemplate";
      
          Map<String, RedisTemplate> redisTemplateMap = new HashMap<>();
          Map<String, StringRedisTemplate> stringRedisTemplateMap = new HashMap<>();
          private Binder binder;
          private Environment environment;
          private ApplicationContext applicationContext;
      
          @Override
          public void setEnvironment(Environment environment) {
              this.environment = environment;
              this.binder = Binder.get(this.environment);
          }
          @PostConstruct
          public Map<String,RedisTemplate> initRedisTemplate(){
              RedisEntity redisEntity;
              try {
                  redisEntity = binder.bind("spring.redis", RedisEntity.class).get();
              } catch (NoSuchElementException e) {
                  throw new RuntimeException("Failed to configure  spring.redis: 'spring.redis' attribute is not specified and no embedded redis could be configured.");
              }
      
              for (int i=0;i<15;i++){
                  int database = i;
                  String key = key1 + database;
                  RedisTemplate redisTemplate = applicationContext.getBean(key , RedisTemplate.class);
                  if(redisTemplate != null){
                      redisTemplateMap.put(key , redisTemplate);
                  }
      
                  key = key2 + database;
                  if(stringRedisTemplateMap != null){
                      StringRedisTemplate stringRedisTemplate = applicationContext.getBean(key , StringRedisTemplate.class);
                      stringRedisTemplateMap.put(key , stringRedisTemplate);
                  }
              }
      
              if(redisTemplateMap.size() == 0 && stringRedisTemplateMap.size() == 0){
                  throw new RuntimeException("load redisTemplate failure , please check spring.redis property config!!!");
              }
              return redisTemplateMap;
          }
      
      
          @Override
          public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
              this.applicationContext = applicationContext;
          }
      
          @Bean
          public RedisManage redisManage(){
              return new RedisManage(redisTemplateMap , stringRedisTemplateMap);
          }
      }
      

      RedisUtil

      調用RedisManage封裝具體相關操作調用

      @Component
      public class RedisUtil {
          @Autowired
          private RedisManage redisManage;
          private int defatuDBIndex= 0;
      
          public void redisTemplateSet(String key, Object value){
              ValueOperations<Object, Object> ops = redisManage.redisTemplate(defatuDBIndex).opsForValue();
              ops.set(key, value);
          }
      
          public void redisTemplateSet(String key, Object value,int dbIndex){
              ValueOperations<Object, Object> ops = redisManage.redisTemplate(dbIndex).opsForValue();
              ops.set(key, value);
          }
      
          public Object redisTemplateGet(String key){
              ValueOperations<Object, Object> ops = redisManage.redisTemplate(defatuDBIndex).opsForValue();
              return ops.get(key);
          }
      
          public Object redisTemplateGet(String key,int dbIndex){
              ValueOperations<Object, Object> ops = redisManage.redisTemplate(dbIndex).opsForValue();
              return ops.get(key);
          }
      
          public void redisTemplateRemove(String key){
              ValueOperations<Object, Object> ops = redisManage.redisTemplate(defatuDBIndex).opsForValue();
              ops.getOperations().delete(key);
          }
      
          public void redisTemplateRemove(String key,int dbIndex){
              ValueOperations<Object, Object> ops = redisManage.redisTemplate(dbIndex).opsForValue();
              ops.getOperations().delete(key);
          }
      
          public void redisTemplateSetForList(String key, Map<String,Object> map){
              HashOperations<Object, Object,Object> ops = redisManage.redisTemplate(defatuDBIndex).opsForHash();
              ops.putAll(key,map);
          }
      
          public void redisTemplateSetForList(String key, Map<String,Object> map,int dbIndex){
              HashOperations<Object, Object,Object> ops = redisManage.redisTemplate(dbIndex).opsForHash();
              ops.putAll(key,map);
          }
      
          public void redisTemplateSetForList(String key, String hashKey,Object value){
              HashOperations<Object, Object,Object> ops = redisManage.redisTemplate(defatuDBIndex).opsForHash();
              ops.put(key,hashKey,value);
          }
      
          public void redisTemplateSetForList(String key, String hashKey,Object value,int dbIndex){
              HashOperations<Object, Object,Object> ops = redisManage.redisTemplate(dbIndex).opsForHash();
              ops.put(key,hashKey,value);
          }
      
          public Map<Object, Object> redisTemplateGetForList(String key){
              HashOperations<Object, Object,Object> ops = redisManage.redisTemplate(defatuDBIndex).opsForHash();
              return ops.entries(key);
          }
      
          public Map<Object, Object> redisTemplateGetForList(String key,int dbIndex){
              HashOperations<Object, Object,Object> ops = redisManage.redisTemplate(dbIndex).opsForHash();
              return ops.entries(key);
          }
      
          public Object redisTemplateGetForList(String key,String hasKey){
              HashOperations<Object, Object,Object> ops = redisManage.redisTemplate(defatuDBIndex).opsForHash();
              return ops.get(key,hasKey);
          }
      
          public Object redisTemplateGetForList(String key,String hasKey,int dbIndex){
              HashOperations<Object, Object,Object> ops = redisManage.redisTemplate(dbIndex).opsForHash();
              return ops.get(key,hasKey);
          }
      
          public  void setExpire(String key,long timeout, final TimeUnit unit,int dbIndex){
              redisManage.redisTemplate(dbIndex).expire(key,timeout, unit);
          }
      
          public  void setExpire(String key,long timeout, final TimeUnit unit){
              redisManage.redisTemplate(defatuDBIndex).expire(key,timeout, unit);
          }
      
          public boolean isValid(String key){
              boolean flag = false;
              if(  redisManage.redisTemplate(defatuDBIndex).hasKey(key)){
                  if( redisManage.redisTemplate(defatuDBIndex).getExpire(key,TimeUnit.SECONDS)>0){
                      flag = true;
                  }
              }
              return flag;
          }
      
          public boolean isValid(String key,int dbIndex){
              boolean flag = false;
              if(  redisManage.redisTemplate(dbIndex).hasKey(key)){
                  if( redisManage.redisTemplate(dbIndex).getExpire(key,TimeUnit.SECONDS)>0){
                      flag = true;
                  }
              }
              return flag;
          }
      }
      
      posted @ 2021-08-29 10:40  code2roc  閱讀(879)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲国产日韩一区三区| 欧美大bbbb流白水| 秋霞人妻无码中文字幕| 久久热这里只有精品最新| 欧美一区二区三区啪啪| 亚洲av影院一区二区三区| 欧美一本大道香蕉综合视频| 国产一级r片内射免费视频| 男女扒开双腿猛进入爽爽免费看| 日本一区二区三深夜不卡 | 少妇人妻真实偷人精品| 老司机午夜免费精品视频| 国产亚洲一二三区精品| 国产亚洲综合区成人国产| 亚洲人黑人一区二区三区| 一区二区和激情视频| 平罗县| 亚洲日本va午夜中文字幕久久| 久久精品免费自拍视频| 亚洲性日韩精品一区二区| av资源在线看免费观看| 久久99热只有频精品8| 三人成全免费观看电视剧高清| 国产一区二区亚洲av| 丰满的女邻居2| 宝贝腿开大点我添添公视频免| 精品三级在线| 无码毛片一区二区本码视频| 女人扒开腿让男人桶到爽| 少妇被粗大的猛烈xx动态图| 亚洲成人av高清在线| 婷婷六月色| 无码av中文字幕久久专区| 国产午夜福利大片免费看| 无码人妻丰满熟妇啪啪网不卡| 临夏县| 亚洲免费最大黄页网站| 日日碰狠狠添天天爽五月婷| 日本欧美大码aⅴ在线播放| 好爽毛片一区二区三区四| 爆乳女仆高潮在线观看|