Есть ли способ связать объекты в чате с помощью Redis? - PullRequest
0 голосов
/ 25 апреля 2020

Я пытаюсь создать комнату чата и хочу сохранить дополнительную информацию, такую ​​как: псевдоним, время и аватар, а затем связать их с сообщением.

Я мог бы использовать «:» для разделения некоторых свойств, но это не звучит элегантно!

$list = "message_history";
$message = $data['nickname'] . ':' . $data['message'];
Redis::lpush($list, $message);

Есть ли элегантный способ сделать это с помощью Redis?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2020

В итоге я использовал ха sh 'hset'. И, дав каждому сообщению идентификатор и сохранив их в отдельном списке, я смог получить доступ ко всем сообщениям через этот список.

0 голосов
/ 25 апреля 2020

Поскольку вы упомянули в своих комментариях, у вас будет одна чат-комната, redis lists работает для чата.

  • Элементами будут sorted in insertion order (хорошо для временной шкалы чата)
  • Один список поддерживает более 4 миллиардов элементов (вероятно, более чем достаточно)
  • Вы можете использовать LPUSH / RPUSH для добавления нового сообщения, и поскольку списки Redis реализованы с помощью linked lists, добавление сообщения в начало или конец списка одинаково, O (1), что отлично ,
  • Используйте LRANGE для разбиения на страницы сообщений с start и end. было бы не выгодно получать все сообщения одновременно, возможно, у вас есть возможные проблемы с памятью, сетью, будьте осторожны при использовании LRANGE для большого списка с высоким смещением с обеих сторон.
  • Если вы собираетесь оставляйте в списке только последние n сообщений (в зависимости от ваших бизнес-правил), тогда вы можете использовать LTRIM.
  • Не думаю, что вам понадобится конкретное c сообщение для чата publi c, потому что LINDEX - это O (n) (кроме первого и последнего). если вам понадобится, внимательно обдумайте.

Это тест для LRANGE из официальной документации redis;

  • LRANGE (первые 100 элементов): 42123,00 запросов в секунду
  • LRANGE (первые 300 элементов): 15015,02 запросов в секунду
  • LRANGE (первые 450 элементов): 10159,50 запросов в секунду
  • LRANGE (первые 600 элементов): 7548,31 запросов в секунду

Редактировать:

В вашем случае вы можете добавить sh элементов в username:avatar:time:message format и проанализировать их, когда вы нужно для отображения. Вы рассматриваете возможность сохранения пользователей в структуре ha sh и сохранения всех связанных с ними свойств в хешах и создания сообщений в формате userId:time:message. оба варианта в порядке.

...