我们通常在 Spring 的项目中使用 redis 进行缓存。我的问题是,由于 redis 是单线程的,那么我们的并发请求在访问 redis 时就变成了序列化请求。那么,使用Redis的意义是什么呢?
仅仅是因为"CPU 成为 Redis 瓶颈的频率并不高,因为通常 Redis 要么是内存限制,要么是网络绑定的。 ...... 使用流水线 在平均 Linux 系统上运行的 Redis 每秒甚至可以交付 100 万个请求...... "?
我正在学习 redis,Redis 文档常见问题解答
你基本上在一个问题中问了两个问题:
使用Redis的意义是什么。
众所周知,Redis速度很快,因为它将数据保存在内存中。如果你问作为一个单线程应用程序是否非常严格 - 嗯,它是一个产品,设计上是这样的,如果它是多线程的,也许它可以提高性能,这毕竟取决于引擎盖下的实际实现。
无论如何,它提供的不仅仅是"获取内存中的数据": - 许多基元可以使用 - 可配置的持久性 - 复制数据 还有更多
如果问题是内存缓存是否会更快(你提到了 Spring 框架,所以你在 Java Land) - 那么是的。
事实上,Spring Cache 支持 GuavaCache(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
这说:连接到本地主机上可用的 redis 服务器,以安静模式(-q 参数)运行 (-n) 100000 个请求,并仅运行特定于两个命令的测试:set 和 lpush