跳至主要內容
Echo is coding...

Echo is coding...

做不了动态规划的选择,但是可以过贪心的人生

学习网站
学习Java语言
学习网站
学习计算机基础
学习网站
备用Java学习网站
学习总结
牛客文章
我在弹幕推送系统中为什么用RocketMQ?

我在弹幕推送系统中为什么用RocketMQ?

为什么选择消息队列

在学校的软件实验室接过一个项目,是一个商业性的视频弹幕系统,对性能有一定的要求,我负责做视频上传存储、点赞关注和弹幕推送等功能。

因为考虑到大存储量和用户量,选择了FastDFS分布式文件存储,并且技术设计上配合前端采用分片上传、使用Redis来断点续传和秒传。

关注和弹幕推送选择了消息队列来实现,主要考虑有以下几点:

  • 消息队列的发布-订阅模式。如果是传统的队列模式,一个队列中,一个生产者对应一个消费者,但是如果一个生产者对应多个消费者(就像关注功能,一个被关注者对应多个关注者),可能要复制队列,这对资源是一种损耗。所以为了更好地实现关注功能,是选择消息队列的一个重要原因,因为消息队列的机制,在RocketMQ中有"主题"的概念,生产者可以将消息推送到这个主题中,多个消费者可以订阅这个主题进行消费。
  • 消息队列的异步和削峰。最为明显的是弹幕推送功能,比如我们点开一个视频,系统会将关于这个视频的所有弹幕,推送给所有正在观看的用户,而发送一条弹幕后,首先会请求服务器存入数据库中,又会从数据库中查询出所有的弹幕,推送给所有用户。一次前端请求,对于后端数据库是两次的IO处理,如果是大用户量,后端承受的压力更大。所以采用消息队列,我们一可以异步(不至于发生阻塞让用户长时间等待)、二又可以削峰(消息队列尽可能来处理,可以处理得慢一点,但是不能把服务器打挂)。
  • 消息队列的解耦。消息队列主要用于消息的传输和通信,比如关注功能会用到这个用户的信息,弹幕推送也会用到用户的消息,未来可能还会开发视频推送功能,也会用到消息。如果我们把这些功能都写到一个模块中,增加和减少功能,代码都要改不少处。所以我们可以用消息队列把消息模块解耦出来,比如关注完,将信息存入消息队列后就直接返回,不管弹幕推送和视频推送怎样处理,这是"下游"的事儿。

Echo Hou...大约 3 分钟项目设计MQ技术选型
12.二叉树的前序遍历

12.二叉树的前序遍历

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

输入:root = [1,null,2,3]
输出:[1,2,3]

Echo Hou...小于 1 分钟二叉树迭代
VO、DTO、Entity的区别

VO、DTO、Entity的区别

Entity是实体类,对应数据库表中的字段和属性。

DTO是数据传输对象,对应实际需要传输的字段,是用来将Entity转换为VO(或者VO转化为Entity)过程中需要的中间对象,因为不是所有的接口,都需要数据库表中的所有字段,如果用Entity会造成资源的消耗,也会有安全问题。

VO是对应前端的HTML,有一部分字段后端数据库表是没有的。


Echo Hou...小于 1 分钟项目规范
8.三数之和

8.三数之和

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a ,b ,c ,使得 a + b + c = 0 。请找出所有和为 0 且 不重复 的三元组。

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]

Echo Hou...大约 1 分钟双指针中等
9.两个数组的交集II

9.两个数组的交集II

给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]

Echo Hou...小于 1 分钟双指针简单
11.环形链表

11.环形链表

给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false 。

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

Echo Hou...大约 1 分钟链表双指针
7.路径总和

7.路径总和

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。

叶子节点 是指没有子节点的节点。

输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
解释:等于目标和的根节点到叶节点路径如上图所示。

Echo Hou...大约 1 分钟算法二叉树深度优先搜索回溯
10.单词搜索

10.单词搜索

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true

Echo Hou...大约 2 分钟深度优先搜索二维矩阵中等
😎About Me

😎About Me

谈不上走了很多的路,吃了很多的苦,但是还是想要把我的故事记录下来,提醒自己:回头看看路,不要忘了16岁自己的梦想;继续向前走,虚心请教也不要忘了关注自己的内心;观察身边的榜样,但是不要盲目"模仿别人"而"成为别人",记住做自己。

博学而笃志,切问而近思。

最近在找日常实习的时候,有个面试官问了一个问题,我为什么选择了计算机,又为什么选择了Java后端?我的职业规划是怎样的?

Rewind

中学时代,我一直都是个很热血的人,初中立志要上我们当地最好的高中,有多励志呢?借着一次上台发言的机会,我拿着话筒大声告诉台下所有的师生我的梦想,以至于在其他教学楼上课的学生都听到了。这是我第一次告诉大家我的梦想。


Echo Hou...大约 6 分钟
HashMap总结

HashMap总结

HashMap实现了Map接口,Map中的数据是以(Key,Value)的形式存储的,在查找的时候,能够通过哈希函数将Key映射到哈希表中的一个索引位置,从而实现快速访问。Key不能重复,但是Value可以重复。

HashMap的键和值都可以为null,如果键为null,则映射到哈希表的第一个元素。

HashMap有一个初始容量和负载因子,初始容量是哈希表的初始大小,默认是16,负载因子是哈希表在扩容之前,存储的键值对数量和哈希表大小的比例,默认是0.75。

put方法内部的执行流程


Echo Hou...大约 2 分钟Java基础HashMap
2
3