- 博客(595)
- 资源 (20)
- 收藏
- 关注
原创 限流算法
计数器法:无法限制短时间的正常并发请求,无法限制短时间的超额请求 滑动窗口法:无法限制短时间的正常并发请求,可以限制短时间的超额请求 漏桶法:不管请求来的多快,让请求按相同速率请求出去 令牌桶算法:令牌按一定速率放进令牌桶,请求来,拿到就执行,拿不到就抛弃 计算器法一个counter值,每来一个请求counter++ 当一个请求到来时,计算他与第一个请求的时间间隔,如果没超过1分钟,并且counter已经为100,则抛弃该请求 当一个请求到来时,如果他与第...
2020-11-27 20:04:56
294
原创 Netty实现tcp服务
服务器端:package com.netty.io;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer;import io.netty.channel.ChannelOption;import io.netty.channel.EventLoopGroup;import io.netty.c...
2020-11-25 19:54:12
1161
原创 六、Alibaba sentinel之限流原理分析
1、找到该文件,打开2、代码如下:有一个TimeTicker线程在做统计,每1秒钟做一次。有N个RunTask线程在模拟请求,被访问的business code被资源key保护着,根据规则,每秒只允许20个请求通过。package com.sentinel.sentinel.test;import com.alibaba.csp.sentinel.Entry;import com.alibaba.csp.sentinel.SphU;import com.alibaba.cs..
2020-11-22 14:13:00
1017
1
转载 五、Alibaba sentinel项目结构
sentinel-core 核心模块,限流、降级、系统保护等都在这里实现 sentinel-dashboard 控制台模块,可以对连接上的sentinel客户端实现可视化的管理 sentinel-transport 传输模块,提供了基本的监控服务端和客户端的API接口,以及一些基于不同库的实现 sentinel-extension 扩展模块,主要对DataSource进行了部分扩展实现 sentinel-adapter 适配器模块,主要实现了对一些常见框架的适配 sentinel-demo 样例模
2020-11-22 13:18:29
327
原创 三、Alibaba sentinel dashboard控制台下载安装
1、去https://github.com/alibaba/Sentinel/releases下载版本的jar包2、启动jar包java -Dserver.port=8080 \-Dcsp.sentinel.dashboard.server=localhost:8080 \-jar target/sentinel-dashboard.jar3、打开网址:http://localhost:8080/#/login,默认账号密码都是:sentinel...
2020-11-22 13:05:31
895
转载 二、Alibaba sentinel资源和规则
资源资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。 只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。 大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。规则围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。 所有规则可以动态实时调整。...
2020-11-22 13:03:05
614
转载 一、Alibaba sentinel简介
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。Sentinel 具有以下特征:丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台
2020-11-22 12:57:43
1702
原创 1458. 两个子序列的最大点积
这道题并不难,记录这道题的原因是因为他提供了动态规划两个数组的基本思路:二维矩阵形式思考一个数组放一行,一个数组放一列,这是很普遍的思考方式class Solution { public int maxDotProduct(int[] nums1, int[] nums2) { // dp[i][j] int dp[][] = new int[nums1.length][nums2.length]; for(in.
2020-11-19 09:51:37
281
原创 42. 接雨水
自己写的第一种做法:每次计算每个高度之间的雨水量卒!class Solution { private int getdata(int []height, int i){ int res = 0; // despite begin and end for(int k=0; k<height.length; k++){ if(height[k] < i){ res+=1;
2020-11-18 09:40:27
182
转载 Spark的算子的分类
从大方向来说Spark 算子大致可以分为以下两类:Transformation 变换/转换算子这种变换并不触发提交作业完成作业中间过程处理。Transformation 操作是延迟计算的也就是说从一个RDD 转换生成另一个 RDD 的转换操作不是马上执行需要等到有 Action 操作的时候才会真正触发运算。 Action 行动算子这类算子会触发 SparkContext 提交 Job 作业。Action 算子会触发 Spark 提交作业Job并将数据输出 Spark系统。从小方向来说Spark.
2020-11-17 13:42:39
692
转载 为什么spark比mapreduce快?
1、Spark vs MapReduce ≠ 内存 vs 磁盘其实Spark和MapReduce的计算都发生在内存中,区别在于:MapReduce通常需要将计算的中间结果写入磁盘,然后还要读取磁盘,从而导致了频繁的磁盘IO。 Spark则不需要将计算的中间结果写入磁盘,这得益于Spark的RDD(弹性分布式数据集,很强大)和DAG(有向无环图),其中DAG记录了job的stage以及在job执行过程中父RDD和子RDD之间的依赖关系。中间结果能够以RDD的形式存放在内存中,且能够从DAG中恢复,大
2020-11-17 12:40:00
598
转载 MySQL中,21个写SQL的好习惯
1. 写完SQL先explain查看执行计划(SQL性能优化)日常开发写SQL的时候,尽量养成这个好习惯呀:写完SQL后,用explain分析一下,尤其注意走不走索引。explainselectuserid,name,agefromuserwhereuserid=10086orage=18;2、操作delete或者update语句,加个limit(SQL后悔药)在执行删除或者更新语句,尽量加上limit,以下面的这条 SQL 为例吧:deletefro...
2020-11-16 21:35:57
150
原创 406. 根据身高重建队列
输入:[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]输出:[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]][4,4]因为4最小,并且是第一个,所以固定放在索引4的位置上[5,0]前面没有比他大的,查看索引是否被前面比他数小的占了[5,2]前面有两个,索引往后走,除了比他小的数占的索引,走到第三个占下就行[6,1]前面有1个,同理走 ......重点:确定每次最小数的位置!!!import jav...
2020-11-16 10:52:56
143
原创 优化接口性能的八个建议
数据量比较大,批量操作数据入库 耗时操作考虑异步处理 恰当使用缓存 优化程序逻辑、代码 SQL优化 压缩传输内容 考虑使用文件/MQ等其他方式暂存,异步再落地DB 跟产品讨论需求最恰当,最舒服的实现方式...
2020-11-15 12:07:11
297
原创 647. 回文子串 -> 中心扩展法
class Solution { private int expand(String s, int index){ if(index == s.length()-1){ return 1; } // self int res = 1; if(s.charAt(index) == s.charAt(index+1)){ res += 1; ...
2020-11-15 12:06:35
117
原创 记一次被毙的毕设思路
大数据下 自定义多类型文件 自适应 动态 快速 上传的优化与实践 一种可插拔式的文件上传引擎的研究与开发 技术要求主要有以下几方面: 支持超大数据量 扩展性:配置自定义,适应各种开发环境需求 稳定性:除网络异常情况100%成功 准确性:数据无丢失 自适应:自适应算法优化各类型文件的上传速度 体验:实时进度感知、网络异常断点续传等 效率:从操作系统IO层面、数据序列化压缩层面、缓存层面、JVM多线程层面、切片合并逻辑优化层面,..
2020-11-15 12:05:51
302
1
原创 Collections.sort()使用了什么排序?
Collections.sort()点击进入:点击sort()进入:如果没有指定Comparator 进入Arrays.sort: 如果Comparator为null,则进入sort方法 看是否设置了LegacyMergeSort.userRequested为true 如果设置了则使用归并排序,如果未设置则使用TimSort(优化归并排序) 当LegacyMergeSort.userRequested==true,采用legacyMergeSort ...
2020-10-12 22:56:27
2499
原创 Java的Arrays.sort()方法到底用的什么排序算法
元素个数 <47 :插入排序 47 <= 元素个数 <286 : 快速排序 元素个数 > 286 :归并排序
2020-10-12 20:36:46
511
转载 反射为什么慢?
java反射之所以慢,根本原因是编译器没法对反射相关的代码做优化。我们都知道 Java 代码是需要编译才能在虚拟机里运行的,但其实 Java 的编译期是一段不确定的操作过程。因为它可能是一个前端编译器(如 Javac)把 *.java 文件编译成 *.class 文件的过程;也可能是程序运行期的即时编译器(JIT 编译器,Just In Time Compiler)把字节码文件编译成机器码的过程;还可能是静态提前编译器(AOT 编译器,Ahead Of Time Compiler)直接把 *.java
2020-10-11 21:19:52
1210
原创 JDK和Cglib代理的区别
AOP底层原理:动态代理一、区别:JDK动态代理:基于反射机制,生成一个实现代理接口的匿名类,然后重写方法,实现方法的增强. 它生成类的速度很快,但是运行时因为是基于反射,调用后续的类操作会很慢. 只能针对接口编程的.public interface Movie { void play(); void sayHello();}//被代理类实现接口方法public class BabaiMovie implements Movie{ @Overrid.
2020-10-11 11:28:30
235
原创 简单工厂模式、工厂模式、抽象工厂模式
简单工厂模式简单工厂模式不是23种里的一种,简而言之,就是有一个专门生产某个产品的类。比如下图中的鼠标工厂,专业生产鼠标,给参数0,生产戴尔鼠标,给参数1,生产惠普鼠标。就是利用一个工厂,根据参数,传啥new啥,返回 "惠普鼠标" -> new HpMouse() "戴尔鼠标" -> new DellMouse()工厂模式工厂模式也就是鼠标工厂是个父类,有生产鼠标这个接口。戴尔鼠标工厂,惠普鼠标工厂继承它,可以分别生产戴尔鼠标,惠普鼠标。生产哪种...
2020-10-10 21:13:19
169
转载 MySQL数据库索引失效
表1:数据表结构 表2:数据表内容索引失效与优化1.全值匹配 2.最佳左前缀法则 3.不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描...
2020-10-10 20:21:14
319
转载 Tomcat Connector(BIO, NIO, APR)三种运行模式
Tomcat支持三种接收请求的处理方式:BIO、NIO、APR 。BIO 阻塞式I/O操作即使用的是传统 I/O操作,Tomcat7以下版本默认情况下是以BIO模式运行的,由于每个请求都要创建一个线程来处理,线程开销较大,不能处理高并发的场景,在三种模式中性能也最低。配置如下(tomcat安装目录下的/conf/server.xml):<Connector port="8080" protocol="HTTP/1.1" connectionTimeout
2020-10-10 20:11:15
280
原创 搜索二维矩阵
这个题有一个很简单的解法:从左下角的18开始,如果target比18大,则向右走,如果当前值比target小,则向上走 如果到达边界还不找不到,则return false,否则就会找到return trueclass Solution { public boolean searchMatrix(int[][] matrix, int target) { if(matrix.length == 0){ return false; }..
2020-10-10 13:53:39
155
原创 前缀树 Trie
摘自:leetecode208 实现前缀树Trie (发音为 "try") 或前缀树是一种树数据结构,用于检索字符串数据集中的键。一、应用:1. 自动补全2. 拼写检查3. IP 路由 (最长前缀匹配)4. T9 (九宫格) 打字预测二、 为什么使用前缀树三、Trie 树的结点结构四、常用操作1、向 Trie 树中插入键2、在 Trie 树中查找键3、查找 Trie 树中的键前缀...
2020-10-07 18:46:08
246
原创 设计模式七大原则
之前早已经学过了,不过根据名字很容易忘记实质性内容,简单总结一下: 单⼀职责原则 ⼀个类应该只负责⼀项职责 1、将类按功能拆分成多个类。 2、如果类内⽅法(功能)少,则没必要拆分,在⽅法上实现单⼀职责原则即可。 接⼝隔离原则 类实现的接⼝应该建⽴在最⼩接⼝上,不应该实现不需要的接⼝的⽅法 将大接⼝分解成小接口供类实现 依赖倒置原则 抽象不应该
2020-10-05 15:17:39
206
原创 HandlerMapping解析
Spingmvc中的HandlerMapping负责解析请求URL,对应到Handler进行处理(这里的Handler一般为Controller里的一个方法method,也可以为servlet或者Controller等)来看一个http请求的入口DispatcherServlet:DispatcherServlet继承FrameworkServlet,FrameworkServlet继承HttpServletBean,HttpServletBean继承HttpServlet。可以看出..
2020-10-04 15:09:02
6921
原创 三数之和
一开始用的递归做的,然后,,,,,,超时了????好吧,看了提示,说是双指针,那就做一下????,晚上宿舍聚餐去喽!!!import java.util.*;class Solution{ List<List<Integer>> res = new LinkedList<>(); Set<LinkedList<Integer>> set = new HashSet<>(); public List
2020-09-30 10:53:55
117
原创 如何用java写一个堆排序
至于啥是堆排序,这里就不细讲了,大家从网上查就可以了。第一步:给定一个数组,看成完全二叉树的形式(初始的堆结构) 给定一个索引,我们能够实现交换该索引在完全二叉树的位置 创建第一个方法,heapify // 递归交换数组中某一结点的值 private void heapify(int tree[], int n, int i){ /* tree:待排序数组 n:数组个数 i:某个结点
2020-09-28 15:15:07
254
原创 Kafka消息数据积压,Kafka消费能力不足怎么处理?
1、增加topic的partition数量,分发到其他结点,分散结点压力2、增多consumer group中consumer的数量,消费者数=分区数3、如果是下游的数据处理不及时:提高每批次拉取的数量。(拉取数据/处理时间<生产速度)...
2020-09-28 09:28:00
3072
原创 BASE 理论
BASE 理论(AP)BASE是Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)三个短语的缩写。BASE理论是对CAP中AP的一个扩展,通过牺牲强一致性来获得可用性,当出现故障允许部分不可用但要保证核心功能可用,允许数据在一段时间内是不一致的,但最终达到一致状态。满足BASE理论的事务,我们称之为柔性事务。 基本可用 :分布式系统在出现故障时,允许损失部分可用功能,保证核心功能...
2020-09-28 09:12:24
972
转载 为什么Redis集群有16384个槽?
对于客户端请求的key,根据公式HASH_SLOT=CRC16(key) mod 16384,计算出映射到哪个分片上,然后Redis会去相应的节点进行操作!那大家思考过,为什么有16384个槽么?ps:CRC16算法产生的hash值有16bit,该算法可以产生2^16-=65536个值。换句话说,值是分布在0~65535之间。那作者在做mod运算的时候,为什么不mod65536,而选择mod16384?这个问题,作者是给出了回答的!地址如下:https://github.com/an...
2020-09-26 20:19:31
3864
原创 为什么ReentrantLock不能完全替代synchronized?
《java并发编程实战》上说是因为如果使用Reentrantlock时,你没有释放锁,很难追踪到最初发生错误的位置,因为没有记录应该释放锁的位置和时间。在JDK1.5中,synchronized是性能低效的。因为这是一个重量级操作,它对性能最大的影响是阻塞的是实现,挂起线程和恢复线程的操作都需要转入内核态中完成,这些操作给系统的并发性带来了很大的压力。相比之下使用Java提供的ReentrankLock对象,性能更高一些。 到了JDK1.6,发生了变化,对synchronize加入了很多优化措施,有
2020-09-26 16:54:45
748
原创 LinkedBlockingQueue和ArrayBlockingQueue
相同:LinkedBlockingQueue和ArrayBlockingQueue都实现了BlockingQueue接口; LinkedBlockingQueue和ArrayBlockingQueue都是可阻塞的队列(内部都是使用ReentrantLock和Condition来保证生产和消费的同步;当队列为空,消费者线程被阻塞;当队列装满,生产者线程被阻塞.)不同:1、队列中的同步锁机制不同ArrayBlockingQueue中的锁是没有分离的,即生产和消费用的是同一个锁; 使用一个R.
2020-09-26 16:48:39
3366
原创 如何设置线程池的线程数?
合理的设置线程池的线程数需要针对不同的任务类型而定,任务类型可以分为cpu密集型、IO密集型和混合型。cpu密集型cpu密集型指的是线程处理任务时,cpu参与计算的时间比较多,这种情况下,如果设置的线程数过多,会增加上下文的切换次数,带来额外的开销。 线程数的设定公式是:线程数=(cpu核心数+1)。IO密集型IO密集型是指在处理任务时,IO过程所占用的时间较多,在这种情况下,线程数的计算方法可以分为两种:第一种配置方式:由于IO密集型任务线程并不是一直在执行任务,则应配置尽可能多的线程
2020-09-25 20:19:57
945
原创 堆排序
https://img2018.cnblogs.com/blog/1469176/201903/1469176-20190329000545588-1486048945.gif/** * 堆排序演示 */class HeapSort { public static void main(String[] args) { // int[] arr = {5, 1, 7, 3, 1, 6, 9, 4}; int[] arr = {16, 7, 3, 20, 17,.
2020-09-25 14:53:12
248
原创 Java JMM 内存模型的三个特征(happen-before)
重点学习有序性????Java JMM 内存模型是围绕并发编程中原子性、可见性、有序性三个特征来建立的 原子性:就是说一个操作不能被打断,要么执行完要么不执行,类似事务操作,Java 基本类型数据的访问大都是原子操作,long 和 double 类型是 64 位,在 32 位 JVM 中会将 64 位数据的读写操作分成两次 32 位来处理,所以 long 和 double 在 32 位 JVM 中是非原子操作,也就是说在并发访问时是线程非安全的,要想保证原子性就得对访问该数据的地方进行同步操作,譬
2020-09-25 09:54:20
334
原创 HashMap和ConcurrentHashMap的索引计算
HashMap计算hash:hashcode32位,然后低16位异或高16位,得到hash值 hash &(n-1)计算索引(等价于Hash % n)计算hash:return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);计算下标,其下标值为:(n-1) & hashn = (tab = resize()).length;p = tab[i = (n - 1) & hash]
2020-09-25 09:33:37
962
Linux网站搭建流程
2017-12-22
数学建模教材(精品)
2017-09-27
Linux操作系统实验教程_南大版
2017-09-23
2016年考研核心考点——计算机组成原理
2017-09-23
2016年考研核心考点-----计算机网络
2017-09-23
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅