我不确定这是否是一个好的电子邮件数据库架构。电子邮件数据库架构
我使用redis收件箱,存档,发送列表为每个用户存储对话ID(或线程ID)。每个对话ID指向消息ID的重新列表。每个消息ID都指向一个PostgreSQL消息表。无论何时发送或存档或删除邮件,我都会在redis列表中移动ID。
只有在跨消息进行搜索时,以及从线程获取消息时,因为必须始终检查线程中的消息是否属于您,有时候人们会在同一线程中进行回复,但对于不同的用户组。
这是一个很好的方法吗?有更好的想法吗?如何改善这一点?
我不确定这是否是一个好的电子邮件数据库架构。电子邮件数据库架构
我使用redis收件箱,存档,发送列表为每个用户存储对话ID(或线程ID)。每个对话ID指向消息ID的重新列表。每个消息ID都指向一个PostgreSQL消息表。无论何时发送或存档或删除邮件,我都会在redis列表中移动ID。
只有在跨消息进行搜索时,以及从线程获取消息时,因为必须始终检查线程中的消息是否属于您,有时候人们会在同一线程中进行回复,但对于不同的用户组。
这是一个很好的方法吗?有更好的想法吗?如何改善这一点?
那么,到底你的论点是正确的:)
的Redis是一个内存中,但在磁盘上的数据库中,所以它 代表了不同的权衡,其中非常高的写和读取速度 与的数据集的限制,即不能超过存储器更大 实现
所以你不能在Redis中保存所有东西。另外,您不能方便地进行文本搜索,因此将实际的消息数据保存在PostgreSQL或其他数据库(如Solr)中是必要的。
思考在您的案例中制作Redis图层的真正用处是什么。如果你保留Redis,它可以非常有效地处理ID,并且你也可以保留主题和电子邮件地址。做
最好的办法是启动一些用例:)
显示最新消息(通过时间戳下令TS)
> sadd messages 1 2
> hmset message:1 ts 1411783175 author_id 1 subject "An e-mail for starting things up"
> hmset message:2 ts 1411783150 author_id 2 subject "An early e-mail from the startup one"
> hmset author_id:1 name "Johnny" email "[email protected]"
> hmset author_id:2 name "Sarah" email "[email protected]"
> sort messages by message:*->ts get message:*->subject
1) "An early e-mail from the startup one"
2) "An e-mail for starting things up"
在这种情况下, ts是每条消息的历元时间
列出线程中的用户(例如,线#)
> sadd thread:1:messages 1 2
> sort thread:1:messages get message:*->author_id store thread:1:authors
> sort thread:1:authors get author_id:*->name get author_id:*->email
1) "Johnny"
2) "[email protected]"
3) "Sarah"
4) "[email protected]"
这里螺纹:1:消息有消息ID,我们存储在线程作者:1:作者关键。
根据我对Redis的经验,您必须选择一个好的客户端(对于PHP来说无疑是PHPRedis [https://github.com/nicolasff/phpredis],因为它是一个C编译为php模块的扩展),并且在您的应用程序中也进行了大量处理。
希望是有用的。
为什么这个模式的终点是PostgreSQL表? – Niloct 2014-09-25 21:20:53
我无法为自信而争辩。我想如果我在Redis中存储消息,它会占用太多的内存。我不确定。 – 2014-09-26 06:11:19