【问题标题】:Is there a way to associate proprieties to chat messages using Redis?有没有办法使用 Redis 将属性与聊天消息相关联?
【发布时间】:2020-04-25 15:39:50
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果您的消息或昵称包含: 怎么办?也没有在值列表中看到时间和头像?将所有聊天室消息放在一个列表中怎么样?你将如何决定哪条消息属于哪个聊天室?
  • 我可能会阻止用户在他们的昵称中使用冒号,因为我知道我之前将拥有多少属性,所以对于消息来说没关系。另外,我只有一个公共聊天室。

标签: redis predis


【解决方案1】:

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

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

这是来自官方 redis 文档的 LRANGE 的 benchmark

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

编辑:

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

【讨论】:

  • 感谢 Ersoy 遵循我的方式,提供了很好的解释和基准。不过我就等着看有没有别的办法!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 2020-05-17
    • 2018-02-06
    相关资源
    最近更新 更多