私信功能

最近在做一个私信的功能

一张message表:存储消息内容和创建者id;一张user_message表:存储发送者、接收者及消息id

本以为考虑还算周全,今天又查看了一些文章,发现还是差的远。 下面是从OSChina转来的一篇文章,比我设计的要高明得多。

转自:http://www.oschina.net/question/12_70252


OSChina 的留言表 osc_msgs ,表结构如下:

字段说明:

id : 留言主键字段,自增长
user : 留言的主人
friend : 对方的ID
sender : 留言发送者
receiver : 留言接收者
type : 留言类型(普通消息、系统消息)
content : 留言内容
send_time : 发送时间
read_time : 阅读时间
status : 留言状态

其中 user 和 friend 稍显特殊,其他的字段意义已非常明确不再说明。

当 A 给 B 发送一条留言时,会往 osc_msgs 表中插入两条相同的记录,唯一不同的是 user 和 friend 这两个字段的值是对调的,当然 id 因为是自增长的所以也不同。

为什么要这么做?

1. 一条留言保存两条记录:因为每个人都有收到的留言和已发送留言,当发送人删除了已发送留言,不会影响到接收人查看收到的留言

2. user/friend/sender/receiver 这四个字段是不是多余?

关键的问题就在于此,你还记得 osc 的留言箱吗?进入留言箱里显示的是你最近的留言往来,包含你接收到的和你发出的,它们是按照时间进行排序的。

假设只有 sender/receiver 这两个字段,那么要将接收和发送的留言放在一起,就必须用 UNION 来合并两个查询结果,然后再做排序,而且你还必须有个字段来标注到底是接收到的留言还是发出的留言。这样的 SQL 可能会是这样:

?
1
2
3
4
5
SELECT * FROM (
     SELECT * FROM osc_msgs WHERE type=<接收> AND receiver=<我>
     UNION
     SELECT * FROM osc_msgs WHERE type=<发送> AND sender=<我>
) t ORDER BY send_time DESC

这样的 SQL 语句不用执行都知道性能很差。

那么以冗余来换性能的思路,我们对这个表进行了小改造。

增加两个字段 user 和 friend,当 A 发送留言给 B 时,会写入两条记录:

记录1. user=A,friend=B,sender=A,receiver=B
记录2. user=B,friend=A,sender=A,receiver=B

再来看看在新的表结构下,我们如何改写上面的语句:

?
1
SELECT * FROM osc_msgs WHERE user = <我> ORDER BY id DESC

这两个 SQL 语句孰优孰劣,相信大家能比较得出来。

如果是要列出我跟每个人的最后一条留言的话(就好象留言箱首页显示的内容)可以这样写 SQL 语句:

?
1
SELECT MAX (id) AS id, COUNT (id) AS msgCount FROM osc_msgs WHERE user = ? GROUP BY friend ORDER BY id DESC

解释完毕。

本文只是提供一种表结构设计的参考思路,这也不是放之四海而皆准的方法,关键的问题在于你想解决什么样的问题,对 OSC 来说性能很重要,如果能简单的通过冗余来提升性能,这很划算。

### 回答1: Spring Boot 中实现私信功能可以采用以下步骤: 1. 在数据库中建立私信,存储私信的发送者、接收者、内容等信息。 2. 在 Spring Boot 中配置数据库连接,使用 JPA 或者 MyBatis 等框架来操作数据库。 3. 在后端代码中编写私信相关接口,如发送私信、查看私信等。 4. 在前端代码中实现私信功能,如私信对话框、私信等。 5. 实现私信消息的推送,可以使用 websocket 或者消息队列等技术。 6. 设置私信权限控制,在接口中进行验证。 需要注意的是,这只是一个大体的步骤,实际实现过程中还需要根据具体需求进行调整。 ### 回答2: Spring Boot是一个用于构建Java应用程序的开源框架。要实现私信功能,可以参考以下步骤: 1. 创建消息实体类:创建一个Java类,作为私信消息实体。该类应该包含发送者、接收者、消息内容等属性。 2. 创建消息存储库:使用Spring Data JPA或其他持久化技术创建一个消息存储库。该存储库应该包含查找和保存消息的方法。 3. 创建发送消息的API:使用Spring MVC创建一个发送消息的API接口。该接口应该接受发送者、接收者和消息内容作为参数,并将消息保存到消息存储库中。 4. 创建查看消息的API:使用Spring MVC创建一个查看消息的API接口。该接口应该接受用户ID作为参数,并从消息存储库中查找与该用户相关的所有消息。 5. 创建WebSocket连接:使用Spring WebSocket创建一个WebSocket连接,以便实时传输私信消息。当消息存储库中有新的消息时,将其推送到WebSocket连接的订阅者。 6. 创建前端界面:创建一个前端界面,让用户可以发送、查看私信消息。可以使用HTML、CSS和JavaScript技术来实现。 7. 配置Spring Boot应用程序:配置Spring Boot应用程序以启用WebSocket和相关的URL路由。 8. 测试私信功能:使用测试工具或编写单元测试来测试私信功能的正确性和性能。 通过上述步骤,可以在Spring Boot应用程序中实现私信功能。当用户发送私信时,消息将保存到消息存储库,并且可以通过API接口或前端界面查看私信消息。另外,通过WebSocket连接,用户能够实时接收私信消息的推送。 ### 回答3: Spring Boot实现私信功能的一种方式是使用消息队列和WebSocket。 首先,我们可以使用消息队列来实现私信消息传递。比如使用ActiveMQ或者RabbitMQ作为消息队列,用户可以将私信消息发送到队列中,然后接收者可以从队列中订阅并接收消息。 其次,我们可以使用WebSocket来实现私信的实时通信功能。WebSocket是一种在浏览器和服务器之间进行双向通信的协议,通过使用WebSocket,用户可以实时地接收到私信消息。 在Spring Boot中,我们可以使用Spring WebSocket模块来实现私信功能。首先,我们需要配置WebSocket相关的类和处理器。然后,在用户发送私信时,我们可以通过WebSocket发送消息到接收者。接收者收到消息后,可以在前端页面上实时展示。 为了保证私信的安全性,我们还可以添加用户身份认证和授权的机制。比如,在使用WebSocket进行通信时,可以在建立连接时对用户进行身份验证,并限制用户只能向特定的用户发送私信。 另外,我们还可以使用数据库来存储私信记录。每当用户发送或接收一条私信时,我们可以将其保存在数据库中,以供用户随时查看和管理。 总的来说,通过使用消息队列和WebSocket,结合用户身份认证和数据库存储,我们可以在Spring Boot中实现私信功能。这种实现方式可以使私信消息实时、安全,并且提供了便捷的管理功能
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值