redis - 有没有办法使用 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
. - 我认为您不需要公共聊天室的特定消息,因为
LINDEX
O(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
格式创建消息。这两个选项似乎都很好。
推荐阅读
- python - 如何在使用带有 lambda 表达式的 pandas 应用函数时消除类型错误
- swift - 如何快速将 UIView 绘图转换为 GLKView?
- cakephp - 带有 CASE WHEN THEN ELSE 条件的 CakePHP 查询
- c++ - 使用 ffh.getFieldType() == "/Btn" 和 qpdf lib 检查复选框
- c# - 将 Web 应用身份验证转发到 API 服务
- ruby - Chef 服务器从 Chef 工作站返回 404 的刀命令
- cheerio - Cheerio:如何通过数据标签进行选择
- javascript - 只返回 id 名称的 querySelectorAll
- angularjs - AngularJS - 单击模态时自动输入字段的可能性
- c# - 如何在责任链中注入下一个处理程序的依赖关系?