首页 > 解决方案 > 有没有办法使用 Redis 将属性与聊天消息相关联?

问题描述

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

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

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

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

标签: redispredis

解决方案


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

  • 元素将是sorted in insertion order(适合聊天时间线)
  • 单个列表支持超过 40 亿个元素(可能绰绰有余)
  • 您可以使用LPUSH/RPUSH来添加新消息,并且由于 Redis 列表是使用 实现的linked lists,因此在列表的开头或结尾添加消息都是相同的,O(1),这很棒。
  • 使用 LRANGE 使用start和对消息进行分页end。一次获取所有消息并没有什么好处,您可能会遇到内存、网络相关问题,请小心使用LRANGE从任一侧具有高偏移的大型列表。
  • 如果您只想在列表中保留最后 n 条消息(取决于您的业务规则),那么您可以使用LTRIM.
  • 我认为您不需要公共聊天室的特定消息,因为LINDEXO(n) (第一个和最后一个除外)。如果您需要,请仔细考虑。

这是来自官方 redis 文档的 LRANGE 的基准

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

编辑:

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


推荐阅读