由于redis是单线程的,因此在访问redis时,我们的并发请求变为序列化请求。使用redis有什么意义?

时间:2019-05-31 05:24:12

标签: redis

我们通常在Spring项目中使用redis进行缓存。我的问题是,由于redis是单线程的,所以当访问redis时,我们的并发请求变成了序列化请求。那么,使用redis有什么意义?

仅仅是因为“ CPU成为Redis的瓶颈并不常见,因为Redis通常是内存或网络绑定的。 ...... 使用在一般Linux系统上运行的流水线Redis可以每秒发送甚至一百万个请求…… “?

我正在学习Redis,Redis document FAQ

1 个答案:

答案 0 :(得分:0)

您基本上已经在一个问题中问了两个问题:

  
    

使用Redis的意义是什么。

  

好吧,Redis被认为是快速的,因为它可以将数据保存在内存中。如果您问一个单线程应用程序是否有严格的限制-那么,它的产品在设计上可以像这样工作,如果它是多线程的,它的性能可能会更高,这毕竟取决于实际的实现。

无论如何,它提供的不仅仅是“在内存中获取数据”:  -许多可以使用的原语  -可配置的持久性  -数据复制 还有更多

如果问题是内存缓存是否会更快(您已经提到了Spring框架,那么您就在Java Land上)-是的。

事实上,Spring Cache支持Guava Cache(Spring 5 / spring boot 2出于相同的目的使用Caffeine)-是的,与Redis进行正面对比时,它会更快。但是,如果您有一个包含许多实例的分布式应用程序,并且一个实例计算了一些内容并将其缓存,那么如何从另一个实例中获取相同的信息而不在实例之间分配信息呢?嗯,有类似Hazelcast之类的工具,但是这个问题超出了范围,关键是,当应用程序超出基本范围时,诸如缓存同步/保持其最新状态之类的任务就变得不那么明显了。

  
    

如果您每秒可以交付一百万次操作。

  

现在这个问题太模糊了,无法回答:

  • 运行Redis的硬件是什么?
  • 什么是网络配置? (在所有Redis调用都通过网络完成之后)
  • 您多久在磁盘上保留一次(Redis对此进行了配置)
  • 您是否使用复制并在许多Redis服务器之间分配负载以达到整体上更快的吞吐量?
  • 究竟是什么命令在后台运行?

无论如何,在进行基准测试时,您可以通过选项方式设置系统并使用Redis本身提供的工具:

Redis Benchmarking Chapter in Redis tutorial

该工具称为redis-benchmark,您可以使用各种参数运行它,并查看redis的实际运行速度:

以下是一个示例(建议您阅读链接中的全文):

$ redis-benchmark -t set,lpush -n 100000 -q
  SET: 74239.05 requests per second
  LPUSH: 79239.30 requests per second

这表示:连接到本地主机上可用的redis服务器,以安静模式(-q参数)运行(-n)100000个请求,并且仅运行特定于两个命令的测试:set和lpush