自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

大闲人柴毛毛

博观而约取,厚积而薄发

  • 博客(211)
  • 资源 (2)
  • 问答 (2)
  • 收藏
  • 关注

原创 聊聊对称/非对称加密在HTTPS中的应用

目前常用的加密算法主要分成三类:对称加密算法非对称加密算法消息摘要算法在互联网中,信息防护主要涉及两个方面:信息窃取和信息篡改。对称/非对称加密算法能够避免信息窃取,而消息摘要算法能够避免信息篡改。对称加密算法发送方和接收方需要持有同一把密钥,发送消息和接收消息均使用该密钥。相对于非对称加密,对称加密具有更高的加解密速度,但双方都需要事先知道密钥,密钥在传输过程...

2018-03-20 10:49:11 2415 1

原创 缓存世界中的三大问题及解决方案

目前的IO设备远不能满足互联网应用海量的读写请求。于是便出现了缓存,利用内存的高速读写性能来应付海量的查询请求。然而内存资源非常宝贵,将全量数据存储在内存中显然是不切合实际的。因此目前采用内存和IO结合的方式,内存只存储热点数据,而IO设备存储全量数据。 缓存的设计包含很多技巧,设计不当将会导致严重的后果。本文将介绍缓存使用中常见的三大问题,并给出相应的解决方案。1. 缓...

2018-03-14 15:55:03 3146

原创 程序员必知的并发编程注意事项

获取单例对象需要保证线程安全,其中的方法也要保证线程安全。单例对象会被多线程共享,因此要保证它是线程安全的,它其中的方法都要保证是线程安全的。工具类、资源驱动类、单例工厂类都要注意这个问题。 创建线程或线程池时请指定有意义的线程名称,方便出错时回溯。 线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。使用线程池的好处是减少在创建和销毁线程上...

2018-03-14 09:41:58 2016

原创 揭秘ThreadLocal

ThreadLocal是开发中最常用的技术之一,也是面试重要的考点。本文将由浅入深,介绍ThreadLocal的使用方式、实现原理、内存泄漏问题以及使用场景。ThreadLocal作用在并发编程中时常有这样一种需求:每条线程都需要存取一个同名变量,但每条线程中该变量的值均不相同。如果是你,该如何实现上述功能?常规的思路如下: 使用一个线程共享的Map<Thread,...

2018-03-13 11:27:26 1420 3

原创 Java异常体系中的秘密

相信大家每天都在使用Java异常机制,也相信大家对try-catch-finally执行流程烂熟于胸。本文将介绍Java异常机制的一些细节问题,这些问题虽然很小,但对代码性能、可读性有着较为重要的作用。Java异常体系介绍 在学习一项技术前,一定要先站在制高点俯瞰技术全局,从宏观上把控某项技术的整个脉络结构。这样你就可以有针对性地学习该体系结构中最重要的知识点,并且在学习细...

2018-03-12 17:00:48 1795

原创 10分钟搞懂蚁群算法

蚂蚁几乎没有视力,但他们却能够在黑暗的世界中找到食物,而且能够找到一条从洞穴到食物的最短路径。它们是如何做到的呢?蚂蚁寻找食物的过程单只蚂蚁的行为及其简单,行为数量在10种以内,但成千上万只蚂蚁组成的蚁群却能拥有巨大的智慧,这离不开它们信息传递的方式——信息素。蚂蚁在行走过程中会释放一种称为“信息素”的物质,用来标识自己的行走路径。在寻找食物的过程中,根据信息素的浓度选...

2018-03-11 16:13:52 97561 25

原创 手把手0基础项目实战(三)——教你开发一套电商平台的安全框架

写在最前本文是《手把手项目实战系列》的第三篇文章,预告一下,整个系列会介绍如下内容:《手把手0基础项目实战(一)——教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)》《手把手0基础项目实战(二)——微服务架构下的数据库分库分表实战》《手把手0基础项目实战(三)——教你开发一套安全框架》《手把手0基础项目实战(四)——电商订单系统...

2018-03-11 14:54:13 2481

原创 常用的分布式事务解决方案

众所周知,数据库能实现本地事务,也就是在同一个数据库中,你可以允许一组操作要么全都正确执行,要么全都不执行。这里特别强调了本地事务,也就是目前的数据库只能支持同一个数据库中的事务。但现在的系统往往采用微服务架构,业务系统拥有独立的数据库,因此就出现了跨多个数据库的事务需求,这种事务即为“分布式事务”。那么在目前数据库不支持跨库事务的情况下,我们应该如何实现分布式事务呢?本文首先会为大家梳理分...

2018-03-11 14:44:55 86113 32

原创 0基础教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)

本文你将学到什么?本文将以原理+实战的方式,首先对“微服务”相关的概念进行知识点扫盲,然后开始手把手教你搭建这一整套的微服务系统。 项目完整源码下载https://github.com/bz51/SpringBoot-Dubbo-Docker-Jenkins这套微服务框架能干啥?这套系统搭建完之后,那可就厉害了:微服务架构 你的整个应用程序将会被拆分成一个个功...

2018-02-02 15:52:27 7557 15

原创 柴毛毛大话设计模式——开发常用的设计模式梳理

写在最前本文是笔者的一点经验总结,主要介绍几种在Web开发中使用频率较高的设计模式。本文篇幅较长,建议各位同学挑选感兴趣的设计模式阅读。在阅读的同时,也麻烦各位大佬多多分享!有你们的肯定,才有我继续分享的动力如需转载,请与我联系!人工智能看面相最近忙里偷闲,对人工智能看面相进行了一些优化,欢迎各位大佬体验!体验后恳请各位大佬分享朋友圈!基础学习:UML四

2018-01-30 21:41:07 1943 1

原创 10分钟搞懂遗传算法

大自然有种神奇的力量,它能够将优良的基因保留下来,从而进化出更加强大、更加适合生存的基因。遗传算法便基于达尔文的进化论,模拟了自然选择,物竞天择、适者生存,通过N代的遗传、变异、交叉、复制,进化出问题的最优解。遗传算法看似神奇,但实现思路却较为简单。本文先跟大家介绍遗传算法的基本思想,然后用遗传算法来解决一个实际问题,最后给出遗传算法的代码实现和解析。废话不多说,现在就开始吧~遗传算法

2018-01-24 20:55:55 120974 38

原创 Redis源码分析(四)——Redis数据结构-整数集合

1. 整数集合特点有序:集合中所有值按照从小到大顺序排列。不重复可以存储int16_t、int32_t、int64_t三种类型的整数1. 数据结构typedef struct intset{ unit32_t encoding; unit32_t length; int8_t contents[];} intset;encoding:content数组中存储的整数类型(int

2017-10-14 18:49:56 1122

原创 Redis源码分析(三)——Redis数据结构-字典

1. 数据结构1.1 哈希表typedef struct dictht{ dictEntry **table; unsigned long size; unsigned long sizemask; unsigned long used;} dictht;table:存储节点的数组size:table数组的长度sizemask:size-1,用于在添加节点时计算节点在tabl

2017-10-14 17:15:33 2785

原创 Redis源码分析(二)——Redis数据结构-链表

数据结构——节点typedef struct listNode{ struct listNode *prev; struct listNode *next; void *value;}listNode;prev:链表节点的前驱next:链表节点的后继value:节点中的值数据结构——链表typedef struct list{ listNode *head; listN

2017-10-14 15:20:11 2812 1

原创 Redis源码分析(一)——Redis数据结构-字符串SDS

1. SDS简介Redis中使用的字符串均为『简单动态字符串』(Simple Dynamic String),简称SDS。SDS是在C字符串的基础上进行了一些包装,使得它更符合Redis的使用场景。在Redis中,C字符串只用在一些无需修改的地方,如日志打印;其他需要使用字符串的地方基本上使用的都是SDS。2. 数据结构struct sdshdr{ int len; int free

2017-10-14 15:01:32 4027 2

原创 服务器性能优化基础知识

性能调优整体思路空间换时间 对热点数据缓存,减少数据查询时间。分而治之 将大任务切片,分开执行。HDFS、MapReduce就是这个原理。异步处理 若业务链中有某一环节耗时严重,则该环节将拉长业务链的整体耗时。可以将耗时业务采用消息队列异步化,从而缩短业务链耗时。并行处理 采用多进程、多线程同时处理,提升处理速度。离用户更近一点 如CDN技术,将静态资源放到离用户更近的地方,从而

2017-10-13 14:03:50 1127 1

原创 了解你服务器的心情——top命令详解

top是Linux较为常用的命令,可以监控服务器的CPU、内存、进程的运行情况,话不多说,直接操作。输入top即可启动:下面我们就来逐一介绍top向我们展示的内容。第一行:系统概况top - 19:39:14 up 20 days, 7:48, 1 user, load average: 0.00, 0.01, 0.0519:39:14 up 20 days:系统运行时间1 user:用户

2017-10-12 20:26:34 2939 2

原创 MyBatis源码解析(二)——动态代理实现函数调用

如果我们要使用MyBatis进行数据库操作的话,大致要做两件事情: 1. 定义DAO接口 在DAO接口中定义需要进行的数据库操作。 2. 创建映射文件 当有了DAO接口后,还需要为该接口创建映射文件。映射文件中定义了一系列SQL语句,这些SQL语句和DAO接口一一对应。MyBatis在初始化的时候会将映射文件与DAO接口一一对应,并根据映射文件的内容为每个函数创建相应的数据库操作能力。而我们

2017-10-12 15:54:02 1062 2

原创 MyBatis源码解析(一)——MyBatis初始化过程解析

建议移步至简书浏览,排版较为整齐:http://www.jianshu.com/p/7bc6d3b7fb451. 准备工作为了看清楚MyBatis的整个初始化过程,先创建一个简单的Java项目,目录结构如下图所示: 1.1 Product 产品实体类public class Product { private long id; private String productName;

2017-10-11 20:20:45 1522

原创 我的Java学习之路

我认为,作为一名合格的程序员,精通一门语言只是最最基本的要求,除此之外,具备扎实的基础知识、了解主流的技术框架、具备快速学习的能力也都非常重要。语言是帮助你实现想法的工具,而作为程序员来说最为重要的东西是语言背后的你的想法,而这些想法需要通过长期的基础积累、经验积累而获得。我从大二的时候开始接触编程,到现在也有五个年头了。这五年我走了不少弯路、踩了不少坑。至此收到阿里offer,也算是达到了我人生第

2017-10-11 20:11:40 7269 7

原创 我的阿里秋招之路——阿里实习offer+校招offer

我的2017是忙碌的一年,从年初备战实习春招,年三十都在死磕JDK源码,三月份经历了阿里五次面试,四月顺利收到实习offer。然后五月怀着忐忑的心情开始了蚂蚁金服的实习。八月,又经历了两轮面试,总算拿到转正offer。到此为止,我总算可以尽情地享受最后的校园时光了。 希望我的经历与感悟能帮助到大家。我的读研经历阿里是我读研阶段的一个重要目标,刚上研一的时候我便立下Flag,计划了读研三年要做的事情

2017-09-08 00:28:39 59241 15

原创 Git命令速记

生成SSH Keyssh-keygen -t rsa -C "[email protected]"在用户主目录里找到.ssh目录将id_rsa.pub中的数据放到服务器的.ssh目录下克隆远程仓库git clone https/git查看所有的版本提交记录git log (--pretty=oneline)$ git logcommit affd8ca1bc90c0865fbdc42

2017-05-09 16:56:23 2504 1

原创 Spring速查手册(三)——Spring+JDBC

Spring的数据访问异常体系JDBC提供了SQLException异常,它是一个检查异常,必须要捕获。 但该异常过于笼统,只要是数据访问发生问题都抛出这个异常。因此很难在抛出该异常后进行恢复,因此该异常就没有抛出的必要。 Spring对JDBC的异常进行了转换,并进行了扩充,使得异常更加具体化,能够根据异常来进行恢复。 此外,Spring的数据访问异常均继承自DataAccessExcept

2017-05-09 15:20:08 1340 1

原创 Spring速查手册(二)——Bean的作用域

Bean的四种作用域单例(Singleton):整个应用中,只创建一个bean。原型(Prototype):每次注入或请求要给bean的时候都创建一个新的bean。会话(Session):每个session创建要给bean。请求(Request):每个WEB请求创建一个bean。PS:Spring默认的bean是单例的!使用会话/请求作用域的注意点// 创建一个session的bean@

2017-05-09 11:19:40 1139 1

原创 Spring速查手册——Bean装配

Spring提供三种Bean的装配方式,分别是: 1. 自动装配Bean 2. 在Java中装配Bean 3. 在XML中装配Bean1. 自动装配Bean(注解)Spring从两个角度完成Bean的自动化装配: - 组件扫描:扫描上下文中所有的Bean(由@Component、@Named注解完成) - 自动装配:将指定的Bean注入到指定的Bean中(由@Autowired、@Inje

2017-05-09 10:47:13 1079

原创 回溯法(一)——n皇后问题

问题描述 在一个n*n的棋盘上放置皇后,要求:一个皇后的同一行、同一列、同一条对角线上不允许出现其他皇后。请给出所有的放置方案。算法思路思路很简单,由于每行每列不能出现两个皇后,因此每行只能放一个皇后,那么第i行中皇后究竟应该放哪儿呢?我们可以从第i行第一列开始依次向后逐格判断,看看若放在当前位置是否会冲突,若不冲突,则继续考虑下一行,若冲突,则继续向后移动一格,再判断。 若i行所有的位置都

2017-04-12 14:33:24 3768 1

原创 图的遍历(BFS+DFS)

图的遍历与树的遍历基本类似,但要注意两个不同: 1. 图中可能有环路,因此可能会导致死循环; 2. 一个图可能由多个独立的子图构成,因此一条路径走到头后要重新选择尚未遍历的起点。 图的邻接表数据结构请参见:图的邻接表示法Java版宽度优先遍历思路选择一个尚未访问的起点,依次访问它的相邻结点;若相邻结点还有相邻结点的话,再依次访问尚未访问的相邻结点;直到以该结点为起点的这条路径上所有的结

2017-04-12 11:06:25 3131

原创 图的邻接表示法Java版

边节点 一个边节点有一条边 和 一个终止节点组成。/** * 边节点(由一条边和一个终止节点构成) */class ENode{ int id;// 终止节点的编号 int weight;// 边的权重}图的邻接表示图用一个Map< String,List>表示,其中String表示节点的编号,List中存储以该节点为起点的所有边节点。 Map<String,List<E

2017-04-12 11:02:57 1352 1

原创 动态规划法(五)——多段图问题

问题描述 给定一个多段图,求出多段图中的最短路径和最短路径长度。什么是多段图?多段图是一个有向、无环、带权 图。有且仅有一个起始结点(原点source) 和 一个终止结点(汇点target)。它有n个阶段,每个阶段由特定的几个结点构成。每个结点的所有结点都只能指向下一个相邻的阶段,阶段之间不能越界。 数据结构cost数组: 该数组用于记录以某个结点为起点,到终点t的最短路径长度值。

2017-04-11 14:36:35 12482

原创 动态规划法(四)——0/1背包问题

问题描述 有n个物体,重量分别是w0~wn-1,每个物体放入背包后可获得的收益分别为p0~pn-1,背包载重为M,且所有物体要么放要么不放,不能只放一部分。求如何放物体可以得到最高的收益。问题分析设f(i,m)表示第i步背包的总收益,其中i表示当前进行到了第i步,m为当前背包载重,则当前第i步只有两种选择:将第i个物体放入背包 此时背包总收益就变成f(i-1,m-wi)+wi。第i个物体

2017-04-08 23:35:50 2623 1

原创 动态规划法(三)——最长公共子序列

问题描述 给定两个序列,求出它们的最长公共子序列。 如:序列X={a,b,c,b,d,a,b},Y={b,d,c,a,b,a},则X和Y的最长公共子序列为{b,c,b,a}子序列:子序列为原序列的一个子集,并不要求连续,但要求子序列中元素的顺序和原序列元素的顺序一致。定理 设两个序列分别是X={x1,x2……,xm},Y={y1,y2……,yn},它们的最长公共子序列为Z={z1,z

2017-04-08 22:36:13 6342 10

原创 动态规划法(二)——弗洛伊德算法

问题描述 给定一个带权有向图,计算任意两结点间的最短路径。迪杰斯特拉算法可以计算指定起点到所有结点的最短路径长度,因此分别对每个结点使用一次迪杰斯特拉算法即可求的任意两结点间的最短路径。迪杰斯特拉算法的时间复杂度为O(n^2),因此采用这种方法的时间复杂度为O(n^3)。 但是,迪杰斯特拉算法不允许权值为负数,因此需要使用弗洛伊德算法。 弗洛伊德算法允许权值为负数的边,但不允许回路的路径长

2017-04-08 17:18:02 6048

原创 动态规划法(一)——概述

什么是动态规划法动态规划法也是用于求解最优化问题,也采用分步决策的策略,将一个大问题划分成若干个较小的同类子问题,根据子问题的解,自底向上,得出整个问题的解。与贪心法的异同相同都是用于求解最优化问题;都采用分步决策,计算出每一步的最优解。不同贪心法的每一步决策依赖于『最优量度标准』,不依赖于子问题的解和尚未作出的选择;动态规划法每一步决策依赖于子问题的解,无需最优量度标准。与分治法的异同

2017-04-08 16:15:05 1457

原创 贪心算法(五)——迪杰斯特拉算法

问题描述 给一个有向无环带权图,并给一个起点,求出该原点到所有顶点的最短路径。数据结构dis:Map<String,Integer> dis;存储原点s到指定节点的最短路径长度。 key表示节点编号,value表示s到该终止节点的最短路径长度。path:Map<String,String> path;存储以指定结点为终点的最短路径中,该终点的上一个结点的编号。 key表示终点编号,va

2017-04-08 13:19:14 3422 2

原创 贪心算法(四)——最小代价生成树

问题描述 n个村庄间架设通信线路,每个村庄间的距离不同,如何架设最节省开销?这个问题中,村庄可以抽象成节点,村庄之间的距离抽象成带权值的边,要求最节约的架设方案其实就是求如何使用最少的边、最小的权值和将图中所有的节点连接起来。 这就是一个最小代价生成树的问题,可以用Prim算法或kruskal算法解决。PS1:无向连通图的生成树是一个极小连通子图。PS2:生成树是图的一个子图,包括所有的

2017-04-07 22:56:51 10646 4

原创 贪心算法(三)——最佳合并模式

问题描述 给定n个有序文件,每个文件的记录数分别为w1~wn,请给出一种两两合并的方案,使得总合并次数最少。注意: 1. 外排序算法是将多个有序文件合并成一个有序文件的过程。 2. 在一次合并的过程中,两个文件中的所有记录都需要先从文件中读入内存,再在内存中排序,最后将排序的结果写入文件中。 3. 假设两个待排序文件记录数分别为n、m,那么将这两个文件合并成一个有序的文件需要进行n+m次

2017-04-05 23:00:16 9847 1

原创 贪心算法(二)——一般背包问题

题目 有一个背包,最多放M kg的物体(物体大小不限); 有n个物体,每个物体的重量为Wi,每个物体完全放入背包后可获得收益Pi。问:如何放置能获得最大的收益?注:背包问题分为两种,若每个物体不可分割,则称为0/1背包问题,这种问题无法用贪心法求的最优解,只能求的近似解。而若每个物体可以切分,则称为一般背包问题,可以使用贪心法求的最优解。下面讨论的就是一般背包问题。结果集一般背包问题中,

2017-04-05 21:19:48 39379 3

原创 贪心算法(一)——概述

贪心法用于求解最优化问题,即求解某一问题的最优解。 既然能用贪心法求解的问题是一个最优化问题,那么我们首先来了解下最优化问题的几个基本概念。最优化问题的几个基本概念目标函数 解决一个最优化问题,首先要将问题抽象成一个数学函数,这也就是一个数学建模的过程,这个能够描述问题的函数就称为『目标函数』,这个函数的最大/小值就是我们要求的最优值。约束条件 任何函数都有它的取值范围,所有取值范围的集合

2017-04-05 16:56:37 3512

原创 彻底搞懂红黑树

红黑树性质1、每个结点或是红色的,或是黑色的 2、根节点是黑色的 3、每个叶结点(NIL)是黑色的 4、如果一个节点是红色的,则它的两个儿子都是黑色的。 5、对于每个结点,从该结点到其叶子结点构成的所有路径上的黑结点个数相同。和AVL树的比较AVL树是一棵严格的平衡树,它所有的子树都满足二叉平衡树的定义。因此AVL树高被严格控制在XXX,因此AVL树的查找比较高效。但AVL树插入、删除结点后

2017-03-09 21:26:48 8103 1

原创 数据库三大范式

第一范式第一范式(1NF)要求数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值。若某一列有多个值,可以将该列单独拆分成一个实体,新实体和原实体间是一对多的关系。在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。 第二范式满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式要求实体中没一行的所有非主属性

2017-03-09 20:53:42 4810

剑指offer算法实现java版——面试题19二叉树的镜像

分析:所谓“镜像”就是从镜子里看到的样子。我们可以画一棵二叉树,然后画出该二叉树的镜像。画完图之后我们会发现,所谓“二叉树的镜像”就是把二叉树中所有子树的左孩子和右孩子进行交换。因此需要遍历二叉树所有的结点,在遍历的同时交换非叶子结点的左右子树。遍历我们可以使用先序遍历,首先判断当前根结点是否为叶子结点,若非叶子结点,则交换左右孩子,然后再分别对左右孩子进行相同的操作。

2016-03-14

剑指offer算法实现java版——面试题21包含min函数的栈

实现一个栈,要求使用O(1)时间获取栈中最小值,O(1)执行pop、push操作。

2016-03-14

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

TA关注的人

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