当前位置: 首页 > 知识库问答 >
问题:

spring boot micro services中的分布式redis缓存

乔望
2023-03-14

我有两个微服务。Item micro服务将数据填充到redis缓存中。这是成功的,我也能够在同一个微服务中检索数据。另一个微服务是订单服务。为了获得服务,我需要从redis缓存中获取项目服务数据,因为我需要使用分布式缓存。然而,我无法从redis缓存中访问缓存数据以获得服务。

这是我的实现代码

物品服务

重新配置。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;
    }
}

重新发行。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

订单服务

重新配置。JAVA

我在订单服务中创建了ItemEntity类,以及与项目服务相同的类。

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

重新发行。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());
    }
}

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

共有1个答案

宗政欣可
2023-03-14

在浏览了几篇在线资料后,我终于解决了这个问题。

我做的额外更改是在两个微服务中更新RedisTemplatebean,如下所示

    @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;
    }
 类似资料:
  • Web 应用程序可能需要为成百上千甚至更多的用户同时提供服务。如果你没有采取必要的措施,在这种负载下,你的网站可能会崩溃或变得没有响应。 假设在主页显示最后 10 条新闻,并且平均每分钟有上千名用户访问此页面。你可能为每个用户通过查询数据库来显示页面视图信息: SELECT TOP 10 Title, NewsDate, Subject, Body FROM News ORDER BY NewsD

  • 问题内容: 我正在寻找Java分布式缓存解决方案。我们希望功能喜欢: 我们已经分析了Terracotta这样的框架,它似乎是缓存框架中我们想要的一切……但是,似乎需要一个中央缓存节点,这成为我们的单点故障。 除了推出我们自己的解决方案之外,还有其他想法吗? 问题答案: 我建议使用JBossCache或EhCache(使用分布式缓存侦听器)。我都用过,我都喜欢,它们都适合您的要求。

  • 主要内容:Redis分布式锁介绍,Redis分布式锁命令在分布式系统中,当不同进程或线程一起访问共享资源时,会造成资源争抢,如果不加以控制的话,就会引发程序错乱。此时使用分布式锁能够非常有效的解决这个问题,它采用了一种互斥机制来防止线程或进程间相互干扰,从而保证了数据的一致性。 提示:如果对分布式系统这一概念不清楚,可参考百度百科《分布式系统》,简而言之,它是一种架构、一种模式。 Redis分布式锁介绍 分布式锁并非是 Redis 独有,比如 MySQ

  • 我正在使用ehcache(2.10.1)和terracotta(开源4.3.1)实现分布式缓存。我在单台机器上尝试了两个JVM实例和一个terracotta服务器,代码按预期工作,没有错误。 现在,我尝试运行相同的terracotta服务器,但在虚拟机上使用客户端。在虚拟机上运行客户端时,会收到以下消息和错误: 使用的 tc-config.xml 文件: 使用的 ehcache.xml 文件: 在

  • [命名空间: Serenity.Caching, 程序集: Serenity.Caching.Couchbase] Redis 是另一种内存数据库,由于其优秀的性能和可靠性, StackOverflow 也在使用它,他们所有的 WEB 服务只用了一个 Redis 数据库。 你可以从 Serenity.Caching.Redis 的 NuGet 程序包获取该服务类型的 Serenity 实现。 它可

  • [命名空间: Serenity.Caching, 程序集: Serenity.Caching.Couchbase] Couchbase 是一个分布式数据库,有像 Memcached 的访问接口。 可以从 NuGet 程序包 Serenity.Caching.Couchbase 获取 Serenity 对此服务类型的实现。 一旦你使用服务定位器注册它: Dependency.Resolve<IDep