是否有一个Redis命令获取数据库中的所有键?我见过一些python-redis库获取它们。但我想知道从redis-client是否可以。


当前回答

针对Redis 2.8及以上版本更新

正如在之前回答这个问题的评论中所指出的,KEYS是一个潜在的危险命令,因为您的Redis服务器在服务时将不可用,无法执行其他操作。使用KEYS的另一个风险是,它可能会消耗(取决于密钥空间的大小)大量RAM来准备响应缓冲区,因此可能耗尽服务器的内存。

Redis的2.8版引入了SCAN系列命令,这些命令更加礼貌,可以用于相同的目的。

CLI还提供了一种很好的方式来使用它:

$ redis-cli --scan --pattern '*'

其他回答

试着看看KEYS命令。KEYS *将列出redis中存储的所有键。

编辑:请注意KEYS文档页顶部的警告:

时间复杂度:O(N), N为数据库中的键数,假设数据库中的键名和给定模式的长度有限。

UPDATE (V2.8或更高版本):SCAN是KEYS的更好替代方案,因为它不会阻塞服务器,也不会消耗大量资源。更喜欢使用它。

如果你的redis是一个集群,你可以使用这个脚本

#!/usr/bin/env bash
redis_list=("172.23.3.19:7001,172.23.3.19:7002,172.23.3.19:7003,172.23.3.19:7004,172.23.3.19:7005,172.23.3.19:7006")

arr=($(echo "$redis_list" | tr ',' '\n'))

for info in ${arr[@]}; do
  echo "start :${info}"
  redis_info=($(echo "$info" | tr ':' '\n'))
  ip=${redis_info[0]}
  port=${redis_info[1]}
  echo "ip="${ip}",port="${port}
  redis-cli -c -h $ip -p $port set laker$port '湖人总冠军'
  redis-cli -c -h $ip -p $port keys \*

done

echo "end"

SCAN不像keys那样要求客户端将所有键加载到内存中。SCAN提供了一个可以使用的迭代器。我的redis里有1B条记录,我永远都没有足够的内存来一次性归还所有的键。

下面是一个python代码片段,用于从匹配模式的存储中获取所有键并删除它们:

import redis
r = redis.StrictRedis(host='localhost', port=6379, db=0)
for key in r.scan_iter("key_pattern*"):
    print key

如果你正在使用Laravel框架,那么你可以简单地使用这个:

$allKeyList = Redis::KEYS("*");

print_r($allKeyList);

在核心PHP:

$redis = new Redis();

$redis->connect('hostname', 6379);

$allKeyList = $redis->keys('*');

print_r($allKeyList);

为了获得redis服务器中所有可用的键,你应该打开redis-cli并输入: 键* 为了获得更多帮助,请访问此页面: 这个链接