redis - 由于redis是单线程的,那么我们的并发请求在访问redis的时候就变成了序列化请求。使用redis有什么意义?
问题描述
我们通常在 Spring 的项目中使用 redis 进行缓存。我的问题是,既然redis是单线程的,那么我们的并发请求在访问redis的时候就变成了序列化的请求。那么,使用redis有什么意义呢?
仅仅是因为“CPU 成为 Redis 的瓶颈并不常见,因为通常 Redis 要么受内存限制,要么受网络限制。......第二...... ”?
我在学习redis,Redis文档FAQ
解决方案
您基本上在一个问题中问了两个问题:
使用 Redis 有什么意义。
嗯,众所周知,Redis 速度很快,因为它将数据保存在内存中。如果您问作为单线程应用程序是否非常受限制 - 好吧,它是一种产品,按照设计就是这样工作的,如果它是多线程的,它可能会更高性能,这毕竟取决于引擎盖下的实际实现。
无论如何,它提供的不仅仅是“在内存中获取数据”: - 许多原语可以使用 - 可配置的持久性 - 数据复制等等
如果问题是内存缓存是否会更快(您提到了 Spring 框架,所以您在 Java Land) - 那么是的。
事实上,Spring Cache 支持 Guava Cache(spring 5/spring boot 2 使用 Caffeine 代替)——是的,与 Redis 进行正面比较会更快。但是,如果您有一个具有许多实例的分布式应用程序,并且一个实例计算了一些东西并将其放入缓存中,您如何从另一个实例获取相同的信息而不在实例之间分配信息呢?好吧,有像 Hazelcast 这样的工具,但它超出了这个问题的范围,关键是当应用程序超出基本功能时,缓存同步/保持最新等任务变得不那么明显。
如果您可以每秒执行 100 万次操作。
现在这个问题太模糊了,无法回答:
- 运行 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
推荐阅读
- git - Git 描述 FOR /F 命令中的条件性致命错误
- janusgraph - 将 JanusGraph 管理 API 连接到远程 JanusGraph 服务器
- excel - 在 VBA 中创建一个可循环的容器类
- c++ - 如何测试 UIElement 是 Line 还是 Ellipse?
- swift - 如何创建具有不同数据类型的数据结构?
- imaging - 在 UWP 中使用 Accord.Imaging
- node.js - 在Angular中提交时如何修复未定义的变量
- javascript - 如何使用JS向特定位置的数组添加值
- c - 了解不同的#define 声明
- kubernetes - 从其他服务器访问保险库