算法
梦江河
聊聊高并发,数据库,存储
展开
-
负载均衡算法--权重随机
思路1)设w的权重之和为total,然后把total分成n份,n是w数组的长度,比如w数组[1,3,4,5],total=13,分成4份,那么第1份[1,1],第2份[2,4],第3份[5,8],第4份[9,13];2)在[1,total]范围上,选取一个随机数x,看落到哪个范围上,返回第几份的序号;伪算法// 返回[1,total]范围的随机数x=random(1,total);// 遍历区间,看x落在哪个区间for(每个区间:区间){if(区间包含x){return 当前区间序号;.原创 2022-05-12 22:50:18 · 347 阅读 · 0 评论 -
必撕算法系列
负载均衡算法(参考dubbo)权重随机权重轮询(平滑模式)一致性hash最少活跃调用数量限流算法(参考sentinel,google ratelimit)固定窗口滑动窗口令牌桶算法漏斗算法定时任务算法(参考dubbo时间轮,java ScheduledThreadPoolExecutor)小根堆时间轮有序表(二叉搜索树,跳表)延时任务算法Redisson缓存淘汰算法(参考caffeine)FIFOLRULFU待补充...原创 2022-04-23 22:27:17 · 380 阅读 · 0 评论 -
Http怎么解决粘包拆包的?
发送端:应用层协议的每个包到达传输层,如果是tcp,会可能出现以下情况:1)应用层的每个包被拆成多个tcp报文,分别发送,这是拆包;2)应用层的多个包组成一个tcp报文发送,这是粘包;接收端:发送端的数据通过网络传输到了接受端的tcp缓冲区,不知道如何组成一个应用层的包,这必须由应用层解决,方法如下:1)定长:应用层指定每个包的长度,如果数据不够,用空格补充,缺点是不够灵活,不能发送超出这个长度的包;2)分割符:指定分割符,接收端一直读取数据直到读取到指定的分割符;3)指定长度+数据:比如先原创 2022-04-21 23:31:30 · 4977 阅读 · 0 评论 -
定时任务算法
JDK Timer Timer timer = new Timer(); timer.schedule(new java.util.TimerTask() { @Override public void run() { System.out.println("ATask 3s 后执行"); } }, 3000); timer.schedu原创 2022-03-24 11:37:06 · 413 阅读 · 0 评论 -
sentinel集成nacos动态更新数据原理
1)动态数据源顶层接口loadConfig方法:返回目标数据,应该就是sentinel需要的各种规则对象;readSource方法:返回源数据,一般是字符串类型或者byte类型,然后解析成上面的目标数据类型,可推断出这个方法是实现的重点;getProperty方法:获取与当前数据源绑定的SentinelProperty,可以看出与目标数据有关;总结:整个流程是2->1->3的顺序2)顶层抽象类包含一个数据转换器,将源数据转换成目标数据,和SentinelProperty的实现类原创 2021-10-23 10:19:54 · 389 阅读 · 0 评论 -
打鱼学习HashMap-红黑树
HashMap当链表长度>8,也就是链表长度=9时会进行树化,前提是数组长度>=64,否则只会扩容。1)树化方法2)红黑树查找方法3)红黑树插入方法(如果元素数量太小,会由红黑树变成链表)4)红黑树修改方法HashMap扩容1)链表扩容2)红黑树扩容(int UNTREEIFY_THRESHOLD = 6参数)...原创 2021-04-08 16:55:16 · 110 阅读 · 2 评论 -
两个单链表相交问题
问题:给定两个单链表,判断是否相交,如果相交,返回相交的第一个节点思路:1)如果两个单链表都无环,可能相交;2)如果有一个单链表有环,另一个无环,则不可能相交;3)如果两个单链表都有环,相交的情况只能是两个单链表共用一个环,则可以细分为:入环节点是一个;入环节点不是一个;单独成环;...原创 2021-03-29 15:15:07 · 281 阅读 · 0 评论 -
链表有环无环问题
问题:给定一个单链表,返回链表入环的第一个节点,如果没有环,返回null// 找到链表第一个入环节点,如果无环,返回null public static Node getLoopNode(Node head) { if (head == null || head.next == null || head.next.next == null) { return null; } // n1 慢 n2 快 Node n1 = head.next; // n1 -> slow原创 2021-03-29 13:27:51 · 188 阅读 · 0 评论 -
2021-03-25
思路1)50亿条URL,每条64字节,总共300多G,只有4G内存,可以通过hash取模把每个文件分成若干个小文件,直到小文件的可以用Set原创 2021-03-25 23:34:36 · 66 阅读 · 0 评论 -
资源限制类算法-6
找出重复的URL机器hash或者文件hash,小文件里面的所有URL可以放到内存Set判重Top100理解成一个文件有100亿个URL,可能有重复,找出出现频率前100的所有URL也是hash到不同小文件或者hash到不同机器,统计每个小文件的前100或者不同机器的前100,利用小根堆找出总共的前100,比如全部整数分成了3个小文件,都找出了各自的前100,先拿第一个小文件构建小根堆,然后其他小文件的前100分别与它比较...原创 2021-03-24 12:28:16 · 126 阅读 · 0 评论 -
资源限制类算法-5
思路1)分段统计,根据10MB内存得出最大可以放多少个int整数,假设512个,搞一个数组int[] count=new int[512],把所有无符号整数分成512份,第一份的范围是[0,8868308),以此类推,统计每一份出现的次数;2)中位数肯定是排完序后中间的数,假设有30个,那中位数是15,第一份有3个,第二份有8个,第三份有9个,那么中位数必定在第三份里面,递归下去,直到范围缩小到可以使用内存排序;...原创 2021-03-24 12:19:34 · 88 阅读 · 0 评论 -
资源限制类算法-4
思路1)1GB内存约等于10亿字节,Map一个K,V对约等于8字节,10亿字节/10=1亿字节,可以存储1亿个K,V对,为保守起见,再除以10,1亿/10=1千万字节。将40亿个整数通过不断hash分成400份小文件,每份小文件大约有1千万字节;2)统计每个小文件出现次数最大的数,最后统计所有小文件出现次数最大的数;...原创 2021-03-24 12:03:31 · 158 阅读 · 0 评论 -
资源限制类算法-3
1GB内存1B=8比特1KB=1024B1MB=1024KB=1024*1024KB约等于一百万字节1G=1024MB约等于10亿字节43亿比特约等于6亿字节,没超过1G位图,把出现过的整数对应位置设置为1,最后遍历所有位置,找出所有没有出现过的整数10MB内存或3KB内存假设只有3KB内存,约等于3000字节,可以存放大约750个int类型,找离它最近的2的某次方,是512,定义int[] count=new int[512];32位无符号整数有4294967296个,..原创 2021-03-24 10:35:39 · 363 阅读 · 0 评论 -
资源限制类算法-2
思路:1)位图,每2位表示一个整数出现的频率,00表示没有出现过,01表示出现一次,10表示出现2次,11表示3次,超过3次的维持11不变原创 2021-03-24 00:40:39 · 104 阅读 · 0 评论 -
资源限制类算法-1
思路:1)5G内存能存储的小根堆元素数量与Map数量?2)假设小根堆元素数量最多为k个,第一次遍历文件,找出前k大的整数,小根堆元素不重复,用Map记录每个小根堆中整数出现的次数,最后把小根堆的所有整数连同出现的次数写到文件中去;3)记录2)出现的最小整数pre,第二次遍历文件,只找小于pre的整数,进行同样的操作;4)如果遍历文件发现没有找到新的整数,结束,优化,在第一次遍历文件的同时记录文件的整数数量,当发现已经写够这么多个整数时,就不用浪费最后一次遍历了。...原创 2021-03-24 00:25:12 · 97 阅读 · 0 评论 -
限流算法-Redis实现滑动窗口限流算法
public class SimpleRateLimiter { private Jedis jedis; public SimpleRateLimiter(Jedis jedis) { this.jedis = jedis; } public boolean isActionAllowed(String userId, String actionKey, int period, int maxCount) { String key = u原创 2021-03-21 08:36:25 · 780 阅读 · 0 评论 -
HashMap
HashMap插入、删除、查找哈希函数寻址算法put方法没有元素树节点链表节点扩容方法数组长度加倍只有一个节点树节点分离链表节点分离size方法树化方法数组长度小于64先扩容链表转成双向链表...原创 2021-03-02 10:58:46 · 69 阅读 · 0 评论 -
2020秋招笔试编程题
寻找矩形最大面积axb的矩形内切蛋糕,每块1x2,几种切法给定一个正整数数组L,一个非负整数M,和S,从L选若干个数,和为S,有几种选法,可以利用M次魔法,每次魔法会将选定的数变成该数的阶乘...原创 2020-10-11 11:56:28 · 343 阅读 · 1 评论 -
LeetCode22-括号生成
根据上面的状态树就可以用DFS或BFS来解决问题了原创 2020-07-20 16:10:03 · 104 阅读 · 0 评论