0.1.3 • Published 7 years ago

scan-hkeys v0.1.3

Weekly downloads
6
License
ISC
Repository
github
Last release
7 years ago

scan-hkeys

Containerized utility to scan Redis keys and print hkeys of any hashes.

Config

See lib/spec.js

    pattern: {
        description: 'the matching pattern for Redis scan',
        example: '*'
    },
    port: {
        description: 'the Redis port',
        default: 6379
    },
    host: {
        description: 'the Redis host',
        default: 'localhost'
    },

where the default Redis host is localhost

Implementation

See app/index.js

    let cursor;
    while (true) {
        const [result] = await multiExecAsync(client, multi => {
            multi.scan(cursor || 0, 'match', config.pattern);
        });
        cursor = parseInt(result[0]);
        const keys = result[1];
        const types = await multiExecAsync(client, multi => {
            keys.forEach(key => multi.type(key));
        });
        const hashesKeys = keys.filter((key, index) => types[index] === 'hash');
        if (hashesKeys.length) {
            count += hashesKeys.length;
            const results = await multiExecAsync(client, multi => {
                hashesKeys.forEach(key => multi.hkeys(key));
            });
            hashesKeys.forEach((key, index) => {
                const result = results[index];
                console.log(`${clc.cyan(key)} ${result.join(' ')}`);
            });

Development

For development, you can run as follows:

git clone https://github.com/evanx/scan-hkeys.git
cat package.json
npm install
pattern='*' npm start

Docker

docker build -t scan-hkeys https://github.com/evanx/scan-hkeys.git

where tagged as image scan-hkeys

docker run --network=host -e pattern='*' scan-hkeys

where --network-host connects the container to your localhost bridge. The default Redis host localhost works in that case.

Since the containerized app has access to the host's Redis instance, you should inspect the source.

See Dockerfile

FROM mhart/alpine
ADD package.json .
RUN npm install --silent
ADD lib lib
CMD ["node", "lib/index.js"]

Demo script

See scripts/demo.sh

docker network create -d bridge test-hkeys-network
container=`docker run --network=test-hkeys-network \
  --name test-hkeys-redis -d tutum/redis`
password=`docker logs $container | grep '^\s*redis-cli -a' |
  sed -e 's/^\s*redis-cli -a \(\w*\) .*$/\1/'`
redisHost=`docker inspect $container |
  grep '"IPAddress":' | tail -1 | sed 's/.*"\([0-9\.]*\)",/\1/'`
redis-cli -a $password -h $redisHost hset mytest:64:h name 'Pottery Place'
redis-cli -a $password -h $redisHost hset mytest:64:h address '48 High Street'
docker run --network=test-hkeys-network \
  -e host=$redisHost -e password=$password \
  -e pattern=mytest:*:h evanxsummers/scan-hkeys
docker rm -f `docker ps -q -f name=test-hkeys-redis`
docker network rm test-hkeys-network

where we create an isolated Redis container and use redis-cli to create hashes with the following two fields:

redis-cli -a $password -h $redisHost hset mytest:64:h name 'Pottery Place'
redis-cli -a $password -h $redisHost hset mytest:64:h address '48 High Street'

and invoke the utility from the Dockerhub image evanxsummers/scan-hkeys

docker run --network=test-hkeys-network \
  -e host=$redisHost -e password=$password \
  -e pattern=mytest:*:h evanxsummers/scan-hkeys

which prints a line for the key with its two field names from hkeys

mytest:64:h name address

https://twitter.com/@evanxsummers