在我的用例中,数据相对较小(~1000.000字符串),但我必须从多线程环境(以纯Java实现)中尽可能快地访问(每纳秒计数) 目前我正在使用 redis (在localhost中),我对它基本满意,但我想知道是否有更好的选择,因为redis拥有所有网络资源,并不是为多线程设计的。对于我的用例,持久性也是非常低的优先级。
我不想:
答案 0 :(得分:6)
有许多优秀的NoSQL数据库可用作键值存储。每个人都有独特的能力。
Redis在单个服务器中非常棒,并且易于安装和使用。但是,当您的数据超出单个服务器时,Redis很难进行分片和管理。
Thumbtack Technologies(纽约市)发表了两篇白皮书,比较了MongoDB,Cassandra和Aerospike的性能和可靠性。这些论文非常客观,使用YCSB基准测试工具完成的基准测试是在同一硬件上进行的。
使用哪一个取决于您的需求。 MongoDB是一个功能丰富的键值存储,具有许多优秀的程序员功能。它提供对二级索引的查询,是一个非常好的文档存储。它是一个内存数据库,因此所有数据都必须适合RAM。 Mongo可以聚集在一起,我听说如果你有一个大型集群,那就很难管理。
CouchBase非常适合存储大量数据,并且部分数据缓存在RAM中。因此,如果你所追求的值在缓存工作集中,它会很快。如果您的用例主要用于热数据并且不经常访问冷数据,那么这非常有用。
Cassandra非常适合'写重'用例。它易于使用,是一个很好的程序员经验。它是用Java编写的,并且在执行GC时会定期暂停,因此您需要调整GC参数。
Aerospike适用于在少量服务器中存储大量数据。它拥有单位数毫秒(或更好)的延迟,高可用性和高可靠性,它可能(恕我直言)最容易维护和扩展。它具有多代码感知功能,可识别NUMA节点并具有自我修复的零触摸群集技术。这对于“实时”用例来说非常棒,因为访问任何记录都需要快速且可预测。 Aerospike是我最喜欢的。
Cassandra,CouchBase,MongoDB和Aerospike都具有“分析”功能,您选择哪一个取决于用例和性能范围。
答案 1 :(得分:0)
你有一百万个字符串?
这是一小部分数据。如果你想要速度比没有什么比在应用程序代码本身内部使用内存数据结构更快。只需将所有数据存储在一个文件中,在程序启动时加载到一个列表中,然后在需要保存时将其序列化回文件。
避免运行和与数据库交互的所有开销 - 尤其是你不关心持久性。
一个简单的平面文件,每行是一个单独的字符串,读取和解析大约需要100毫秒。