首页 > 解决方案 > 由于redis是单线程的,那么我们的并发请求在访问redis的时候就变成了序列化请求。使用redis有什么意义?

问题描述

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

仅仅是因为“CPU 成为 Redis 的瓶颈并不常见,因为通常 Redis 要么受内存限制,要么受网络限制。......第二...... ”?

我在学习redis,Redis文档FAQ

标签: redis

解决方案


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

使用 Redis 有什么意义。

嗯,众所周知,Redis 速度很快,因为它将数据保存在内存中。如果您问作为单线程应用程序是否非常受限制 - 好吧,它是一种产品,按照设计就是这样工作的,如果它是多线程的,它可能会更高性能,这毕竟取决于引擎盖下的实际实现。

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

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

事实上,Spring Cache 支持 Guava Cache(spring 5/spring boot 2 使用 Caffeine 代替)——是的,与 Redis 进行正面比较会更快。但是,如果您有一个具有许多实例的分布式应用程序,并且一个实例计算了一些东西并将其放入缓存中,您如何从另一个实例获取相同的信息而不在实例之间分配信息呢?好吧,有像 Hazelcast 这样的工具,但它超出了这个问题的范围,关键是当应用程序超出基本功能时,缓存同步/保持最新等任务变得不那么明显。

如果您可以每秒执行 100 万次操作。

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

  • 运行 Redis 的硬件是什么?
  • 网络配置是什么?(在所有 Redis 调用都通过网络完成之后)
  • 你多久在磁盘上保存一次(Redis 有相应的配置)
  • 您是否使用复制并在多个 Redis 服务器之间分配负载以达到整体更快的吞吐量?
  • 究竟有哪些命令在该引擎盖下运行?

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

Redis 教程中的 Redis 基准测试章节

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

这是一个示例(我鼓励您阅读链接中的完整文章):

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

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


推荐阅读