有没有办法使用 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 对
start
和 end
的消息进行分页。一次获取所有消息无益,您可能会遇到与内存、网络相关的问题,请谨慎使用 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 并将它们保存在一个单独的列表中,我可以通过该列表访问所有消息。
我正在尝试建立一个聊天室,我想存储其他信息,例如:昵称、时间和头像,然后将它们与消息相关联。
我可能会使用“:”来分隔某些属性,但这听起来不是一种优雅的方式!
$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 对
start
和end
的消息进行分页。一次获取所有消息无益,您可能会遇到与内存、网络相关的问题,请谨慎使用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 并将它们保存在一个单独的列表中,我可以通过该列表访问所有消息。