问题:每当用户注册成功会给其发送一条注册成功的消息,假设有一百万用户,则此时就要存储一百万条消息,因为内容相同都是注册成功,所以我们若将这条消息只存一遍于数据库虽然会很节省空间,但是这样没有办法记录用户是否已读这条消息,所以必须实现一对一的存储,而mySQL存储数据量>2000万条时,读取的效率会非常的低。
一)MongoDB数据库的引用
1、MongoDB的存储量远高于mySQL,内部是以集合的方式存在的,于是解决 了数据量和一一对应的问题。
2、尽管MongoDB数据库可以存放海量的信息,但是信息量也不能无限大,所以应用冷热数据分离,热数据定期归档。
以电商的物流信息为例:
1)热数据:要经常访问的数据。刚买的商品还未到家,则这个物流信息为热数据。
2)冷数据:不经常访问的数据。商品已邮送到家,则不经常访问物流信息了,所以该数据分到另一个集合中,这样就会缓解查询热数据集合的压力。
二)RabbitMQ:消息队列
由于MongoDB若一次插入海量数据,线程执行就会受到影响,所以进行增删改查可能无法进行,于是引用了消息队列解决该问题,发送信息时候先将消息保存在消息队列中,当用户登录查看之后消息队列再将消息插入到MongoDB数据库,这样就解决了线程执行问题。
RabbitMQ支持同步和异步的消息收发,稳定性更强,有五种队列模式
每当用户登录的时候就会将消息队列中的消息传递给用户,此时将这条消息和用户的id对应起来存放于MongoDB数据库中。
登录模块的消息设置流程:
一定要采用异步多线程的方式实现,若用户长时间不登陆消息过多,这样就会阻塞登录的正常进行