spring启动微服务中的分布式redis缓存
Distributed redis cache in spring boot micro services
我有两个微服务。 Item 微服务将数据填充到 redis 缓存中。它成功了,我也能够在同一个微服务中检索数据。另一个微服务是订单服务。为了服务,我需要从 redis 缓存中获取项目服务数据,因为我需要使用分布式缓存。但是我无法访问缓存数据以从 redis 缓存订购服务。
这是我的实现代码
项目服务
RedisConfig.java
@Configuration
public class RedisConfig {
/** The redis host name. */
@Value("${spring.redis.host}")
private transient String redisHostName;
/** The redis port. */
@Value("${spring.redis.port}")
private transient int redisPort;
/**
* Jedis connection factory.
*
* @return the jedis connection factory
*/
@Bean
public JedisConnectionFactory jedisConnectionFactory() {
final RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(redisHostName,
redisPort);
return new JedisConnectionFactory(redisStandaloneConfiguration);
}
/**
* Redis template.
*
* @return the redis template
*/
@Bean
public RedisTemplate<String, ItemEntity> redisTemplate() {
final RedisTemplate<String, ItemEntity> template = new RedisTemplate<>();
template.setConnectionFactory(jedisConnectionFactory());
return template;
}
}
RedisRepoImpl.java
/** The redis template. */
private transient RedisTemplate<String, ItemEntity> redisTemplate;
/** The hash operations. */
private transient HashOperations<String, Long, ItemEntity> hashOperations;
/** The Constant CACHE_KEY. */
private static final String CACHE_KEY ="ITEM_MASTER";
public RedisRepositoryImpl(final RedisTemplate<String, ItemEntity> redisTemplate) {
this.redisTemplate = redisTemplate;
this.hashOperations = redisTemplate.opsForHash();
}
@Override
public void save(final ItemEntity item) {
hashOperations.put(CACHE_KEY, item.getItemEntityId(), item);
}
/**
* Find all.
*
* @return the map
*/
@Override
public List<ItemEntity> findAll() {
final Map<Long, ItemEntity> itemEntities = hashOperations.entries(CACHE_KEY);
return new ArrayList<>(itemEntities.values());
}
//other code
订单服务
RedisConfig.java
我在订单服务中创建了 ItemEntity class,与项目服务相同。
@Configuration
public class RedisConfig {
/** The redis host name. */
@Value("${spring.redis.host}")
private transient String redisHostName;
/** The redis port. */
@Value("${spring.redis.port}")
private transient int redisPort;
/**
* Jedis connection factory.
*
* @return the jedis connection factory
*/
@Bean
public JedisConnectionFactory jedisConnectionFactory() {
final RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(redisHostName,
redisPort);
return new JedisConnectionFactory(redisStandaloneConfiguration);
}
/**
* Redis template.
*
* @return the redis template
*/
@Bean
public RedisTemplate<String, ItemEntity> redisTemplate() {
final RedisTemplate<String, ItemEntity> template = new RedisTemplate<>();
template.setConnectionFactory(jedisConnectionFactory());
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new GenericToStringSerializer<Long>(Long.class));
template.setHashValueSerializer(new GenericToStringSerializer<ItemEntity>(ItemEntity.class));
return template;
}
RedisRepoImpl.java
@Repository
public class RedisRepositoryImpl implements RedisRepository {
/** The Constant CACHE_KEY. */
private static final String CACHE_KEY ="ITEM_MASTER";
/** The hash operations. */
private transient HashOperations<String, Long, ItemEntity> hashOperations;
/**
* Instantiates a new redis repository impl.
*
* @param redisTemplate the redis template
*/
public RedisRepositoryImpl(final RedisTemplate<String, ItemEntity> redisTemplate) {
this.hashOperations = redisTemplate.opsForHash();
}
/**
* Find all.
*
* @return the map
*/
@Override
public List<ItemEntity> findAll() {
final Map<Long, ItemEntity> itemEntities = hashOperations.entries(CACHE_KEY);
return new ArrayList<>(itemEntities.values());
}
}
我在订单服务中将缓存作为空列表获取。你能告诉我我在这里犯了什么错误吗?
我通过更多的在线资料解决了这个问题。
我所做的额外更改是更新两个微服务中的 RedisTemplate bean,如下所示
@Bean
public RedisTemplate<String, ItemEntity> redisTemplate() {
final RedisTemplate<String, ItemEntity> template = new RedisTemplate<>();
template.setConnectionFactory(jedisConnectionFactory());
Jackson2JsonRedisSerializer<ItemEntity> values = new Jackson2JsonRedisSerializer<>(ItemEntity.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.registerModule(new JavaTimeModule());
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
values.setObjectMapper(objectMapper);
template.setHashValueSerializer(values);
return template;
}
我有两个微服务。 Item 微服务将数据填充到 redis 缓存中。它成功了,我也能够在同一个微服务中检索数据。另一个微服务是订单服务。为了服务,我需要从 redis 缓存中获取项目服务数据,因为我需要使用分布式缓存。但是我无法访问缓存数据以从 redis 缓存订购服务。
这是我的实现代码
项目服务
RedisConfig.java
@Configuration
public class RedisConfig {
/** The redis host name. */
@Value("${spring.redis.host}")
private transient String redisHostName;
/** The redis port. */
@Value("${spring.redis.port}")
private transient int redisPort;
/**
* Jedis connection factory.
*
* @return the jedis connection factory
*/
@Bean
public JedisConnectionFactory jedisConnectionFactory() {
final RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(redisHostName,
redisPort);
return new JedisConnectionFactory(redisStandaloneConfiguration);
}
/**
* Redis template.
*
* @return the redis template
*/
@Bean
public RedisTemplate<String, ItemEntity> redisTemplate() {
final RedisTemplate<String, ItemEntity> template = new RedisTemplate<>();
template.setConnectionFactory(jedisConnectionFactory());
return template;
}
}
RedisRepoImpl.java
/** The redis template. */
private transient RedisTemplate<String, ItemEntity> redisTemplate;
/** The hash operations. */
private transient HashOperations<String, Long, ItemEntity> hashOperations;
/** The Constant CACHE_KEY. */
private static final String CACHE_KEY ="ITEM_MASTER";
public RedisRepositoryImpl(final RedisTemplate<String, ItemEntity> redisTemplate) {
this.redisTemplate = redisTemplate;
this.hashOperations = redisTemplate.opsForHash();
}
@Override
public void save(final ItemEntity item) {
hashOperations.put(CACHE_KEY, item.getItemEntityId(), item);
}
/**
* Find all.
*
* @return the map
*/
@Override
public List<ItemEntity> findAll() {
final Map<Long, ItemEntity> itemEntities = hashOperations.entries(CACHE_KEY);
return new ArrayList<>(itemEntities.values());
}
//other code
订单服务
RedisConfig.java
我在订单服务中创建了 ItemEntity class,与项目服务相同。
@Configuration
public class RedisConfig {
/** The redis host name. */
@Value("${spring.redis.host}")
private transient String redisHostName;
/** The redis port. */
@Value("${spring.redis.port}")
private transient int redisPort;
/**
* Jedis connection factory.
*
* @return the jedis connection factory
*/
@Bean
public JedisConnectionFactory jedisConnectionFactory() {
final RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(redisHostName,
redisPort);
return new JedisConnectionFactory(redisStandaloneConfiguration);
}
/**
* Redis template.
*
* @return the redis template
*/
@Bean
public RedisTemplate<String, ItemEntity> redisTemplate() {
final RedisTemplate<String, ItemEntity> template = new RedisTemplate<>();
template.setConnectionFactory(jedisConnectionFactory());
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new GenericToStringSerializer<Long>(Long.class));
template.setHashValueSerializer(new GenericToStringSerializer<ItemEntity>(ItemEntity.class));
return template;
}
RedisRepoImpl.java
@Repository
public class RedisRepositoryImpl implements RedisRepository {
/** The Constant CACHE_KEY. */
private static final String CACHE_KEY ="ITEM_MASTER";
/** The hash operations. */
private transient HashOperations<String, Long, ItemEntity> hashOperations;
/**
* Instantiates a new redis repository impl.
*
* @param redisTemplate the redis template
*/
public RedisRepositoryImpl(final RedisTemplate<String, ItemEntity> redisTemplate) {
this.hashOperations = redisTemplate.opsForHash();
}
/**
* Find all.
*
* @return the map
*/
@Override
public List<ItemEntity> findAll() {
final Map<Long, ItemEntity> itemEntities = hashOperations.entries(CACHE_KEY);
return new ArrayList<>(itemEntities.values());
}
}
我在订单服务中将缓存作为空列表获取。你能告诉我我在这里犯了什么错误吗?
我通过更多的在线资料解决了这个问题。
我所做的额外更改是更新两个微服务中的 RedisTemplate bean,如下所示
@Bean
public RedisTemplate<String, ItemEntity> redisTemplate() {
final RedisTemplate<String, ItemEntity> template = new RedisTemplate<>();
template.setConnectionFactory(jedisConnectionFactory());
Jackson2JsonRedisSerializer<ItemEntity> values = new Jackson2JsonRedisSerializer<>(ItemEntity.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.registerModule(new JavaTimeModule());
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
values.setObjectMapper(objectMapper);
template.setHashValueSerializer(values);
return template;
}