Я использую 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.
Кто-нибудь может мне помочь?
чтобы реализовать многопользовательскую структуру, вы можете действовать следующим образом:
@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);
}
Я надеюсь, это поможет !
это хороший пример того, как реализовать многопользовательскую структуру с пружиной tech.asimio.net/2017/01/17/…
@sam Вы нашли какое-нибудь решение?
Это нормально, но как я могу настроить связанную фабрику соединений на шаблон Redis, который используется весной. Также его можно изменить по запросу.