是否有用于获取数据库中所有键的 Redis 命令?我已经看到一些 python-redis 库获取它们。但想知道是否可以从 redis-client 获得。
16 回答
针对 Redis 2.8 及更高版本更新
正如该问题先前答案的评论中所述,这KEYS
是一个潜在危险的命令,因为您的 Redis 服务器在服务时将无法执行其他操作。另一个风险KEYS
是它可能会消耗(取决于您的密钥空间的大小)大量 RAM 来准备响应缓冲区,因此可能会耗尽服务器的内存。
Redis 2.8 版引入了SCAN系列命令,这些命令更加礼貌,可用于相同目的。
CLI 还提供了一种使用它的好方法:
$ redis-cli --scan --pattern '*'
使用 redis-cli 可能会连接到远程 redis 服务器,然后使用以下命令:
KEYS *
没有显示任何内容,或者更好的是,它显示:
(empty list or set)
如果您绝对确定您使用的 Redis 服务器就是您拥有数据的服务器,那么您的 redis-cli 可能没有连接到 Redis 正确的数据库实例。
正如 Redis 文档中提到的,新连接默认连接到db 0。
在我的情况下KEYS
,命令没有检索结果,因为我的数据库是 1。为了选择您想要的数据库,请使用SELECT。
db 由整数标识。
SELECT 1
KEYS *
我发布此信息是因为以前的答案都没有解决我的问题。
--> 从 redis-cli 获取所有密钥
-redis 127.0.0.1:6379> keys *
-->获取模式列表
-redis 127.0.0.1:6379> keys d??
这将产生以 'd' 开头的三个字符的键。
-redis 127.0.0.1:6379> keys *t*
这将获得在键中匹配 't' 字符的键
--> 从命令行计算键
-redis-cli keys * |wc -l
-->或者你可以使用dbsize
-redis-cli dbsize
看看下面的Redis 备忘单。要使用 redis-cli 获取 redis 键的子集,我使用命令
KEYS "prefix:*"
获取 Redis 中的所有键
使用 --scan 选项获取所有密钥:
$ redis-cli --scan --pattern '*'
使用 KEYS 命令列出所有键:
$ redis-cli KEYS '*'
是的,您可以使用此获取所有密钥
var redis = require('redis');
redisClient = redis.createClient(redis.port, redis.host);
redisClient.keys('*example*', function (err, keys) {
})
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
redis-cli -h <host> -p <port> keys *
其中 * 是列出所有键的模式
键模式
从 1.0.0 开始可用。
时间复杂度:O(N),其中 N 是数据库中的键数,假设数据库中的键名和给定模式的长度有限。
返回所有匹配模式的键。
警告:不建议使用此命令,因为它可能会在针对大型数据库而不是 KEYS 执行时破坏性能,您可以使用SCAN或SETS。
要使用的 KEYS 命令示例:
redis> MSET firstname Jack lastname Stuntman age 35
"OK"
redis> KEYS *name*
1) "lastname"
2) "firstname"
redis> KEYS a??
1) "age"
redis> KEYS *
1) "lastname"
2) "age"
3) "firstname"
为了获得 redis 服务器中可用的所有密钥,您应该打开 redis-cli 并输入:
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"
我们应该在 redis 2.8 及更高版本中使用 --scan --pattern。
你可以尝试在 redis-cli 上使用这个包装器。 https://github.com/VijayantSoni/redis-helper
如果您使用的是 Laravel 框架,那么您可以简单地使用:
$allKeyList = Redis::KEYS("*");
print_r($allKeyList);
在核心 PHP 中:
$redis = new Redis();
$redis->connect('hostname', 6379);
$allKeyList = $redis->keys('*');
print_r($allKeyList);
您可以简单地使用 redis-cli 连接到您的 redis 服务器,选择您的数据库并输入 KEYS *,请记住它会为您提供所选 redis 数据库中存在的所有密钥。
对于那些想要打字稿助手的人(使用 ioredis)
import Redis from 'ioredis';
import { from, Observable, of } from 'rxjs';
import { first, mergeMap } from 'rxjs/operators';
export function scanKeysFromRedis(redisStore: Redis.Redis, key: string,
target: number = 0, keys: string[] = []): Observable<string[]> {
return from(redisStore.scan(target, 'MATCH', key)).pipe(
first(),
mergeMap((_keys) => {
const _target = Number(_keys[0]);
if (_target !== 0) {
return scanKeysFromRedis(redisStore, key, _target, [...keys, ..._keys[1]]);
}
return of([...keys, ..._keys[1]]);
}),
);
}
并调用它:scanKeysFromRedis(store, 'hello') ;