Redis与番石榴缓存

时间:2015-08-18 14:59:02

标签: spring caching redis guava spring-cache

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

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

我测量了api的性能,它从缓存中获取一个类对象 如果番石榴是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服务器配置,我已经尝试禁用所有持久性,因为我不需要它。 但性能仍然很低。

我的主要问题是,与Guava相比,导致此问题的配置还是Redis的性能非常低? 可以通过更多的配置调整redis性能与番石榴的性能进行比较吗? 请建议。

1 个答案:

答案 0 :(得分:5)

免责声明:我并不是使用Guava或Redis的专家,尽管我已经同时使用过它们。

明显的绩效损失显而易见

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

主要是因为:

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

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

所以即使你在同一台机器上,即使Redis固有的性能比Guava的缓存更好(可能是这样,老实说,对于一般情况而言),你肯定会看到无论如何,性能都会受到影响。

可能的改进

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

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

  • 确保通过尽可能轻量级的协议连接到Redis。我假设您正在使用本地Redis服务器,并且您遵守上一点,您不需要任何铃声和口哨声,安全协议等......

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