spring - Redis 与 Guava 缓存

标签 spring caching redis guava spring-cache

我有一段代码,其中实现了缓存机制。 以前是基于 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 相媲美?
请建议。

最佳答案

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

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

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

主要是因为:

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

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

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

可能的改进

也就是说,您可以通过配置和架构选择来提高性能:

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

  • 确保通过尽可能轻量级的协议(protocol)连接到 Redis。正如我假设您使用的是本地 Redis 服务器,并且您遵守前一点,您将不需要任何附加功能、安全协议(protocol)等...

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

关于spring - Redis 与 Guava 缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32075954/

相关文章:

redis - 同一个 Docker 容器上的两个 Logstash 实例

docker - 从主机访问 Redis Docker 容器

java - 在 Spring 的单个项目中同时使用 XML 和注释配置是个坏主意吗?

java - Spring JavaConfig 如何引用我定义的 bean 来创建新 bean

ruby-on-rails - rake 任务无法访问rails.cache

java - 如何处理@ViewScoped页面中的 'cached'实例?

node.js - Angular HttpClient 代理失败

java - 调用存储过程的批处理应用程序的正确 block 大小是多少?

php - cURL - 如何仅在页面自上次获取后发生变化时获取页面?

javascript - 遍历 Redis 表,并在 Nodejs 和 Expressjs 中获取相同的键