首页
学习
活动
专区
圈层
工具
发布
49 篇文章
1
美团面试:如何设计一个RPC框架?
2
美团面试:如何设计一个注册中心?
3
消息队列设计精要
4
Replication(上):常见的复制模型&分布式系统的挑战
5
Replication(下):事务,一致性与共识
6
网易面试:将Bean放入Spring容器中有几种方式?
7
MySQL慢查询之慢 SQL 定位、日志分析与优化方案
8
面试官:MQ 消息丢失、重复、积压问题,如何解决?
9
面试官:Spring中获取Bean有几种方式?
10
面试:你知道Java性能优化有哪些手段?
11
面试官:千万级数据,怎么快速查询?
12
面试官:你会哪些JVM调优参数?
13
面试官:如何设计一个 订单系统?
14
和面试官聊了半小时的MySQL索引!
15
121道分布式面试题和答案
16
数据库分库分表,何时分?怎样分?
17
一个单例模式,被问7个问题,难!
18
在线面试:如何设计一个秒杀系统?
19
Spring 为何需要三级缓存解决循环依赖,而不是二级缓存?
20
面试官:熟悉SQL优化吗?我只知道20种,其实远不止...
21
吐血整理 | Java并发编程 72 卷
22
面试官再问currentHashMap,就将这篇文章甩给他
23
保姆级教程,2万字详解JVM
24
这代码写的跟狗屎一样!怎么优化?19招搞定它
25
P7大佬压箱底的学习笔记
26
6000多字 | 秒杀系统设计注意点
27
动画+原理+代码+优化,解读十大经典排序算法
28
到底什么是重入锁?拜托,一次搞清楚!
29
面试官再问你 ThreadLocal,你就这样“怼”回去!
30
分布式锁:5个案例,附源码
31
美团面试:说说CAP,我的回答方式很特别
32
分布式事务 :可靠消息最终一致性方案
33
美团面试官:讲清楚MySQL结构体系,立马发offer
34
equals方法比较的是内容?谁告诉你的
35
我通过六个 MySQL 死锁案例,终于理解了死锁的原因
36
必知必会 RabbitMQ面试题 33道(附答案)
37
万字总结 MySQL核心知识,赠送25连环炮
38
那些年,面试被虐过的红黑树
39
小老弟用 案列 引出 ReentrantLock实现原理
40
五分钟说清楚 Spring Boot的自动配置原理
41
面试:Zookeeper常见11个连环炮
42
长文干货 | 手写自定义持久层框架!
43
怒肝一夜 | Mybatis源码深度解析
44
美女面试官问我:能说几个常见的Linux性能调优命令吗?
45
吊打面试官系列:final、finally、finalize 有什么区别?
46
面试官问:如何排除GC引起的CPU飙高?我脱口而出5个步骤
47
JVM真香系列:堆内存详解
48
电商项目实战:如何设计站内信
49
72道 并发编程 面试题!
清单首页面试文章详情

电商项目实战:如何设计站内信

你好,我是田哥

上一期给大家分享了电商项目实战:如何设计提醒商家

可能部分同学不理解什么是站内信,但我相信大部分同学是知道的,站内信说白了就是系统内部的一些消息,和发短信、发邮件类似,但是站内信只是系统内的发送,不想短信那样需要花money。

恭喜你,你的会员成功升级到了15级! 【xxx】【点赞】了你的【文章】【文章的标题】 你的文章 【xxx】 已被推荐到首页 你的喜好的【xxx】已经上线

比如下面这两种常见:

由此可知,站内信在系统里也扮演着一个非常重要的角色。

电商项目中,站内信肯定是少不了的,比如我们订单迟迟不付款,有的电商平台就会给你发站内信,提示你的订单还没有付款,或者提示订单快要超时了等等。

还比如,双11活动,各大电商平台会根据你的喜好,给你发送某某商品大促销,优惠多少多少,当你登录系统会有各种消息提示的。

站内信定制、推送、阅读

站内信分为三个步骤:

  • 运营人员制定好站内信模板
  • 站内信推送(用户行为推送、运营人员主动推送等)
  • 用户阅读(阅读、删除等操作)

运营人员

运营人员会根据不同情况制定好不同的站内信模板,保存到数据库中(通常会保存到缓存中,减轻数据库压力)。运营人员可以对站内信模板进行CRUD。

用户端

登录系统就会有各种提示,然后点开查看消息,有时候消息很多,可以直接点全部已读,这样那个红点点就会消失,用户也可以对消息进行删除,或者消息里包含理解,用户可以直接通过连接跳转到对应页面。用户还可以选中关闭站内信的通知,比如:

设计

我们可以先设计出一版,后期可能会有些些调整,但是核心部分是不变的。

表结构设计

我们可以设计出两张表:站内信模板表和用户站内信表

先来看看站内信模板表:

代码语言:javascript
复制
CREATE TABLE `tb_system_message` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `title` varchar(128) DEFAULT NULL COMMENT '标题',
  `content` longtext DEFAULT NULL COMMENT '内容',
  `create_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  `send_type` int DEFAULT 0 COMMENT '发送类型:全部发送、部分发送、单独发送',
  `deleted` int DEFAULT NULL COMMENT '已删除',
  `link` varchar(255) DEFAULT NULL COMMENT '连接',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  COMMENT='站内信模板表';

其实,和我们系统内短信模板有点类似,在代码实现时,由于站内信模板变更比较少,所以通常都会对其进行缓存(比如Redis),减轻数据库压力,提示系统性能。但是既然用到了缓存,那就不得不得面临着缓存的一些问题,比如缓存击穿、缓存穿透以及缓存数据一致性等问题。

关于站内信模板相关的操作过程:

用户站内信表

用户站内信表:

代码语言:javascript
复制
CREATE TABLE `tb_user_message` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `message_id` bigint NOT NULL COMMENT '站内信id',
  `message_content` longtext   COMMENT '站内信内容,如果没有动态替换的就可以不用保存',
  `receiver_name` varchar(64) NOT NULL COMMENT '接收人名字',
  `receiver_id` bigint NOT NULL NOT NULL COMMENT '接收人id',
  `read` int DEFAULT 0  COMMENT '是否已读',
  `deleted` int DEFAULT NULL  COMMENT '是否已删除',
  `create_time` timestamp NOT NULL ON UPDATE CURRENT_TIMESTAMP,
  `update_time` timestamp NOT NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  COMMENT='用户站内信表';

用户站内信表是对用户的,肯定有用户id了,对某个用户发送站内信,然后就保存一条记录。

用户某个行为,或者运营人搞什么活动之内的,在业务代码里查询指定的站内信模板,可能会有涉及到动态替换站内信模板中的内容,替换好了然后保存到这张表里,也就代表着一个站内信推送成功。

在业务代码里,通常会做异步发送站内信,比如可以用线程池,也可以使用消息队列。

如果系统内没有引入消息队列,那就不妨使用线程池,以后面试也可以用来吹牛逼,咱们也是用过并发编程知识到项目中了。然后,自己对线程池做进一步的深入研究,最后面试官不管怎么问线程池的问题都能轻松应对,还愁拿不到offer吗?

目前站内信模板的CRUD已经完成,接下来就是业务代码里把发站内信给搞定,这里就不专门说明了,会在对应业务代码里进行解释说明。

目前电商项目已形成文档如下:

下一篇
举报
领券