问题描述
我有一个 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 小时或类似情况,在您导入的最后一次。
问候,马丁