群发“站内信”的实现

  在很多网站系统(如CMS系统,SNS系统等),都有“站内信”的功能。

  “站内信”不同于电子邮件,电子邮件通过专门的邮件服务器发送、保存。而“站内信”是系统内的消息,说白了,“站内信”的实现,就是通过数据库插入记录来实现的。

  “站内信”有两个基本功能。一:点到点的消息传送。用户给用户发送站内信;管理员给用户发送站内信。二:点到面的消息传送。管理员给用户(指定满足某一条件的用户群)群发消息。点到点的消息传送很容易实现,本文不再详述。下面将根据不同的情况,来说说“站内信”的群发是如何实现的。

  第一种情况,站内的用户是少量级别的。(几十到上百)

  这种情况,由于用户的数量非常少,因此,没有必要过多的考虑数据库的优化,采用简单的表格,对系统的设计也来的简单,后期也比较容易维护,是典型的用空间换时间的做法。

  数据库的设计如下:表名:Message

  ID:编号;SendID:发送者编号;RecID:接受者编号(如为0,则接受者为所有人);Message:站内信内容;Statue:站内信的查看状态;PDate:站内信发送时间;

  如果,某一个管理员要给所有人发站内信,则先遍历用户表,再按照用户表中的所有用户依次将站内信插入到Message表中。这样,如果有56个用户,则群发一条站内信要执行56个插入操作。这个理解上比较简单,比较耗损空间。

  某一个用户登陆后,查看站内信的语句则为:

  Select * FROM Message Where RecID=‘ID’ OR RecID=0

  第二种情况,站内的用户中量级别的(上千到上万)。

  如果还是按照第一种情况的思路。那发一条站内信的后果基本上就是后台崩溃了。因为,发一条站内信,得重复上千个插入记录,这还不是最主要的,关键是上千乃至上万条记录,Message字段的内容是一样的,而Message有大量的占用存储空间。比方说,Message字段有100个汉字,占用200个字节,那么5万条,就占用200×50000=10000000个字节=10M。简单的一份站内信,就占用10M,这还让不让人活了。

  因此,将原先的表格拆分为两个表,将Message的主体放在一个表内,节省空间的占用

  数据库的设计如下:

  表名:Message

  ID:编号;SendID:发送者编号;RecID:接受者编号(如为0,则接受者为所有人);MessageID:站内信编号;Statue:站内信的查看状态;

  表名:MessageText 

  ID:编号;Message:站内信的内容;PDate:站内信发送时间;

  在管理员发一封站内信的时候,执行两步操作。先在MessageText表中,插入站内信的内容。然后在Message表中给所有的用户插入一条记录,标识有一封站内信。

  这样的设计,将重复的站内信的主体信息(站内信的内容,发送时间)放在一个表内,大量的节省存储空间。不过,在查询的时候,要比第一种情况来的复杂。

  第三种情况,站内的用户是大量级的(上百万),并且活跃的用户只占其中的一部分。

  大家都有这样的经历,某日看一个网站比较好,一时心情澎湃,就注册了一个用户。过了一段时间,由于种种原因,就忘记了注册时的用户名和密码,也就不再登陆了。那么这个用户就称为不活跃的。从实际来看,不活跃的用户占着不小的比例。

  我们以注册用户2百万,其中活跃用户只占其中的10%。

  就算是按照第二种的情况,发一封“站内信”,那得执行2百万个插入操作。但是其中的有效操作只有10%,因为另外的90%的用户可能永远都不会再登陆了。

  在这种情况下,我们还得把思路换换。

  数据库的设计和第二种情况一样:

  表名:Message

  ID:编号;SendID:发送者编号;RecID:接受者编号(如为0,则接受者为所有人);MessageID:站内信编号;Statue:站内信的查看状态;

  表名:MessageText 

  ID:编号;Message:站内信的内容;PDate:站内信发送时间;

  管理员发站内信的时候,只在MessageText插入站内信的主体内容。Message里不插入记录。

  那么,用户在登录以后,首先查询MessageText中的那些没有在Message中有记录的记录,表示是未读的站内信。在查阅站内信的内容时,再将相关的记录插入到Message中。

  这个方法和第二种的比较起来。如果,活跃用户是100%。两者效率是一样的。而活跃用户的比例越低,越能体现第三种的优越来。只插入有效的记录,那些不活跃的,就不再占用空间了。

  以上,是我对群发“站内信”的实现的想法。也欢迎各位提出自己的建议,大家互相借鉴,共同进步。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内信系统数据库设计 内信系统数据库设计 内信系统数据库设计 很多⽹系统(cms系统、sns系统等),都有内信的功能。 内信不同于电⼦邮件,电⼦邮件通过专门的邮件服务器发送、保存。⽽内信是系统内的消息,说⽩了,内信实现,就是通过数据库插⼊记录 来实现的。 内信有两个基本功能. ⼀:点到点的消息传送。⽤户给⽤户发送内信;管理员给⽤户发送内信。 ⼆:点到⾯的消息传送。管理员给⽤户(满⾜⼀定条件的⽤户群)群发消息。 主要分析点到⾯的内信设计 第⼀种情况 第⼀种情况:(⽤户量⽐较少百级别) 这种情况,由于⽤户量⽐较少,因此没有必要考虑数据库的优化,采⽤简单的⼀张表就可以实现了,对系统的设计也来的⽐较简单,后期也⽐较容 易维护,是典型的⽤空间换时间的做法。 表message: id(主键)、sendId(发送者编号)、receiveId(接收者编号)、messageContent(内信内容)、statue(内信查看状态)、createDate( 内信发送时间) 第⼆种情况 第⼆种情况:(⽤户量中量级别) 如果还是按照第⼀种那样来设计数据库,那么每次群发⼀次内信,就要插⼊⼏万条数据,占⽤字节最⼤的就是messageContext字段,并且这⼏ 万条记录的messageContent内容是相同的。所以要考虑分表来设计了。把messageContext单独抽取到另外⼀张表中。 表message:id(主键)、sendId(发送者编号)、receiveId(接收者编号)、messageContextId(内信内容Id)、statue(内信查看状态) 表messageContext: messageContentId(主键)、messageContent(内信内容)、createDate 第三种情况 第三种情况:(⽤户量上百万级别) 如果采⽤第⼆种情况,其实是做了很多⽆⽤的message表插⼊操作的。因为这⼏百万⽤户只有百分之10左右是活跃⽤户,有很多⽤户是不登 ⼊app(⽹),所以我们得设计当他们登⼊的时候我们才执⾏插⼊操作。数据库的设计和第⼆种情况是⼀样的,只是插⼊的实际我们要重新选择。 备注:内信的statue状态应该有三个值(未读、已读、删除状态)。⽤户点了删除知识逻辑上的删除,并没有在物理层数据库删除。我们给⽤户⼀ 个假象,我们底层的实现就是改变statue状态为删除就ok.(数据是⼀个企业的核⼼,虽然这种数据没什么价值)。 为了扩展我们还可以存在messageStatue(内信状态)、readStatue(⽤户查看状态) messageStatue 指的是发给谁(private、public)
EUCMS内容管理系统是基于asp+access/mssql架构的智能建系统,集电脑版、手机版、平板版、微信、APP于一体,无缝切换,手机和电脑所有URL完全一样,非常利于seo,一个后台同步管理。 后台功能使用上更是在客户的使用角度,所有功能简单明了,摒弃一切繁琐无用的功能,常用的主要就三个链接:文章添加,文章管理,栏目管理,完全没接触网的客户也能很快上手,非常简单。结合自定义模型,自定义表单和自定义字段,瞬间就可以完成一个诸如:图片展示,软件下载,新闻资讯,汽车租赁,房产销售,人才招聘......,等非常专业的网或模块。 为了适应时代需要,相继开发出多条件搜索、购物车、在线支付、商品自定义属性。您可以在后台自主修改模板展现自我风格,也可以到我们开发的自助建平台下载模板导入, EUCMS系统采用内部和外部两种完全独立又可以互相嵌套标签形式,源生态asp语法模式,简洁易懂,懂asp语法的建议以外部标签为主,不懂的建议直接内部标签同,时到平台学些外部标签的教程,因为外部标签非常灵活易用。 总之,不论你是否有语言基础,都可以很灵活的使用EUCMS,EUCMS让每个人都可以做自己的网! 后台登录:http://你的域名/admineu/ 普通客户账号(简洁后台): 用户名 :admin 密码:eucms 开发者账号(全功能后台): 用户名:eucms 密码:eucms 本拥有几百套主流模板供您选择,后续在不断增加,可多下几套后台版主切换 注:以下为EUCMS系统能够实现的全功能介绍,部分功能为有偿添加,非免费版所有,悉知。 主要功能模块: 部分模块可根据需要反复安装和卸载,以保持后台的整洁易用 微信公众号管理系统 自定义系统模型 模型自定义字段 会员系统 手机系统 自定义会员模型 会员模型自定义字段 自定义表单 表单自定义字段 自定义变量系统 在线留言系统 信息采集系统 二维码生成系统 冗余文件清理系统 价格分类系统 多条件搜索系统 后台多风格切换系统 多语言系统 网多主题系统 后台数据库管理 首页分页功能 单页系统 广告系统 内容心情系统 Digg系统 评论管理系统 在线支付系统 外部数据源链接系统 自定义栏目URL模块 伪静态 社区问答系统 简易商城系统 购物车系统 在线客服系统 在线投票系统 留言发送指定邮箱系统 邮件群发系统 自定义管理员分级系统 友情链接系统 专题系统 功能简介: 1.支持首页分页 2.支持301跳转 3.支持首页生成后回调(首页生成后的页面作为模板调用,首页打开速度相比动态和伪静态提高近十倍) 4.支持模板防盗 5.支持后台在线修改模板 6.电脑端+手机端+平板+微信+APP,手机支持三种模式(1.与电脑同域名,2.二级目录,3.绑定独立域名)后台自由切换,支持无缝切换数据同步,自动识别 7.手机支持多种主题风格,可根据电脑风格切换搭配 8.支持内容阅读收费权限功能,可按会员组设置不同的阅读收费 9.支持支持伪静态,静态,静态功能 10.支持数据库备份、恢复功能,在线添加、修改、删除表和字段 11.支持任意字段批量替换关键字 12.支持信息列表和栏目复制和移动 13.支持信息和栏目批量设置 14.支持任意内容图片为缩略图 15.支持自定义栏目图片,每个栏目页顶部都可以设置不同的栏目图片 16.支持批量上传图片,自定义参数,自动关键词,描述,tag标签等 17.支持上传文件管理,支持冗余检测,冗余检测支持自定义字段 18.支持批量添加栏目,支持无线级栏目分类 19.支持自定义模型管理,自定义字段管理,会员系统支持自定义模型、自定义字段,自定义会员组 20.支持内容评论,可设置是否匿名还是会员评论 21.支持自定义幻灯片开关,可以指定幻灯片栏目,也可指定任何文章为幻灯片 22.支持内模糊搜索,支持自定义搜索参数,多条件搜索 23.支持Tag标签(后可添加) 24.支持自定义内容 25.两套后台主题,6种不同风格切换,可根据喜好自由选择 26.支持会员注册、登陆、找回密码、互加关注,点对点发内信,修改会员头像等 27.支持管理员分级权限功能,可指定某个管理员只能管理哪些内容,也可以指定模型管理员 28.支持网logo,手机logo,微信图片的上传 29.支持编辑器远程图片本地化 30.支持多个电话,多个qq 31.支持sql server和access两种数据库 32.支持留言、管理员回复 33.支持自动缩略图,自动水印,支持png透明水印 34.支持模板切换、管理,在线模板 35.支持在线插件,自定义插件 36.内置多套在线客服系统 37.支持验证码,和后台登录认证码开关 38.支持广告管理,支持自定义样式 39.支持友情链接管理,支持文本和图片友链,友情链接可在线申请,后台
以下是使用Spring Boot实现WebSocket群发消息的步骤: 1.添加pom依赖 在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> ``` 2.配置WebSocket和监听器 在Spring Boot的配置类中添加以下配置: ```java @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(new MyWebSocketHandler(), "/websocket").setAllowedOrigins("*"); } @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } @Bean public HttpSessionConfigurator httpSessionConfigurator() { return new HttpSessionConfigurator(); } } ``` 其中,MyWebSocketHandler是自定义的WebSocket处理器,用于处理WebSocket连接和消息的发送和接收。 3.编写WebSocket处理器 ```java @Component public class MyWebSocketHandler extends TextWebSocketHandler { private static final List<WebSocketSession> sessions = new CopyOnWriteArrayList<>(); @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { sessions.add(session); } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { sessions.remove(session); } @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { for (WebSocketSession s : sessions) { s.sendMessage(message); } } } ``` 在这个处理器中,我们使用了一个静态的sessions列表来保存所有连接到WebSocket服务器的会话。在连接建立时,我们将会话添加到sessions列表中。在连接关闭时,我们将会话从sessions列表中移除。在处理文本消息时,我们遍历sessions列表,并将消息发送到每个会话。 4.启动应用程序 在Spring Boot的启动类中添加@EnableWebSocket注解,以启用WebSocket支持。 ```java @SpringBootApplication @EnableWebSocket public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 5.测试 使用浏览器或WebSocket客户端连接到WebSocket服务器的URL(例如:ws://localhost:8080/websocket),并发送消息。所有连接到服务器的会话都将收到相同的消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值