使用 Python 将庞大的数据库从 sqlite 迁移到 Redis

问题描述

我有一个 sqlite 数据库 (16G)。表中有三列(起点、目的地、距离)。我想将数据库导出到 Redis,以便按来源和目的地进行更快的查询。目前,我使用以下代码导出到Redis

conn = sqlite3.connect(dbfile)    
cur = conn.cursor()
r = redis.Redis()

# I loop the following code
cur.execute("SELECT o,d,disT FROM network LIMIT [startloc] OFFSET [offset];")
distlist = cur.fetchall()
records = {'{},{}'.format(o,d): disT for o,disT in distlist}
with r.pipeline() as pipe:
    pipe.mset(records)
    pipe.execute()
r.save()

但是,即使我不需要同步写入,我也无法使用多进程来加速导出,因为我使用了 SAVE 命令。我可以使用 BGSAVE 来解决问题吗?或者还有其他解决方案吗?谢谢!

解决方法

我认为您在这里混淆了 Redis 中的两个概念:

  • 管道:一次向 Redis 发送多个命令,并立即获得对所有命令的响应,以节省网络流量。
  • 持久性:将 Redis 的内容保存到磁盘,因为 Redis 是默认的内存数据库,即不使用 SAVE 或 BGSAVE。

Redis 中的管道只有在您将 1 个以上的命令组合在一起时才有意义,而在您发布的示例中并非如此。尝试多次调用 MSET(例如 10k)并调用执行一次。

写入磁盘肯定是有道理的,但不要超过一次,例如每隔 1 小时或类似情况,在您导入的最后一次。

问候,马丁