9

我有一个代码,我在其中实现了缓存机制。以前它是基于 Guava 的缓存,现在考虑到集中式缓存的需求,我正在转向 Redis。

但我担心它的性能,因为与 guave 相比,我看到 redis 的性能极低。

我已经测量了从缓存中获取类对象的 api 的性能在 Guava 的情况下为 5 毫秒,而在 Redis 中则为 200 毫秒。
这是负载测试情况下的平均响应,在单个请求响应的情况下差别不大。
我已经使用缓存抽象实现了 Spring 数据 Redis。

以下是 Redis 配置示例:

 @Bean
 public RedisConnectionFactory redisConnectionFactory(@Value("${redis.host}") String redisHost,
            @Value("${redis.port}") Integer redisPort) {
        JedisConnectionFactory cf = new JedisConnectionFactory();
        cf.setHostName(redisHost);
        cf.setPort(redisPort);
        cf.setUsePool(true);
        JedisPoolConfig jedisPool = new JedisPoolConfig();
        jedisPool.setMaxTotal(500);
        cf.setPoolConfig(jedisPool);
        return cf;
    }

    @Bean(name = "redisTemplate")
    RedisTemplate<Object,Object> redisTemplate() {
        final RedisTemplate<Object,Object> template = new RedisTemplate<Object,Object>();
        template.setConnectionFactory(applicationContext.getBean(RedisConnectionFactory.class));
        return template;
    }

    @Bean
    public CacheManager cacheManager() {
        if(isRedisEnabled)
        {
            RedisTemplate<?,?> template = (RedisTemplate<?, ?>) applicationContext.getBean("redisTemplate");
            RedisCacheManager redisCacheManager = new PieRedisCacheManager(template);
            redisCacheManager.setUsePrefix(true);
           
                try
                {
                    template.getConnectionFactory().getConnection();
                }
                catch(Exception e)
                {
                    LOG.error("Unable to connect to redis Server ,closing application : "+e);
                    SpringApplication.exit(applicationContext);
                }
            return redisCacheManager;
        }
        else
        {
            GuavaCacheManager guavaCacheManager = new GuavaCacheManager();
            guavaCacheManager.setCacheBuilder(CacheBuilder.newBuilder());
            return guavaCacheManager;
        }
    }

除此之外,对于 redis 服务器配置,我尝试禁用所有持久性,因为我不需要它。但仍然表现不佳。

我的主要疑问是导致此问题的配置还是 Redis 与 Guava 相比性能非常低?
通过更多的配置调优redis的性能可以和guava相比吗?
请建议。

4

1 回答 1

15

免责声明:我绝不是使用 Guava 或 Redis 的专家,尽管我都使用过。

明显的性能损失是显而易见的

对于初学者来说,在我看来,从 Guava 切换到 Redis 时遇到性能下降是完全正常的。

主要是因为:

  • Guava 为您的应用程序正在运行的 JVM 提供内存中和本地的缓存。因此,您的应用程序可以轻松查询,而无需借助任何进程间通信。

  • Redis 是一个独立的键值存储应用程序,运行在自己的进程中。因此,您必须以某种方式与它通信才能建立连接并发送请求。

因此,即使您在同一台机器上,即使 Redis 固有的性能优于 Guava 的缓存(老实说,对于一般情况,这可能是这种情况),无论如何您肯定会看到性能下降。

可能的改进

话虽如此,您可能可以通过配置和架构选择来提高性能:

  • 确保使用本地 IP 连接到 Redis。这将有助于在尝试建立连接时避免任何地址解析。

  • 确保通过尽可能轻量级的协议连接到 Redis。因为我假设您使用的是本地 Redis 服务器,并且您遵守前一点,所以您不需要任何花里胡哨、安全协议等......

  • 任何其他可能适用于您的场景的常用 Redis 配置调整。

于 2015-08-31T15:43:44.533 回答