有没有办法使用 Redis 将属性关联到聊天消息?

Is there a way to associate proprieties to chat messages using Redis?

我正在尝试建立一个聊天室,我想存储其他信息,例如:昵称、时间和头像,然后将它们与消息相关联。

我可能会使用“:”来分隔某些属性,但这听起来不是一种优雅的方式!

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

有没有使用 Redis 的优雅方法?

由于您在评论中提到,您将拥有一个单独的聊天室,redis lists为聊天室工作。

  • 元素将是 sorted in insertion order(适合聊天时间轴)
  • 单个列表支持超过 40 亿个元素(可能绰绰有余)
  • 您可以使用LPUSH/RPUSH来添加新消息,并且由于Redis列表是使用linked lists实现的,因此无论是在列表的开头还是结尾添加一条消息都是同样,O(1),这很棒。
  • 使用 LRANGE 对 startend 的消息进行分页。一次获取所有消息无益,您可能会遇到与内存、网络相关的问题,请谨慎使用 LRANGE 用于两侧偏移量较大的大列表。
  • 如果您打算只在列表中保留最后 n 条消息(取决于您的业务规则),那么您可以使用 LTRIM
  • 我认为您不需要 public 聊天室的特定消息,因为 LINDEX 是 O(n)(除了第一个和最后一个)。如果您需要,请慎重考虑。

This is the benchmark for LRANGE from official redis documentation;

  • LRANGE(前 100 个元素):每秒 42123.00 个请求
  • LRANGE(前 300 个元素):每秒 15015.02 个请求
  • LRANGE(前 450 个元素):每秒 10159.50 个请求
  • LRANGE(前 600 个元素):每秒 7548.31 个请求

编辑:

在您的情况下,您可以在 username:avatar:time:message format 中推送元素并在需要显示时解析它。您考虑将用户保存在哈希结构中,并将所有与用户相关的属性保存在哈希中,并以 userId:time:message 格式创建消息。两个选项似乎都不错。

我最终使用了哈希 'hset'。通过给每条消息一个 ID 并将它们保存在一个单独的列表中,我可以通过该列表访问所有消息。