Redis - Total Keys in Cluster - redis

I want to check total number of keys in Redis Cluster.
Is there any direct command available to get this or I have to check with INFO command from each instance / node.

There is no direct way.
You can do the following with the cli though:
redis-cli --cluster call one-cluster-node-ip-address:the-port DBSIZE
And then sum the results.
Alternatively, there's RedisGears with which you can do the following to get the same result:
redis> RG.PYEXECUTE "GB().count().run()"

Related

Redis - How to delete fields from the redis hashmap stored at the key using prefix pattern?

I have want to delete field in redis hash by pattern (more specifically prefix). I tried following and it doesn't work.
hdel <some_key> <prefix>*
How to achieve this ?
By default, Redis does not provide a way to bulk remove keys that match a specific pattern. However, we can leverage the power of the command line to perform this action.
We will use the xargs to build and run commands back to Redis for this one. An example is as shown below:
redis-cli --scan --pattern "prefix*" | xargs redis-cli del

Is there a way to use pattern matching to remove redis keys in bulk?

I have hundreds of thousands of keys that start with html: that I need to clean up quickly. Instead of writing a python script to do this, I was hoping for a simple command via redis-cli to do this. I was surprised to not find one. I am assuming I can do something with xargs from the linux terminal but I need to also pass in the auth password to redis.
After some munging and experimentation, I found this combination to work perfectly to remove all the keys I needed that match the beginning from left to right in the key name itself. It was very fast to run, which is no surprise since redis is in memory.
redis-cli -a <mypassword> --raw keys "html:*" | xargs redis-cli -a <mypassword> del

Redis keys are saved two times ..checking from dbsize command

I am saving no.of(1000) records in Redis DB , while checking in redis CLI dbsize as its exactly double actually. Can any one having any idea why its saved double? Thanks!

How to delete keys matching a pattern in Redis Cluster

I have tried method in this question, but it does not work since I'm working in cluster mode, and redis told me:
(error) CROSSSLOT Keys in request don't hash to the same slot
Answers for that question try to remove multiple keys in a single DEL. However, keys matching the given pattern might NOT locate in the same slot, and Redis Cluster DOES NOT support multiple-key command if these keys don't belong to the same slot. That's why you get the error message.
In order to fix this problem, you need to DEL these keys one-by-one:
redis-cli --scan --pattern "foo*" |xargs -L 1 redis-cli del
The -L option for xargs command specifies the number of keys to delete. You need to specify this option as 1.
In order to remove all keys matching the pattern, you also need to run the above command for every master nodes in your cluster.
NOTE
With this command, you have to delete these keys one-by-one, and that might be very slow. You need to consider re-designing your database, and use hash-tags to make keys matching the pattern belong to the same slot. So that you can remove these keys in a single DEL.
Either SCAN or KEYS command are inefficient, especially, KEYS should not be used in production. You need to consider building an index for these keys.
Building on for_stack's answer, you can speed up mass deletion quite a bit using redis-cli --pipe, and reduce the performance impact with UNLINK instead of DEL if you're using redis 4 or higher.
redis-cli --scan --pattern "foo*" | xargs -L 1 echo UNLINK | redis-cli --pipe
Output will look something like this:
All data transferred. Waiting for the last reply...
Last reply received from server.
errors: 0, replies: 107003
You do still need to run this against every master node in your cluster. If you have a large number of nodes, it's probably possible to automate the process further by parsing the output of CLUSTER NODES.
redis-cli provides a -c option to follow MOVED redirects. However, it should be deleted one at a time because you cannot guarantee two keys will be in the same node.
redis-cli -h myredis.internal --scan --pattern 'mycachekey::*' | \
xargs -L 1 -d'\n' redis-cli -h myredis.internal -c del
The first part provides a list of keys --scan prevents Redis from locking. xargs -L 1 runs the command for one entry at a time. -d'\n' disables the processing of quotes so you can have quoted strings like "SimpleKey[hello world]" be passed to the command otherwise the spaces will make it have two keys.

Redis benchmark command - Does it allow to define value contents and datatype

I am exploring the Redis benchmark tool and I looked at this web page: How fast is Redis?
I pick the below command for example:
$ ./redis-benchmark -r 1000000 -n 2000000 -t get,set,lpush,lpop -q
I see that we can specify the type of operations, such as get, set, lpush etc. However, how do we know what datatypes are being used for values in these operations? Also, is there a way to specify your own data that can be consumed by the benchmark command?
how do we know what datatypes are being used for values in these operations?
By default, xxx is used as value.
is there a way to specify your own data that can be consumed by the benchmark command?
You can use the command line argument -d to specify the length of value, e.g. use redis-benchmark -d 10 to use xxxxxxxxxx, i.e. 10 characters, as value.
You can explicitly specify the command that you want to test, e.g. use redis-benchmark -n 10000 SET your-key your-value to run SET command 10000 times.
Run redis-benchmark --help to see other options.