我正在寻找NoSQL DB推荐......这就是我正在做的事情:
我正在编写一个基于Web的客户端,用于向大量消费者提供文本流(基本上是实时字幕)。一旦事情完全发展,任何特定时刻都可能发生100多个事件。许多人会很小(<10个消费者),但其中一些可能相当大(10,000多个同时消费者,可能更多?)。
在每个活动的过程中,文本将以每分钟几个字到每分钟200多个字的速度累积。每个消费者将运行一个Web客户端(桌面/笔记本电脑/平板电脑/智能手机上的浏览器),它将定期轮询它尚未收到的任何文本。给定用户也可以在他们发出请求之前询问事件的全文。已完成的活动必须坚持一段时间,但将在完成后的24-36小时内删除。
我的第一个想法是使用Redis,它具有在数据存储区中附加文本值的方法,以及从文本值末尾获取子字符串的内置支持(即客户端可以只保存字符它收到的最后一个字符的偏移量,并将其传递给客户端API,并用于从事件文本中提取子字符串)。我担心,包含事件文本的字符串的增长可能是Redis的一种不寻常的使用,并且可能会引起一些问题。
那么......是否有NoSQL DB似乎特别适合这种应用程序?是否有任何重要原因不使用Redis这样的东西?
答案 0 :(得分:0)
一个基本的开放性问题是如何处理新客户。例如,假设一个事件已经开始,有人连接了几分钟。他们从一开始还是从他们连接时都需要一切?
如果是后者,我建议使用消息系统,而不是将字符串附加到字符串。一种方法是使用Redis'Pub/Sub代替。这似乎更适合整体,尤其是如果新连接从一开始就不需要所有东西。对于长期存储,客户端可以像任何其他客户端一样监听存档条目 - 最好是通过本地缓存,然后在完成或正在进行时上传完成的成绩单。我将实时需求和代码与请求历史记录和档案分开。
另一种方法是使用有序集,使用时间戳作为输入的时间。因此,客户端仅跟踪上次更新并从该时间开始检索任何内容。可以找到有序集文档here。该方法还提供从转录物中选择时间区域的能力。通过一些数学运算,您甚至可以从成绩单视角重播事件,就好像它是实时的一样。如果你有成千上万的客户在每个民意调查中提取整个成绩单
时间戳有序集的另一个优点是字符串编码。使用Redis字符串和getrange时,必须使用固定宽度编码。范围是字节偏移,而不是字符偏移。如果你需要支持的能力,比如说UTF-8,这对你来说可能是一个问题。
第三种选择是将一串文本附加到列表中。这类似于排序集,除了您的客户端存储最后一个索引(列表的大小),并且每次轮询尝试从lastIndex + 1到结尾获取任何内容。