【问题标题】:Migrate huge database from sqlite to Redis with Python使用 Python 将大型数据库从 sqlite 迁移到 Redis
【发布时间】:2021-05-11 10:00:23
【问题描述】:

我有一个 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, d, DIST in distlist}
with r.pipeline() as pipe:
    pipe.mset(records)
    pipe.execute()
r.save()

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

【问题讨论】:

  • 您是否在每个循环中调用conn = sqlite3.connect(dbfile) r = redis.Redis()?为什么你还要在每个循环中调用 save?
  • @GuyKorland 感谢您的提问!我修改了问题中关于循环的部分。如果我在所有 mset 之后调用 save 并执行命令,我会收到一条错误消息“后台保存已在进行中”。
  • 你应该在最后调用一次
  • @GuyKorland 我也应该在最后调用执行一次吗?因为我在最后调用 save 时遇到了错误。

标签: python sqlite redis export migrate


【解决方案1】:

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

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

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

写入磁盘肯定是有意义的,但不要超过一次,例如在您的导入结束时每 1 小时或类似情况。

问候,马丁

【讨论】:

  • 我明白了。谢谢!
猜你喜欢
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 2014-07-05
  • 2016-09-04
  • 2019-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多