我有一个代码,在其中我实现了缓存机制。以前是基于番石榴的缓存,现在考虑到集中式缓存的需求,我转向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相比吗?
请建议。
免责声明:我绝不是使用番石榴或红迪的专家,尽管我都用过。
首先,在我看来,当从番石榴切换到Redis时,性能下降是完全正常的。
主要是因为:
>
Guava为应用程序运行的JVM提供内存中的本地缓存。因此,您的应用程序可以很容易地进行查询,而无需借助任何进程间通信。
Redis是一个单独的键值存储应用程序,运行在自己的进程中。因此,您必须以某种方式与它通信,以建立连接并发送请求。
因此,即使您在同一台机器上,即使Redis的固有性能比Guava的缓存更好(老实说,一般情况下可能是这样),您也肯定会看到性能的提升。
确保通过尽可能轻量级的协议连接到Redis。我假设您使用的是本地Redis服务器,并且您遵守前面的观点,您将不需要任何铃铛和哨子、安全协议等...
任何其他通常的Redis配置调整可能适用于您的场景。