gpt4 book ai didi

sqlite - 用于存储基于大型集合/数组的数据的高写入并发后端?

转载 作者:可可西里 更新时间:2023-11-01 11:13:11 25 4
gpt4 key购买 nike

问题:
我有一个 Web 服务需要根据一组字符串检查给定字符串的成员资格,其中该集合中的元素数量将不断增长,可能达到数亿。

如果该字符串不是集合的成员,则将其添加到集合中。字符串大小将是一个常量 32 字节。只需要一个设置变量,不需要持久化其他变量。

此检查作为 webhook 回调的一部分执行,因此性能至关重要。

虽然我的用例非常适合布隆过滤器,但我很难找到解决方案来处理问题的持久存储与 I/O 并发部分。

环境:DigitalOcean/Linux/Python/Flask,但如果需要可以更改

可能的解决方案:

redis,将变量存储在一个集合中,然后通过 sismember 查询一个很好的基于 o(1) 的解决方案。这就是我们目前正在使用的方法,但由于所有内容都必须适合内存,因此该解决方案无法很好地扩展大量键,并且在流量增加时它还会出现写入并发问题。

sqlite,打开 WAL 模式。当服务器受到大量 webhook 请求 (SQLITE_BUSY) 攻击时,担心锁争用。本地服务器文件不能跨主机扩展。

postgres,似乎是一个很好的中间立场解决方案,但可能还必须处理此处的锁争用以及写入并发。

cassandra,因为它专注于写入性能。存储单列是否有点矫枉过正?

自定义 bloom 过滤器后端,不确定是否存在类似这样的东西可以提供具有高 i/o 并发存储后端的 bloom 过滤器的功能。

想法?

最佳答案

Redis 解决方案可以通过数据分片很好地扩展。您可以设置多个 Redis 实例(或使用 Redis-Cluster ),将您的数据分成几个部分,即分片,并将每个部分保存在不同的 Redis 实例中。

当您想检查给定字符串的成员资格时,您可以向相应的 Redis 实例发送 sismenber 命令。取this answer作为如何使用散列函数拆分数据的示例。

此外,您还可以使用 Redis(GETBITSETBIT)实现布隆过滤器。提醒一下,布隆过滤器存在误报问题。

关于sqlite - 用于存储基于大型集合/数组的数据的高写入并发后端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39727998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com