【问题标题】:Distributed redis cache in spring boot micro servicesspring boot微服务中的分布式redis缓存
【发布时间】:2020-06-23 17:42:02
【问题描述】:

我有两个微服务。 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

我在 Order 服务中创建了 ItemEntity 类,与 Item Service 相同。

@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());
    }
}

我在订单服务中将缓存作为空列表。你能告诉我我在这里犯了什么错误吗?

【问题讨论】:

  • 您确认spring.redis.host 在两个微服务中是相同的吗?
  • 是的..它是一样的。

标签: java spring-boot caching spring-data-redis


【解决方案1】:

在浏览了更多在线资料后,我能够解决这个问题。

我所做的额外更改是更新了两个微服务中的 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;
    }

【讨论】:

  • 嘿,谢谢伙计,您完成了我的一天,该解决方案正是我所需要的。顺便说一句,我不明白为什么用 redis 从 2 个微服务中删除一个简单的值会如此复杂,我认为只是为了这个而进行了很多配置。
猜你喜欢
  • 2021-12-05
  • 1970-01-01
  • 2019-09-02
  • 2019-01-02
  • 2023-03-22
  • 2022-11-03
  • 2020-06-08
  • 2020-03-11
  • 2022-01-08
相关资源
最近更新 更多