我正在尝试建立一个聊天室,我想存储额外的信息,如:昵称,时间和头像,然后将它们关联到一条消息。我可能会使用“:”来分隔某些属性,但这听起来不像是一种优雅的方式!
$list = "message_history"; $message = $data['nickname'] . ':' . $data['message']; Redis::lpush($list, $message);
使用redis有没有一种优雅的方法?
gr8qqesn1#
既然你在评论中提到了,你会有一个单独的聊天室, 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 格式。两种选择都不错。
redis lists
sorted in insertion order
LPUSH
RPUSH
linked lists
start
end
LRANGE
LTRIM
LINDEX
username:avatar:time:message format
userId:time:message
bxgwgixi2#
最后我用了一个hash'hset'。通过给每条消息一个id并将它们保存在一个单独的列表中,我可以通过该列表访问所有消息。
2条答案
按热度按时间gr8qqesn1#
既然你在评论中提到了,你会有一个单独的聊天室,
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
格式。两种选择都不错。bxgwgixi2#
最后我用了一个hash'hset'。通过给每条消息一个id并将它们保存在一个单独的列表中,我可以通过该列表访问所有消息。