Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to search in redis for hash keys?

Tags:

redis

I'm using hash keys to store user details like:

 hmset user:1 user_name lee  age 21
 hmset user:2 user_name david  age 25
 hmset user:3 user_name chris  age 25

I need to search for users having age = 25, name = lee. How to do a search for a specified value in a given field?

like image 616
Heera Avatar asked Jul 13 '12 12:07

Heera


People also ask

Does Redis hash key?

Redis Hash is a data structure available in Redis that stores the mapping of keys to values. Here, both the key and the value are strings. The key-value pairs are unordered. Keys are unique and no duplicates are allowed.

Can we search by value in Redis?

Newer Secondary Indices with RediSearch zeeSQL is a novel Redis modules with SQL and secondary indexes capabilities, allowing search by value of Redis keys. You can set it up in such a way to track the values of all the hashes and put them into a standard SQL table.

How do I get all Redis keys?

To list the keys in the Redis data store, use the KEYS command followed by a specific pattern. Redis will search the keys for all the keys matching the specified pattern. In our example, we can use an asterisk (*) to match all the keys in the data store to get all the keys.

Which stores Redis hash?

Redis Hashes are maps between the string fields and the string values. Hence, they are the perfect data type to represent objects. In Redis, every hash can store up to more than 4 billion field-value pairs.


2 Answers

You cannot. Redis is a key-value store, not a relational database.

In order to search for a specific data, you need to build an access path to this data. For instance, to get the users having age = 25, you need to build an index to map the age values to users. It can be done with a set. This is the same for the name.

Once you have sets for age and name, you can search users by intersecting the sets. For example:

# Add 3 users
hmset user:1 user_name lee age 21
hmset user:2 user_name david age 25
hmset user:3 user_name chris age 25

# Maintain age index
sadd age:21 1
sadd age:25 2 3

# Maintain name index
sadd name:lee 1
sadd name:david 2
sadd name:chris 3

# Get the ID of users having age = 25 and name = lee
sinter age:25 name:lee
  -> will return an empty set
like image 115
Didier Spezia Avatar answered Oct 06 '22 01:10

Didier Spezia


Acually You can do it with put values in key

HMSET lee:25 user_name lee age 25
HMSET massi:43 user_name massi age 43
HMSET lee:24 user_name lee age 24
HMSET lee:28 user_name lee age 28 city Berlin

Now you can find them with "keys" command

127.0.0.1:6379> keys *:25
1) "lee:25"
127.0.0.1:6379> keys lee*
1) "lee:25"
2) "lee:24"
3) "lee:28"
127.0.0.1:6379> keys massi:43
1) "massi:43"

Finally find specific hashes

127.0.0.1:6379> HGETALL lee:24
1) "user_name"
2) "lee"
3) "age"
4) "24"

All that I said is that you can do it in two steps put any number of values that you need in key then find them. But consider that it's not a good idea to put all values inside key Just put ones that you need to do filtering with. Cheers :)

like image 22
coditori Avatar answered Oct 06 '22 00:10

coditori