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


当前回答

对于那些需要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-cli -h <host> -p <port> 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');

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获取所有密钥

-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

键模式

自1.0.0起可用。 时间复杂度:O(N), N为数字 数据库中的键,假设键名在 数据库和给定模式的长度是有限的。

返回所有匹配模式的键。

警告:不建议使用此命令,因为它可能会破坏性能,当它针对大型数据库执行时,可以使用SCAN或SETS代替KEYS。

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"