Feed 流系统的架构设计方案
Feed 流系统的架构设计方案Feed流概述定义与特点Feed流是持续更新展示给用户的信息流(某种意义上来说,你可以一直向下滑动,而后获取到信息的应用都属于feed流),具有千人千面的个性化特点,如手机App中的猜你喜欢、关注和好友动态等。
与传统信息获取渠道(报纸电视)相比,Feed流可根据用户行为聚合信息(最核心的能力),以信息流方式提供给用户,降低获取信息难度,提升用户体验。
分类方式
按信息源聚合依据:
无需依赖关系(如抖音推荐页,适用于信息探测)
单向依赖关系(如微博关注页,适用于信息订阅)
双向依赖关系(如微信朋友圈,适用于熟人社交)
按展示逻辑:
权重推荐(如抖音推荐页)
时间顺序展示(如微信朋友圈、微博关注页)
本质上可总结为依据隐含兴趣推荐信息按权重排序展示和依据用户关系拉取信息按时间顺序展示两类Feed流。
注意:微博热榜很多人也算成了 Feed 流,但是严格意义上来说,他是一个信息流。所有人看到的热榜数据都是一样的,这缺失了信息聚合的特征。所以,本质上热榜的底层模型应该是排行榜,而非 Feed 流。这里不将它归为一类。
发展历程起源于RSS系统 ...
第二份工作
熬了三个两点多晚上前几天看完形式是非常喜欢的小故事类型主人公的性格也很喜欢很有代入感但很多点并没有很深的体会可能是因为岗位差别对书中关于mkt的各种东西都看得有点懵也有可能上班经验还是没那么丰富🤔
2024秋小总结
好久好久没记录了太久远的也不记得了就记一下近三个月的
最近看的书午后四点:前天睡不着两点半看完的远山淡影:飞成都的飞机上看完的我在上东区做家教:昨晚开始看的仿生人会梦见电子羊吗:maybe一个月前一个陌生女人的来信:一个月前金色梦乡:两个月前麦琪的礼物:两个月前九篇雪:三个月前再袭面包店:三个月前
播客的话还在探索阶段认知类的有点听腻了更想听点探索世界or不同的生活方式所以最近听得很杂讲飞机的,讲咸鱼的,讲韩国女作家的
电影的话暮然回首:周二白日梦想家:九月份看的吧因果报应:这个应该是六月份看的了
总结就是书看的还行,但是缺少记录播客以后每天骑车听电影看的太少了,争取以后每周一部上完班回来看看别的东西吧世界上这么多值得探索的东西
机票是手段,世界是目的
年度最爱博客!
也可能和听这场播客的心境有关系,等我有时间了就写感想!
排查日志:从http1.1升级到http2
排查日志:http1.1 升级到 http2问题背景实习需求:把原有的系统从http1.1升级到http2
一开始觉得非常简单,思路大概就是:前端改配置升级、后端改配置升级、适配代理层nginx。
项目前后端配置:
nginx配置:
❗但是发送的请求在网页控制台发现还是http1.1🤔
逐步排查1. 排查后端写了个方法专门判断http版本
/** * 测试请求是否为 http2 */@RestController@RequestMapping("/apiTest")public class HttpVersionController { @GetMapping("/http-version") public String getHttpVersion(HttpServletRequest request) { System.out.println(request.getHeader("User-Agent")); System.out.println(request.getRequestURL()); String prot ...
[1010]字符串刷题思路
String
本篇博客只记录刷题思路不记录具体代码,用于本人快速回顾题目来源代码随想录奖励自己上半天班😋
注意Java的String是不可变的,所以很多时候要toChar()
涉及到交换的操作都很适合双指针
数组填充优化解决思路:先确定长度再从后往前遍历
KMP 算法
反转字符串一眼双指针
非常朴素无华,秒了
值得注意的是swap不用temp的高效写法,三次异或
s[l] ^= s[r]; //构造a^b的结果,并放在a中s[r] ^= s[l]; //a^b的结果再^ b,存入b,此时b=a,a=a^bs[l] ^= s[r]; //a ^ b的结果再^a,存入a,此时b=a,a=b完成交换
反转字符串Ⅱ在上一道题的基础上多加一个判断即可
注意最后需要判断尾数够不够k个,来确定end指针的位置,所以我们需要取min:int end = Math.min(ch.length - 1, start + k - 1);
也可以直接用i+k<=s.length()判断
替换数字思路非常简单,遍历到数字就append”number”(❌)
nono,给的是String ...
[1009]hash刷题思路
hash
本篇博客只记录刷题思路不记录具体代码,用于本人快速回顾题目来源代码随想录今天还在喝中药🤒
有效的字母异位词服了每次都想不到用数组
虽然还是要两次for罢了,但起码复杂度还是O(n)
优化剪枝:
先判断长度是否相同
我靠好妙,官方解答是第一次for数组确定value,第二次for数组 if数组==0;还有一种解法是第一次for1确定数组value,第二次for减去s2的数组再if ==0,这就就可以只遍历length* 2而不是26* 2【但如果是长字符的话效率不高】但实际运行并没有快很多🤔
还有一种方法:toCharArray后sort再equals,但感觉有点过于依赖API了
看题解下的评论也真好!!!
两个数组的交集这个主要是观察题干发现:1. 要求不重复 2. 数字范围没有限制
所以就用set解决
还有一个难点是set转数组了
快乐数
额老师我是真的没想到居然使用hash存结果啊
没什么思路
首先 求和不难想到,但是没想到while的跳出条件
条件就是当前和是之前存在的,这样的话就会一直循环
两数之和梦开始的地方
快速查找是否存在——用哈希表
涉及到对 ...
[1008]链表刷题思路
链表
本篇博客只记录刷题思路不记录具体代码题目来源代码随想录刷完感想:奖励今天喝中药调理脑子🙂
:::tip 和链表题相关的提示
虚拟头节点
双指针
一般涉及三个节点:pre、cur,next:::
基础包含data和next下一节点指针
新增:cur.next = new;new.next = next;【这里就涉及到一个保存操作】
删除:cur.next = cur.next.next
删除节点
注意对头节点进行特判【因为是站在当前节点,判断下一节点是否值相等,相等的话把当前节点的next为下下节点】
不要用for,不知道具体长度,用while
不能直接对head操作,而是新建一个链表节点
设计链表感觉没什么好说的,记得用虚拟头节点
show code
//单链表class ListNode { int val; ListNode next; ListNode(){} ListNode(int val) { this.val=val; }}class MyLinkedList { //size存储链表元素的个数 in ...
[1007]数组刷题思路
数组
本篇博客只记录刷题思路不记录具体代码题目来源代码随想录刷完感想:今天去吃烤肉拌饭🤤
:::tip 和数组题相关的提示
数组是存放在连续内存空间上的相同类型数据的集合。
可以靠索引快速定位
双指针:::
二分查找典型,但是思路好像还是没跟上
注意区间的左闭右开会影响很多东西
没事之前已经把能踩的坑都踩过一遍了(https://www.yuque.com/kixuan/yy8qei/lpansi5g3iogf6tr
这里重新贴一下用于警醒自己😰
哈哈服了写个二分查找写出了一堆问题,来看你写的破代码!🥰🥰原代码
public int searchInsert(int[] nums, int target) { int len = nums.length; int left = 0, right = len - 1; int mid = (left + right) / 2 + 1; while (left < right) { if (nums[mid] == target) return mid; if (nu ...
[1006]贪心刷题思路
贪心
本篇博客只记录刷题思路不记录具体代码,用于本人快速回顾题目来源代码随想录刷完感想:连刷三个小时头都要晕了,去吃牛肉饭了🤤
:::tip 和贪心题相关的提示局部最优得到全局最优:::
分发饼干非常标准的贪心
先满足胃口小的,注意这种情况是for饼干if胃口,因为无论是否满足,饼干一定会后移动,胃口不一定会后移(和先满足胃口的思路不一样,这种是胃口一定会前移,饼干不一定前移)
第二tips就是用if优化for循环,做一个自减
摆动序列笑死感觉不算贪心算模拟,思路上有难度
比较[当前差值]和[上一个差值]
相同不算,不同算一个
最大子序和贪心的点在于:碰到连续和为负数的情况就舍弃,不要影响后续的最大和
买股票的最佳时间Ⅱ非常简单:求差,正数就算上利益
(不用担心连续正数,这种情况也考虑到了)
跳跃游戏思路:不能从后往前,因为除了要判断能否往后到达,还要考虑前面能不能到这里
==》考虑最远范围 + 能不能到达(从前考虑就比较容易,刚好是之前的最大值)
跳跃游戏Ⅱ比较有难度,难度在于找到更新maxReach的时机,是到了当前跳跃边界才更新cnt,而不是更新了maxReach就更新cn ...