当前位置: 首页 > 面试题库 >

快速迭代Redis DB中所有键和值的方法

徐嘉谊
2023-03-14
问题内容

我有大约350,000个密钥的数据库。目前,我的代码只是循环遍历所有键,并从db获取其值。

但是,这花费了将近2分钟的时间,这似乎确实很慢,达到redis-benchmark了10万次请求/ 3秒。

我已经研究过流水线技术,但是我需要返回每个值,以便最终得到键值对的字典。

目前,我正在考虑在代码中使用线程来加快速度,这是处理此用例的最佳方法吗?

这是我到目前为止的代码。

import redis, timeit
start_time = timeit.default_timer()
count = redis.Redis(host='127.0.0.1', port=6379, db=9)
keys = count.keys()

data = {}

for key in keys:
    value = count.get(key)
    if value:
        data[key.decode('utf-8')] = int(value.decode('utf-8'))

elapsed = timeit.default_timer() - start_time

print('Time to read {} records: '.format(len(keys)), elapsed)

问题答案:

首先,最快的方法是在EVAL中完成所有这些操作。

接下来,推荐的迭代所有密钥的方法是SCAN。它的迭代速度不会比快KEYS,但是将允许Redis在其之间处理一些其他操作,因此将有助于整体应用程序行为。

该脚本将类似于local data={} local i=1 local mykeys=redis.call(\"KEYS\",\"*\") for k=1,#mykeys do local tmpkey=mykeys[k] data[i]={tmpkey,redis.call(\"GET\",tmpkey)} i=i+1 end return data,但是如果您具有GET无法访问的键(如集,列表),它将失败。您需要为其添加错误处理。如果需要排序,则可以直接在LUA中进行,也可以稍后在客户端进行。第二个会比较慢,但是不会让其他Redis实例用户等待。

样本输出:

127.0.0.1:6370> eval "local data={} local i=1 local mykeys=redis.call(\"KEYS\",\"*\") for k=1,#mykeys do local tmpkey=mykeys[k] data[i]={tmpkey,redis.call(\"GET\",tmpkey)} i=i+1 end return data" 0
1) 1) "a"
   2) "aval"
2) 1) "b"
   2) "bval"
3) 1) "c"
   2) "cval"
4) 1) "d"
   2) "dval"
5) 1) "e"
   2) "eval"
6) 1) "f"
   2) "fval"
7) 1) "g"
   2) "gval"
8) 1) "h"
   2) "hval"


 类似资料:
  • 问题内容: 我得到这样的定义:顾名思义,快速失败的迭代器一旦意识到 自迭代开始以来 就已经改变了Collection的结构,它就会失败。 自迭代开始以来 是什么意思?是在 Iterator it = set.iterator()之后的 这行代码的意思吗? 问题答案: 首先,它们是 快速 故障的,而不是故障 安全的 。 合同规定,对某些类型的集合进行结构修改(即插入/删除)会使集合中的现有迭代器无效

  • 本文向大家介绍python-序列解包(对可迭代元素的快速取值方法),包括了python-序列解包(对可迭代元素的快速取值方法)的使用技巧和注意事项,需要的朋友参考一下 一般情况下 对元祖序列解包 对列表序列解包 对dict序列解包获得key和value 以上这篇python-序列解包(对可迭代元素的快速取值方法)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 我正在尝试迭代以下JSON: 这里的键是动态的。我要两个钥匙=?值=?

  • 1 谱聚类算法的原理   在分析快速迭代聚类之前,我们先来了解一下谱聚类算法。谱聚类算法是建立在谱图理论的基础上的算法,与传统的聚类算法相比,它能在任意形状的样本空间上聚类且能够收敛到全局最优解。 谱聚类算法的主要思想是将聚类问题转换为无向图的划分问题。 首先,数据点被看做一个图的顶点v,两数据的相似度看做图的边,边的集合由$E=A_{ij}$表示,由此构造样本数据集的相似度矩阵A,并求出拉普拉斯

  • 本文向大家介绍Java迭代快速排序程序,包括了Java迭代快速排序程序的使用技巧和注意事项,需要的朋友参考一下 下面是用于迭代快速排序的Java程序 示例 输出结果 一个名为Demo的类包含3个函数,“swap”用于使用临时变量交换值,一个“partition”函数根据主元素值将数组分为两半,以及“quick_sort”函数,该函数使用主元素值并基于该值对数组中的值进行排序。 在main函数中,将

  • 我使用以下行对Sqlite查询的行进行循环。 当行数大约为15000时,需要很长时间。空的块需要大约4秒,而有一些代码的