我有一个代码,我已经实现了缓存机制.
以前它是基于番石榴的缓存,现在我正在转向Redis考虑集中缓存的需求.
但是我担心它的性能,因为与guave相比,我看到redis的性能极低.
我测量了api的性能,它从缓存中获取一个类对象
在番石榴的情况下,它是5毫秒,而在雷迪斯,它是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
除此之外,对于redis服务器配置,我已经尝试禁用所有持久性,因为我不需要它.
但仍然表现不佳.
我的主要问题是,与Guava相比,导致此问题的配置还是Redis的性能非常低?
可以通过更多的配置调整redis性能与番石榴的性能进行比较吗?
请建议.
最佳答案
免责声明:我不是使用Guava或Redis的专家,尽管我已经同时使用了它们.
明显的绩效损失是显而易见的
对于初学者来说,在我看来,从Guava切换到Redis时遇到性能下降是完全正常的.
主要是因为:
> Guava为应用程序运行的JVM提供内存和本地缓存.因此,您的应用程序可以轻松查询,而无需借助任何进程间通信.
> Redis是一个独立的键值存储应用程序,在自己的进程中运行.因此,您必须以某种方式与其进行通信以建立连接并发送请求.
所以,即使你在同一台机器上,即使Redis固有的性能优于Guava的缓存(事实上可能就是这样,但对于一般情况而言),你肯定会看到性能上的打击.
可能的改进
话虽这么说,您可以通过配置和架构选择来改善您的性能:
>确保使用本地IP连接到Redis.这有助于避免在尝试建立连接时解析任何地址.
>确保通过尽可能轻量级的协议连接到Redis.正如我假设您使用的是本地Redis服务器,并且您遵守上一点,您将不需要任何铃声和口哨声,安全协议等…
>任何其他可能适用于您的方案的常见Redis配置调整.