【发布时间】:2015-11-11 14:22:53
【问题描述】:
我有一个实现缓存机制的代码。 以前是基于 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相比吗?
请提出建议。
【问题讨论】:
-
您是否对每个请求进行了大量冗余调用?您是否在可以作为批处理(多获取)检索的循环中按顺序进行调用?
-
@Ben :是的,对于一个 api 请求,我们多次从 redis 请求数据。我不确定你的第二个问题。
-
由于您正在发出网络请求,因此您希望尽可能避免冗余调用。为此,请在 redis 前面使用请求范围的缓存。同样,如果您在循环中进行调用,则这些是 N 个顺序请求,而不是 1 个多获取 N 个条目。例如加载电子商务网站中的热门商品或最近 10 个博客条目。您可以跟踪请求了哪些键,并查看可以使用哪些重构来减少调用次数。通过切换到 redis,您现在需要进行优化以减少延迟。
标签: spring caching redis guava spring-cache