我正在设计一个应用程序,我想在其中缓存大约10kb的百万数据。。我做了一些分析,并在使用redis、memcached和scylla作为缓存之间徘徊。。一些Maven能否建议哪种可能最适合我的需要?高性能高可用性高吞吐量低价?
tgabmvqs1#
内存实际上是一件坏事,因为ram很昂贵而且不持久。因此,对于k/v或列式工作负载,“锡拉”将是一个更好的选择。“锡拉”也有一个有限的redis api,结果很好[1],使用cql api将产生更好的结果。[1] https://medium.com/@siddharthc/redis-on-nvme-with-scylladb-5e12afd38dbc上
sq1bmfud2#
您提到的所有三个选项都是开源软件,因此定价相同-零:-)但是,scylla和redis都是由公司编写和支持的(分别是scylladb和redislabs),因此如果您的用例是任务关键型的,您可以选择向这些公司支付企业级支持的费用,你可以向这些公司询问他们的价格。三者之间更有趣的区别在于技术。您描述了一个在缓存中有10gb数据的用例。这个数量可以很容易地保存在内存中,所以像memcached或redis这样的完全内存数据库是一个自然的选择。但是,您仍然需要问自己一些问题,这些问题可能会导致您使用分布式数据库,如“锡拉”,具体取决于您的答案:你会使用强大的多核机器吗?如果是这样的话,你应该排除memcached的可能性——我的经验(和其他人的经验——看memcached能充分利用多核吗?)。在8核机器上,你不会得到任何接近单核机器8倍的性能。redis也不是真正意义上的多核应用-https://redis.io/topics/benchmarks 说redis“不是为了从多个cpu核中获益而设计的。如果需要的话,人们应该启动几个redis示例在几个核心上扩展。另一方面,“锡拉”在多核机器上蓬勃发展。在做出决策之前,您可能应该在用例上测试这三种产品的性能。突然丢失缓存的全部内容会造成多大的灾难?在某些用例中,这只是意味着您需要查询稍微慢一点的后端服务器,因此在重新启动时突然丢失缓存是可以接受的。在这种情况下,像memached或redis这样的纯内存缓存可能正是您所需要的。但是,在其他情况下,从零开始使用空缓存可能会受到很大的惩罚—后端服务器可能非常慢,或者原始内容存储在一个距离较远的服务器上,该服务器的广域网又慢又贵。在这种情况下,您需要一个磁盘备份的缓存,因此如果内存缓存丢失,您仍然可以从磁盘而不是从后端服务器刷新它。redis有磁盘备份选项,在锡拉,磁盘备份是主要的方式。您提到了一个10gb的工作集,它可以很容易地容纳单个服务器的内存。但是,这是否可能会增长,一年后您会发现自己需要缓存100 gb或1 tb的内存,而这不再适合单个服务器的内存?在memcached你会走运的。redis曾经有一个“虚拟内存”解决方案来实现这个目的,但是它已经被弃用了https://redis.io/topics/virtual-memory 现在,redis表示“至少目前还没有考虑对大于ram的数据库的支持”。锡拉确实用两种方式处理这个问题。首先,您的缓存将存储在比内存大得多的磁盘上(无论您拥有多少内存都将用于进一步加速缓存,但它不需要容纳内存)。第二,锡拉是一个分布式服务器。它可以将100gb的工作集分发给10个不同的节点。redis也有“复制”功能,但它将整个数据复制到所有节点,而scylla可以选择在不同的节点上存储不同的数据子集。
yqkkidmi3#
完全公开-我在锡拉项目工作。我认为这是一个延迟和ha与成本的问题。作为一个基于ram的系统,redis的延迟将是最低的。如果需要<1毫秒的响应,则可以选择redis或memcached。“锡拉”是一个基于磁盘的系统。“锡拉”ram中的那些值的延迟会很低,但需要从磁盘中提取的值会比较慢。所以你的99p潜伏期可能会慢一些。有多慢?取决于您的磁盘。nvme可以是99p3-5ms,ssd可能是5-10ms。如果这是一个可接受的延迟,那么scylla将便宜得多,因为即使nvme也比ram便宜得多。至于ha,redis和memcached是作为缓存使用的。虽然有一些特性和框架可以用来复制数据,但这些都是附加的,增加了复杂性。“锡拉”设计上是一个分布式系统。因此,允许多层ha的复制是内置的(节点、机架和dc可用性)redis(在较小程度上,memcached)是一种惊人的缓存。但是,根据您的用例,“锡拉”可能是正确的选择。
3条答案
按热度按时间tgabmvqs1#
内存实际上是一件坏事,因为ram很昂贵而且不持久。因此,对于k/v或列式工作负载,“锡拉”将是一个更好的选择。“锡拉”也有一个有限的redis api,结果很好[1],使用cql api将产生更好的结果。
[1] https://medium.com/@siddharthc/redis-on-nvme-with-scylladb-5e12afd38dbc上
sq1bmfud2#
您提到的所有三个选项都是开源软件,因此定价相同-零:-)但是,scylla和redis都是由公司编写和支持的(分别是scylladb和redislabs),因此如果您的用例是任务关键型的,您可以选择向这些公司支付企业级支持的费用,你可以向这些公司询问他们的价格。
三者之间更有趣的区别在于技术。
您描述了一个在缓存中有10gb数据的用例。这个数量可以很容易地保存在内存中,所以像memcached或redis这样的完全内存数据库是一个自然的选择。但是,您仍然需要问自己一些问题,这些问题可能会导致您使用分布式数据库,如“锡拉”,具体取决于您的答案:
你会使用强大的多核机器吗?如果是这样的话,你应该排除memcached的可能性——我的经验(和其他人的经验——看memcached能充分利用多核吗?)。在8核机器上,你不会得到任何接近单核机器8倍的性能。redis也不是真正意义上的多核应用-https://redis.io/topics/benchmarks 说redis“不是为了从多个cpu核中获益而设计的。如果需要的话,人们应该启动几个redis示例在几个核心上扩展。另一方面,“锡拉”在多核机器上蓬勃发展。在做出决策之前,您可能应该在用例上测试这三种产品的性能。
突然丢失缓存的全部内容会造成多大的灾难?在某些用例中,这只是意味着您需要查询稍微慢一点的后端服务器,因此在重新启动时突然丢失缓存是可以接受的。在这种情况下,像memached或redis这样的纯内存缓存可能正是您所需要的。但是,在其他情况下,从零开始使用空缓存可能会受到很大的惩罚—后端服务器可能非常慢,或者原始内容存储在一个距离较远的服务器上,该服务器的广域网又慢又贵。在这种情况下,您需要一个磁盘备份的缓存,因此如果内存缓存丢失,您仍然可以从磁盘而不是从后端服务器刷新它。redis有磁盘备份选项,在锡拉,磁盘备份是主要的方式。
您提到了一个10gb的工作集,它可以很容易地容纳单个服务器的内存。但是,这是否可能会增长,一年后您会发现自己需要缓存100 gb或1 tb的内存,而这不再适合单个服务器的内存?在memcached你会走运的。redis曾经有一个“虚拟内存”解决方案来实现这个目的,但是它已经被弃用了https://redis.io/topics/virtual-memory 现在,redis表示“至少目前还没有考虑对大于ram的数据库的支持”。锡拉确实用两种方式处理这个问题。首先,您的缓存将存储在比内存大得多的磁盘上(无论您拥有多少内存都将用于进一步加速缓存,但它不需要容纳内存)。第二,锡拉是一个分布式服务器。它可以将100gb的工作集分发给10个不同的节点。redis也有“复制”功能,但它将整个数据复制到所有节点,而scylla可以选择在不同的节点上存储不同的数据子集。
yqkkidmi3#
完全公开-我在锡拉项目工作。
我认为这是一个延迟和ha与成本的问题。作为一个基于ram的系统,redis的延迟将是最低的。如果需要<1毫秒的响应,则可以选择redis或memcached。
“锡拉”是一个基于磁盘的系统。“锡拉”ram中的那些值的延迟会很低,但需要从磁盘中提取的值会比较慢。所以你的99p潜伏期可能会慢一些。有多慢?取决于您的磁盘。nvme可以是99p3-5ms,ssd可能是5-10ms。如果这是一个可接受的延迟,那么scylla将便宜得多,因为即使nvme也比ram便宜得多。
至于ha,redis和memcached是作为缓存使用的。虽然有一些特性和框架可以用来复制数据,但这些都是附加的,增加了复杂性。“锡拉”设计上是一个分布式系统。因此,允许多层ha的复制是内置的(节点、机架和dc可用性)
redis(在较小程度上,memcached)是一种惊人的缓存。但是,根据您的用例,“锡拉”可能是正确的选择。