我的redis数据库目前有一个大的哈希表-大约130m个键/值对,其中每个键和值都是一个整数(显然存储为字符串)。哈希在数据库中工作正常,并且每个redis.info()消耗的内存小于64gb系统总内存的10gb:
'used_memory_human': '9.05G'
创建此散列的计算成本很高,需要5.5小时才能跨16个核完成。因此,我希望能够将哈希表转储到磁盘,并在启动应用程序时还原它。我能够使用以下方法成功地将哈希表转储到磁盘:
rdb = redis.Redis()
def dump_lookup_table():
with open('redis_dumps/full_hash.rdb', 'wb') as full_hash_file:
full_hash_file.write(rdb.dump("my_redis_hash"))
这将导致一个2.4gb的文件保存到相关文件夹中。问题是当我尝试从文件还原哈希时:
def restore_lookup_table():
with open('redis_dumps/full_hash.rdb', 'rb') as full_hash_file:
rdb.restore("my_redis_hash", 0, full_hash_file.read())
ConnectionError: Error 104 while writing to socket. Connection reset by peer.
我用散列的一个子部分(大约25m条记录)进行了测试,这是一个磁盘上约900mb的文件。这将成功地恢复,因此问题似乎是redis接受这个非常大的文件进行恢复的限制。
在查看文档时,我似乎达到了这里描述的查询缓冲区硬限制,即将最大客户端缓冲区限制为1gb。除非我误读了docs和/或redis.conf文件,否则这似乎是不可配置的,所以我不能增加它以允许恢复2.4gb rdb转储。
我发现一个潜在的解决方法是创建一个中间临时has,我将一个子集的键复制到其中,然后将散列转储到rdb并删除它。然后,我可以分别恢复临时散列,并将密钥复制到所需的单个散列中。这是可行的,但与单个散列的简单转储/恢复相比,速度非常非常慢。
有没有一种普遍接受的方法来转储/恢复这样相对较大的散列?或者是否有任何方法可以覆盖或绕过客户端缓冲区上的1gb硬限制?
暂无答案!
目前还没有任何答案,快来回答吧!