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


当前回答

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

其他回答

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

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

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

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

看看下面的Redis小抄。 要使用redis-cli获取一个redis键的子集,我使用这个命令

KEYS "prefix:*"

是的,你可以通过使用这个得到所有的钥匙

var redis = require('redis');
redisClient = redis.createClient(redis.port, redis.host);    
  redisClient.keys('*example*', function (err, keys) {
})

对于那些需要typescript helper的人(使用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');

在Redis中获得所有键

使用——scan选项获取所有键:

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

使用keys命令列出所有密钥:

$ redis-cli KEYS '*'