自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(86)
  • 收藏
  • 关注

原创 优化算法总结

机器学习和神经网络等个人的简单理解:无论是机器学习还是神经网络、深度学习等,他们的目的都是一致的,想要通过给定的结构模型去拟合未知的真实模型。之所以会有这么多不同的神经网路、机器学习算法,是因为每一种算法和结构都包含了不同领域的先验知识,更能帮助模型快速大致准确地收敛到未知的真实模型。所以想要一个普世的大一统结构模型是不现实的。优化算法的目的就是为了快速降低损失函数(或者说目标函数)的训练误差,所以无论是机器学习算法还是神经网络都需要优化算法做支撑...

2020-09-11 16:06:45 501

原创 大数据-排序、查重、第k大

1. 排序、top k含有重复值:桶排序(将数据映射到有序桶中),每个桶再进行排序。其次还可以结合堆来实现 top k不含重复值:直接使用BitMap来做,每一个bit位都代表一个数字,比如若数字为 32,就可以 有bitSet.set(32),代表第32个bit位上有数字。——可以推出,16亿数字只会消耗 16*10^9个bit,即只会占用2G空间2. 包含统计信息的排序、top k...

2020-03-15 16:15:10 479

原创 JVM调优

如果CPU使用率较高,GC频繁且GC时间长,可能就需要JVM调优了,基本思路就是让每一次GC都回收尽可能多的对象,提高吞吐率。对于CMS来说,要合理设置年轻代和年老代的大小。该如何确定它们的大小呢?这是一个迭代的过程,可以先采用JVM的默认值,然后通过压测分析GC日志。如果看年轻代的内存使用率处在高位,导致频繁的Minor GC,而频繁GC的效率又不高,说明对象没那么快能被回收,这时年...

2020-03-08 10:15:14 251

原创 JVM编译浅析

1.编译器与解释器的区别与优劣编译器:将完整的用户代码经过一系列处理翻译成完整的目标语言。解释器:直接利用用户提供的输入执行源程序中的操作。因此可以逐个语句的执行源程序。编译器产生的机器语言目标程序通常比解释器快很多,代码的优化效果也比解释器好。但是利用解释器逐句执行的特点,解释器更容易进行错误诊断,与用户的交互效果也比编译器好。2.一个编译器的结构一个编译器可以分为前端和后端:前端...

2020-03-07 10:12:52 179

原创 为什么JVM要分栈区和堆区

可以看看编译原理运行时内存区域划分。堆,栈,方法区等都有自己特有的内存管理方式,都有自己合适存储的内容,方便jvm去调用和进行内存管理。我们知道程序最终都会编译成二进制指令执行,而且都是顺序执行的,以main函数为入口(作为栈底)不断向其中添加指令,最后再执行,不断返回,因此最符合这一逻辑的便是栈这种数据结构,且地址上连续,访问速度够快。但是我们从一个程序运行开始考虑,首先是...

2020-02-28 17:08:18 1229

原创 MySQL数据库——日志

MySQL数据库——日志日志bin log同redis的AOF类似,记录sql语句的原始提交指令,是追加写入的。事务提交时,会将其中的sql命令追加写入。所以这可以用于数据主从复制,和数据恢复。由Mysql的Server层实现,是逻辑日志。redo log重做日志文件是记录数据修改之后的值,用于持久化到磁盘中。Innodb实现的,物理日志,记录的是物理数据页修改的信息。undo...

2020-02-28 11:49:31 223

原创 深入理解全文索引

参考链接——https://blog.csdn.net/weixin_33966095/article/details/89267494?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task举一个例子,百度上你输入一个关键词,就需要检索出和这个关键词相...

2020-02-26 11:48:43 198

原创 深入理解适配器模式

1.总述简而言之,适配器模式,就类似于一个中间转换器。举个例子:现在的系统A已经完成了开发,向客户C提供了统一的接口访问规则;但此时,客户要求添加新的功能,此时开发人员发现已经有第三方系统B实现了这个功能,但是B提供的接口和我们A提供的接口不一致,所以C不能直接通过A的接口直接访问B。于是适配器出现了,A系统直接新增一个实现了A接口的功能对象obj,只是在该对象中持有实现了B接口的对象引...

2020-02-25 16:03:41 245

原创 深入理解代理模式及其实现

这里主要是分析如下3种:静态代理、JDK动态代理、CGLIB动态代理1.静态代理按照代理创建的时期,可以分为动态代理和静态代理:静态代理:由程序员或者自动生成工具生成代理类,然后进行代理类的编译和运行。在代理类、委托类运行之前,代理类已经以.class的格式存在。动态代理:在程序运行时,由反射机制动态创建而成。下面举个例子:新建一个接口,UserService.java, 只有一个...

2020-02-20 16:36:13 278

原创 Left join原理

1、Left Join即保存左表的所有数据,然后和右表做连接操作,筛选出符合条件的数据,若右表中不存在左表对应的数据行,则该行右表相关字段置为空。2、其实即执行原理可以视作,从左表(驱动表)逐行取出数据与右表(被驱动表)进行匹配,筛选出合理的数据。从这就可以看出,左表始终是逐行扫描的,但是右表却可以优化,如果在右表中的该连接字段上加了索引的话,那会极大的地提升执行速度。3、所以引出了sql优化...

2020-02-17 17:27:56 3513

原创 TCP连接

1、三次握手1.1 为什么要三次握手三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。第一次握手:Client 什么都不能确认;Server 确认了对方发送正常,自己接收正常第二次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:对方发送正常,自己接收正常...

2020-02-15 15:39:58 184

原创 thrift——Server IO模式

https://blog.csdn.net/dyx810601/article/details/79163848https://www.cnblogs.com/zl-graduate/articles/6724446.html再说一句,IO多路复用和NIO、BIO并没有太大关系,它只是实现了一个线程就可以监听大量连接请求。该线程监听连接请求有select、poll、epoll三种形式,最佳形式...

2020-02-14 11:20:06 203

原创 深入理解Mysql索引及其物理存储

数据库索引的底层实现是B+树,索引可分为聚集索引和非聚集索引,一张表中只有主键能建立聚集索引,但可以建立多个非聚集索引。组合索引——最左匹配原则:组合索引的底层实现仍是b+树,只是其排序方式是按照多个字段依次排序,因此有了最左匹配原则,即查询字段时必须要按照从左至右的方式查找,否则索引就会失效。下面总结几个索引的注意事项:建立索引的字段不能使用函数,这将导致索引失效而进行全表扫描不要在列...

2020-02-12 21:43:34 420

原创 数据库引擎——MyisAM和Innodb

1、区别MyisAm(MySql默认数据库引擎)Innodb非聚集聚集可以没有主键必须有主键表级锁行级锁data域存的是数据项的地址data域存的是数据本身不支持事务支持事务通过聚集索引可以查到需要查找的数据, 而通过非聚集索引可以查到记录对应的主键值 , 再使用主键的值通过聚集索引查找到需要的数据2、innodb为什么要用自增i...

2020-02-12 16:35:58 138

原创 Java并发——AQS

1、Lock与AQS与CAS的关系Lock面向用户,AQS面向Lock,也就是说AQS为各种Lock提供了底层的支持,AQS的最核心原理之一就是利用CAS更新同步状态。2、AQS介绍AQS是AbustactQueuedSynchronizer的简称,它是一个Java提供的底层同步工具类,用一个int类型的变量表示同步状态,并提供了一系列的CAS操作来管理这个同步状态。AQS的主要作用是为Ja...

2020-02-12 14:33:15 199

原创 JVM——GC

1、垃圾回收算法1.1 垃圾标记引用计数——最简单的垃圾标记方式就是,对每一个对象指定一个引用计数器,每新增一个引用其对应的引用计数器加一,然后在垃圾回收时只需要判断当前对象的引用计数是否为0,即可进行清除。但是这会造成循环引用的问题,如果两个对象之间形成了循环引用,那将永远无法被标记。可达性分析——这种方式就是从“GC Roots”出发,寻找所有被其引用的对象(可达对象),对于不可...

2020-02-12 11:07:06 101

原创 Java锁优化

1、总述我们知道Java的锁有两种形式:一是synchronized,它是由JVM底层实现的,是java语言的关键字,底层是依赖对象内部的monitor锁来实现的,而monitor又依赖操作系统的MutexLock(互斥锁)来实现的,所以在JDK6.0之后,java对synchronized进行了优化,即引出了 偏向锁、轻量级所、自旋锁等概念。二是重入锁lock,它是jdk实现的一个接口,...

2020-02-11 13:54:03 128

原创 Reids之缓存雪崩、缓存穿透、缓存击穿

1、缓存雪崩缓存雪崩指的是原有的缓存数据出现了大批量的缓存过期,造成一时间大批量并发请求都到了数据库,造成数据库的压力激增,严重的会造成数据库宕机。从而形成一系列连锁反应,造成整个系统崩溃。【解决方案】从上面的分析可以看出只有当缓存同时大批量过期的时候,才会出现缓存雪崩的情形,所以只要想办法让缓存过期的时间分散开来即可。那方法就多了,比如说将热数据的缓存时间设置长一点,冷数据的过期时间设置得...

2020-02-10 11:28:48 183

原创 分布式负载均衡算法——一致性Hash、Hash槽

1、总述分布式负载均衡算法的主要目的就是为了缓解集群服务器的压力,让客户端的请求尽可能均匀分散在各个服务器节点中。下面主要分析一致性Hash和Hash槽两种算法。参考链接:https://blog.csdn.net/majunzhu/article/details/100173943https://blog.csdn.net/Saintyyu/article/details/1000563...

2020-02-09 17:31:00 1139

原创 Redis持久化

1、概念Redis中有两种持久化形式——RDB(Redis Database)、AOF(Append Only File)RDB:在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot),也就是说它存的是数据。AOF:AOF 文件是一个只进行追加操作的日志文件(append only log),日志中记录每一次执行的指令。2、优缺点RDB优点:体积...

2020-02-08 22:35:20 180

原创 线程池

1.定义线程池是一种多线程处理形式,处理过程中将任务提交到线程池,任务的执行交由线程池来管理。如果每个请求都创建一个线程去处理,那么服务器的资源很快就会被耗尽,使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。作用:能够极大地减少某些线程的频繁创建和销毁带来的时间开销比如说项目中使用到了thrift,client会向server发起大量并发请求,如果每次...

2020-02-07 16:18:44 163

原创 Java并发——阻塞队列的实现

1.使用场景阻塞的应用场景,比如 生产-消费模式,限流统计等等。什么 ArrayBlockingQueue、LinkedBlockingQueue、DelayQueue 等等,都是阻塞队列的实现。但是我们发现其使用目的和消息队列类似,实际上是的,只是阻塞队列是用于单个系统的消息传递,生产者消费者模式,而消息队列一般是分布式系统间的生产者消费者模式,但无论是哪种形式,其实现都离不开基本的多线程同...

2020-02-07 11:12:31 265

原创 Redis——Redis数据类型的底层数据结构

https://www.cnblogs.com/MouseDong/p/11134039.html1.简介redis是以键值对存储数据的,所以对象又分为键对象和值对象,即存储一个key-value键值对会创建两个对象,键对象和值对象。键对象总是一个字符串对象,而值对象可以是五大对象中的任意一种。在Redis中,每个对象都是存储在RedisObject中(Redis自己实现的包装类数据结构),...

2020-02-06 19:56:05 1147

原创 观察者模式

参考链接:http://c.biancheng.net/view/1390.html1.定义观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。观察者模式是一种对象行为型模式,其主要优点如下。降低了目标与观察者之间的耦合关系,两者...

2020-02-06 11:55:16 202

原创 工厂模式

参考链接:https://www.cnblogs.com/yssjun/p/11102162.html一、目的总的来说,工厂模式的主要目的就是用于封装和管理对象的创建过程,对上层的使用者隔离对象创建的过程,之所以要隔离封装这个创建过程,主要是因为:对象创建的过程复杂,使用者不容易掌握(比如对象创建要满足某种条件,但用户无需知晓),从而降低了用户使用代码的重复性以及复杂性对象本身有很多子类...

2020-02-06 11:19:08 114

原创 代理模式和装饰器模式

之所以将这两个放在一起,是因为这两个在功能上优点类似。但是我们这里主要讨论其异同点:功能上来讲:代理模式主要是为了控制对对象的访问。换句话说,用代理模式,代理类(proxy class)可以对它的客户隐藏一个对象的具体信息。而装饰器模式是为了对原有对象进行功能增强。从实现上来讲:代理模式是在代理类中创建并初始化某个被代理的对象,而装饰器模式需要持有外部传入实例对象的引用。从创建时期上来讲...

2020-02-04 16:30:23 121

原创 Java基础—— ==与equals、equals和hashcode

一、==与equals:==比较的是栈中存放的值(对于非基本类型存的是对象所在的堆地址,因此非基本类型不能使用==进行比较)equals是专门为非基本类型(对象)设计的,用于比较堆中对象的内容是否相同,但是Object类默认只是比较栈中存放的值,因此需要自己进行重写。二、equals与hashcode:两对象内容相等,一定有hashcode相等,反之不成立。为什么反之不成立呢,这是因...

2020-02-04 15:43:10 133

原创 Thrift采坑记录——Client多线程

一、Thrift 采坑Thrift 的Server/Client有个较为严重的bug(https://issues.apache.org/jira/browse/THRIFT-601 ),随机向thrift sever的监听端口发些数据,可能会导致Server OutOfMemory,细细看看代码,这个bug有点土。Thrift Client线程不安全,多线程下使用可能导致Serve...

2020-01-03 18:03:07 2569

原创 Java并发——synchronized

synchronized便是java的锁(本地锁),只能作用于一个共享实例对象,若被加锁的对象,存在多个实例的可能,仍然会造成并发安全性问题,若想要解决这种多实例并发的问题,可以采取分布式锁或者信号量机制。synchronized的三种应用方式,Java中每一个对象都可以作为锁,这是synchronized实现同步的基础:普通同步方法(实例方法),锁是当前实例对象 ,进入同步代码前要获得当前...

2019-12-28 17:47:52 153

原创 Java并发——volatile详解+JMM内存模型

https://www.jianshu.com/p/8755e8fd1d20补充说明,缓存和内存的一致性问题:1.在学习计算机组成原理时,我们知道,修改了缓存的数据后,有如下3中写回策略:(1)写回法当CPU写Cache命中时,只修改Cache的内容,而不立即写入主存;只有当此行被替换出时才写回主存。优点:减少了访问主存的次数。缺点:存在不一致性的隐患。解决问题:每个Cache行必须...

2019-12-27 17:44:23 155

原创 Java并发——条件变量

1.定义在操作系统——多线程同步互斥一文中已详细介绍过了条件变量及其使用注意事项。条件变量,是为了解决等待同步需求,实现线程间协作通信的一种机制。条件变量用来自动阻塞一个线程,直到某特殊情况发生唤醒该线程为止。通常条件变量和锁机制同时使用。2.Java中的条件变量2.1 synchronized + wait()、notify()、notifyAll()线程A(消费者):synchron...

2019-12-25 17:56:01 1103

原创 Redis——存储优化

1.对象存储在项目中以前对对象的存储才用的是序列化操作,每次存入Redis都需要先将对象序列化,然后在存入,取出时再反序列化。优点:虽然需要序列化和反序列化,但是可以直接操作对象的方法,方便快捷缺点:需要序列化和反序列化,并且修改单个字段,需要获取整个json,修改后,序列化保存,浪费空间,浪费时间,效率低后来为了节约内存空间,以及进度类需要实时更新其中某个字段,而非全部,所以为了...

2019-11-30 17:24:41 325

原创 go笔记——内建函数

内建函数,就是由语法规定存在的函数。各家编译器,如果为了支持其语法规则,则必须为使用者提供的函数。这些函数,包含在编译器的运行时库当中,程序员不必单独书写代码实现它,只需要调用既可,他们的实现,由编译器厂商完成。这些内建函数对于没有实现自己方法的类型而言是极其重要的,这些内建函数与对象无关。...

2019-11-01 16:15:45 228

原创 6.824——实验二:Raft

1.介绍这是构建KV存储系统一系列实验的第一个实验。而对于分布式数据库而言,首先要解决两个重大的问题:容错、一致性。所以这个实验当中,需要实现Raft协议(一个复制状态机协议)以解决这两个首要问题。一个可靠性服务需要通过存储其状态副本(比如数据等)到多个副本服务器上来实现容错。即使一些服务器节点失败了,其它副本服务器仍可以运行该服务。但问题的关键是,失败的服务节点会造成数据不一致。下一个实验...

2019-10-31 16:22:49 1318

原创 Thrift步骤

1.定义Thrift服务即编写.thrift文件:struct User { 1: i32 ID 2: string Name } service UserService { User GetUserByID(1:i32 userID) list<User> GetAllUser() } 2.编译Thrift用thrift工具编译上面...

2019-10-30 16:07:38 230

原创 分布式学习前瞻

1.概念分布式首先要关注两方面:一是分布式系统计算框架,二是分布式存储,三是分布式概念本身计算框架:目前来说基本上都是基于MapReduce的,可以说是开山鼻祖存储:存储又分为两方面文件系统:决定了数据在磁盘上的存储模式,以及系统对文件数据的操作——比如GFS、HDFS等数据库(这里主要是K-V数据库):以结构化的形式存储数据、管理数据(因为对于文件系统而言存储的都是二进制数据...

2019-10-24 21:08:53 205

原创 GFS

1.GFS 的主要需求在学习 GFS 的原理前,首先我们应当了解 GFS 在设计时所面对的需求场景。简单概括,GFS 的设计主要基于以下几个需求:节点失效是常态。系统会构建在大量的普通机器上,这使得节点失效的可能性很高。因此,GFS 必须能有较高的容错性、能够持续地监控自身的状态,同时还要能够顺畅地从节点失效中快速恢复存储内容以大文件为主。系统需要存储的内容在通常情况下由数量不多的大文件构...

2019-10-23 16:00:43 1514 1

原创 并发下的容器(ArrayList、HashMap)安全问题

最近在做项目的是后遇到了并发安全问题,当多个线程操作ArrayList、HashMap等数据结构时造成了数据不一致,或者莫名其妙的异常,最后查阅资料发现是本身这些数据结构的并发安全问题导致的。1.ArrayList我们知道ArrayList底层仍是数组模拟:add操作实际上是数组赋值,然后指针++操作另外当容量超过初始容量时会自动进行容量扩展,底层实现即通过copy方式将现在的数组cop...

2019-10-22 11:46:45 311

原创 RPC的实现原理(thrift/dubbo比较)

1.概念我们知道RPC的目的就是让Client像本地方法一样去调用远程(即Server)服务,而完成这一功能,从上至下,Server需要完成方法的包装序列化,以及负责实现网络通信和方法的具体实现;同样Client调用,首先也得持有方法对象,然后将方法以及参数序列化后,和Server通信,交由Server具体实现,最后Server返回响应的结果。总结一下,RPC框架需要解决的问题:1. 网络通...

2019-10-11 12:19:50 4028

原创 6.824——实验一Part IV: Handling worker failures

//// schedule() starts and waits for all tasks in the given phase (mapPhase// or reducePhase). the mapFiles argument holds the names of the files that// are the inputs to the map phase, one per map...

2019-10-07 20:55:35 206

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除