Spring Data Redis с мультиарендностью

Я использую Spring Data Redis, при этом абстракция данных Spring не использует напрямую RedisTemplate.

Моя модель данных, как показано ниже:

@RedisHash(value = “products")
public class Product {

    @Id
    @Indexed
    private String id;
    private String description;
    private BigDecimal price;
    private String imageUrl;

   //Getter and Setter

}

Мои репозитории с абстракцией данных Spring:

@Repository
public interface ProductRepository extends CrudRepository<Product,String> {
}

Это мой конфиг:

@Configuration
@EnableRedisRepositories(enableKeyspaceEvents = RedisKeyValueAdapter.EnableKeyspaceEvents.ON_STARTUP)
public class RedisConfig {

    @Bean
    JedisConnectionFactory jedisConnectionFactory() {
        JedisConnectionFactory jedisConFactory = new JedisConnectionFactory();
        jedisConFactory.setHostName("localhost");
        jedisConFactory.setPort(6379);
        return jedisConFactory;
    }
}

Я доволен ими для приложения с одним арендатором.

А теперь я хочу реализовать мультитенантную структуру.

Я подумал, что создание экземпляра Redis для каждого клиента - хорошее решение.

У меня есть карта, содержащая идентификатор клиента и конечную точку Redis, предназначенную для этого клиента.

Данные карты выглядят следующим образом:

(Key : tenantId1, value: host1:port1) 
(Key : tenantId2, value: host2:port2)
(Key : tenantId3, value: host3:port3)

Сценарий в моей голове:
клиент приходит в приложение со своим идентификатором клиента и передает запрос в redisRepository с идентификатором клиента. Пример сохранения нового продукта: productRepository.save(product,tenantId).

Но не представляю, как реализовать эту маршрутизацию.

Я думал, что создайте RedisConnectionFactory для каждого арендатора.

Но я не знаю, как выбрать связанный ConnectionFactory в абстракции данных Spring.

Кто-нибудь может мне помочь?

0
0
1 138
1

Ответы 1

чтобы реализовать многопользовательскую структуру, вы можете действовать следующим образом:

  @Bean(name = "JedisConnectionFactor" )
  public Map<String, JedisConnectionFactory> JedisConnectionFactor(){
    Map<String, DataSource> factories = new HashMap<>();
    //for (JedisProperties properties :  // better to import jedis config from for each single tenant
      //multiTenantJedisProperties.getListOfProperties()) { 

      JedisConnectionFactory jedisConFactory = new JedisConnectionFactory();
      jedisConFactory.setHostName("localhost");
      jedisConFactory.setPort(6379);
      result.put(jeditProperties.getTenantId(), jedisConFactory)
     // iterate ....
      JedisConnectionFactory jedisConFactory = new JedisConnectionFactory();
      jedisConFactory.setHostName("localhost");
      jedisConFactory.setPort(6379);
      result.put(jeditProperties.getTenantId(), jedisConFactory);
     // n times

    }
    return factories;
  }

и вы можете использовать autowire карту фабрик

@Autowired
   private Map<String, JedisConnectionFactory> JedisConnectionFactories;

   @Autowire
   protected DataSource selectJedisConnectionFactory(String tenantId) {
     return this.JedisConnectionFactories.get(tenantId);
   }

Я надеюсь, это поможет !

Это нормально, но как я могу настроить связанную фабрику соединений на шаблон Redis, который используется весной. Также его можно изменить по запросу.

sam 27.07.2018 07:45

это хороший пример того, как реализовать многопользовательскую структуру с пружиной tech.asimio.net/2017/01/17/…

CodeIsLife 27.07.2018 13:18

@sam Вы нашли какое-нибудь решение?

Arpit 09.01.2020 10:50

Другие вопросы по теме