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

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

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

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

数据库的设计如下:表名: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%。两者效率是一样的。而活跃用户的比例越低,越能体现第三种的优越来。只插入有效的记录,那些不活跃的,就不再占用空间了。

以上,是我对群发“站内信”的实现的想法。

1. 方案描述

该方案用于系统站内信功能模块在百万级用户量情况下的效率问题,只是后台管理员给前台用户发送站内信,用户与用户之间的发送不在讨论内。

2. 方案详情

假设系统的用户量达到了200W,活跃用户为10W,系统后台管理员要给全体用户发送一条感谢信,如果按照之前的存储方式,消息队列需要插入200W条数据,可是除了活跃的10W用户,其他用户都忘了自己有该网站的账号,他都有可能不再登陆该网站了,数据库保存的消息队列无意义了。

现表结构如下:

消息表编号ID    NUMBER标题TITLE    VARCHAR2(50)    50正文CONTENTS    VARCHAR2(1000)发送状态STATUS    NUMBER发送日期SEND_DATE    DATE发送方式SEND_TYPE    NUMBER最新创建人FCU

VARCHAR2(50)    50更新人LCU    VARCHAR2(50)    50创建时间FCD    DATE最新更新时间LCD    DATE删除标记DELETE_TAG

CHAR(1)    1

消息容器编号ID    NUMBER站内信ID

MESSAGE_ID    NUMBER收件人ID

MEMBER_ID    NUMBER是否已读READ_STATUS    NUMBER

会员表

主键id    NUMBER会员编号u_number    NUMBER电子邮箱u_email

VARCHAR2(200)    200密码u_passwd    VARCHAR2(50)    50企业认证company_admit

NUMBER(1)    1帐号禁用帐号禁用NUMBER(1)    1创建人FCU    NUMBER最后更新人LCU    NUMBER首次创建时间FCD    DATE最后更新时间LCD    DATE删除标记DETELE_TAG

char(1)    1

在尽量不改变表结构的前提下,改变一下程序写数据库的方式:

后台管理员发送一条站内信,接收对象为全体会员,系统往站内信表插入一条站内信,其中发送方式区分接收的对象(0为全体发送,1为只发送给注册会员,2为只发送给企业会员,3为指定会员发送),这样,发送给全体会员的一条站内信暂时只生成了一条数据。

前台会员登陆的时候,根据会员自身的会员类型(普通会员,企业会员)查询站内信表中属于自己的最新消息(根据自己所持消息的最新时间与消息表的发送时间做 比对),往消息容器中插入自身与所持消息的关联数据,默认未未读,在前台会员点击某一条未读站内信的时候,将容器中的对应站内信状态改为已读。

如果后台管理员只指定发送站内信给某几个会员,则往站内信表插入一条站内信后,将这几个会员与该站内信的关联直接往消息容器中写关联,不需要前台会员取。

另:因为改变了发送接收方式,后台管理员只指定发送站内信给某几个会员,但是站内信状态未未发送,只是保存草稿,需要往站内信主表增加一个字段,保存指定会员的id串,用于关联此草稿与指定会员的关联,此处就要求发送给指定会员的数量不能太多,需要限制。

这样,百万级用户量的系统,活跃度为10%的用户登陆系统,只生成了10W的数据,用户活跃度越低,此方案效率越明显,如果是100%活跃度的话,此方案和现有方法无区别。

站内信 java_站内信的实现思路表的设计相关推荐

  1. 站群系统 java_站群管理系统 java

    3.外链,高质量的原创肯定是更加合适的,外链为皇,当然如果自己有能力,2.了解行业动态,不管哪个行业都可以从微博热榜.百度风云榜等一些榜单信息去挖掘用户最近关注的信息点,然后结合行业知识解决用户的诉求 ...

  2. 易信java_新手指南-易信开放平台

    易信Android平台SDK使用新手指南 本文将介绍SDK的使用.如果你想详细的了解每个API用法,请查阅 API文档 或下载阅读 易信SDK Sample 源码. 一.准备 1. 下载易信客户端,并 ...

  3. python 内网镜像站_搭建私有YUM仓库与内网镜像站

    原标题:搭建私有YUM仓库与内网镜像站 搭建私有YUM仓库 私有yum仓库环境 系统版本:centos7.4 IP:192.168.1.47 #最好能上公网 私有yum仓库服务端配置 第一:创建使用y ...

  4. php 大型网站内链,网站SEO关键词优化如何做好站内链接即网站内链?

    网站SEO关键词优化如何做好站内链接即网站内链? 这篇记录文章应该主要算是一个思维探讨. 针对网站SEO关键词优化怎么做好站内链接即网站内链(以下简称:网站内链),理想化,大家将网站内链比作一张网,蜘 ...

  5. 网页内嵌B站视频,隐藏相关控件

    网页内嵌 B 站视频主要是用 ifame , 其地址是: https://player.bilibili.com/player.html?cid=&aid=84267566&page= ...

  6. 在武汉火车站转车需要出现吗_武汉火车站可以在站内换乘哪些站 武汉地铁6号线和1号线/13号线换乘...

    武汉火车站位于地铁4号线上,目前武汉火车站不可以站内换乘,因为它不是换乘站,不过在武汉地铁规划中,将来会有地铁10号线.5号线.19号线等换乘.此外我们再来了解一下武汉地铁6号线和1号线/13号线换乘 ...

  7. 提质信创•协同发展—— 麒麟信安云+操作系统交流会(武汉站)顺利举行

    6月13日下午,由麒麟信安和云南南天电子信息产业股份有限公司(简称:南天信息)共同举办的麒麟信安云+操作系统交流会(武汉站)顺利召开. 南天信息拥有三十余年深耕金融等行业信息化的丰富经验,如今结合云计 ...

  8. 亚马逊的推广包括站内推广和站外推广

    对于亚马逊而言,产品的转化率是非常重要的,除了产品的本身运营可以提高转化率之外,亚马逊卖家还会通过推广的方式引发订单的转化.目前亚马逊的推广主要分为站内推广和站外推广.这两种推广方式并没有什么高下之分 ...

  9. 谷歌SEO优化包含站外SEO、站内SEO以及技术SEO三个方面

    歌SEO排名优化需要一个循序渐进的过程的!想要做好谷歌SEO排名必须要有一个完整的优化方案!通常情况下谷歌SEO优化包含站外SEO.站内SEO以及技术SEO三个方面,下面有一话将会从这几个方面来为您提 ...

  10. 站内seo和站外seo是什么

    站内seo和站外seo是什么[199cloud-艾娜] 一.站内seo 主要包含了站内的链接结构.网站树状结构和网站的资源(文章及产品等内容)优化. 一般企业网站用CMS做好网站后,网站的树状结构和链 ...

最新文章

  1. windows下利用IIS搭建web和ftp服务以及防火墙配置
  2. 【Python CheckiO 题解】Count Consecutive Summers
  3. HTML+CSS实现品优购登录界面
  4. 河北机电职业技术学院计算机分数线,河北机电职业技术学院历年分数线 2021河北机电职业技术学院录取分数线...
  5. Soft-Masked BERT 一种新的中文纠错模型
  6. 任务栏流量监测工具 NetSpeedMonitor 在Windows 8下的安装使用
  7. 三维空间的位姿描述和齐次变换
  8. 二维码门禁助力于打造更智能化的出入管理-码上开门,说走就走
  9. 怎么在Excel 表里的所有sheet查找
  10. 2022-2027年中国棉纺织机械行业发展监测及投资战略研究报告
  11. Ubuntu 安装xbmc播放器
  12. (4.6.26)Android特殊系统的校验方式
  13. MOOS-ivp 使用qt创建一个moosapp
  14. android——(图片框与进度条)
  15. python小白从哪来开始-如何看待Python的由来?Python小白如何入门?(附教程)
  16. phpstorm断点调试
  17. 【20211106】在技术上是如何实现分布式事务_V3(TCC)
  18. java ssm基于身份识别的考生考试签到管理系统
  19. 极路由饥饿营销引质疑 联合创始人拿数据正面回应
  20. c语言动态规划0-1背包,c++实现0-1背包问题完整源码(动态规划实现)

热门文章

  1. android10 psp模拟器,PPSSPP(PSP模拟器) V1.10 安卓版
  2. Stduino IDE stm32 最小系统 小蓝板 驱动继电器(五)
  3. Transformer12
  4. vue+环信客服前端对接
  5. 【仅剩12小时】Python科研绘图教程,40+绘图案例(附完整代码)
  6. 概率论之多元随机变量及其分布
  7. Flink SQL 连接Hive并写入/读取数据
  8. php融云开发文档,融云公众服务
  9. java clh_【Java并发编程实战】----- AQS(四):CLH同步队列
  10. 2017最新安卓版UI设计规范篇