Поиск по нескольким значениям в ключе / значении redis

#node.js #redis

#node.js #redis

Вопрос:

Мне сказали использовать Redis для пользователей, прошедших проверку подлинности в моем приложении на Heroku, поэтому я решил подключиться сегодня. То, что я хочу сделать, это сохранить хэши пользователей в хранилище Redis следующим образом:

 {
   id:4532143215432,
   username:'davejlong',
   email:'dave@davejlong.com'
}
  

И затем я хочу иметь возможность поиска по имени пользователя или идентификатору. Возможно ли это каким-либо образом с Redis?

Я использую node.js модуль redis, который поддерживает любую команду redis https://github.com/mranney/node_redis

Ответ №1:

В @orangeoctopus usecae есть несколько проблем.

redis 127.0.0.1: 6379> Идентификатор HMSET: 4532143215432 имя пользователя davejlong emaildave@davejlong.com OK redis 127.0.0.1:6379> Пользователь HMSET: davejlong id 4532143215432 электронная почта dave@davejlong.com Хорошо

Это приведет к дублированию, подумайте о добавлении новых значений и удалении и обновлении.

Поэтому я предпочитаю это

 SET user:davejlong 1
HMSET user:1 username davejlong email dave@davejlong.com 
  

1) В случае имени пользователя

  redis.get('user:davejlong',function(err,id){
     console.log('User Id of @davejlong: '   id);
     redis.hgetall('user:' id,function(err,user){
        console.log('User Data: '   user);
     })
  })
  

2) В случае идентификатора

    redis.hgetall('user:1',function(err,user){
       console.log('User Data: '   user);
    })
  

Комментарии:

1. Я уклонился от этого с помощью «Более компактного способа сделать это …», но был слишком ленив, чтобы напечатать его. 1

2. Извините, я пропустил момент, поскольку вы не добавляете возможность поиска по почте. SET user:dave@davejlong.com 1 и вы можете найти по почте

Ответ №2:

Это так же просто, как запоминать каждого пользователя дважды. Один раз с ключом id и один раз с ключом имени пользователя.

Более компактный способ сделать это с точки зрения памяти — использовать имена пользователей для идентификаторов, поэтому ваш запрос имени пользователя будет выглядеть следующим образом: запрос по имени пользователя, получение идентификатора; ввод идентификатора, получение информации.

К сожалению, не существует хорошего способа, чтобы одни и те же фактические данные вводились двумя разными ключами.


Например, когда вы вставляете нового пользователя, а затем запрашиваете его:

 redis 127.0.0.1:6379> HMSET id:4532143215432 username davejlong email dave@davejlong.com
OK
redis 127.0.0.1:6379> HMSET user:davejlong id 4532143215432 email dave@davejlong.com
OK
redis 127.0.0.1:6379> HGET id:4532143215432 username
"davejlong"
redis 127.0.0.1:6379> HGET user:davejlong id
"4532143215432"
redis 127.0.0.1:6379> HMGET user:davejlong email id
1) "dave@davejlong.com"
2) "4532143215432"
redis 127.0.0.1:6379> DEL user:davejlong
(integer) 1
redis 127.0.0.1:6379> DEL id:4532143215432
(integer) 1
  

Обратите внимание, что когда я создаю пользователя, я использую HMSET дважды. Теперь я могу запрашивать либо имя пользователя, либо идентификатор. Теперь мне также нужно удалить оба ключа.

Комментарии:

1. Не могли бы вы показать мне, как я мог бы сделать это в CLI? Я новичок во всем этом redis, поэтому я не уверен, использовать ли хэш, список и т. Д.

2. Здесь вы создаете дублирующиеся данные. Рассмотрим использование индексов.