私信 关注
坤少_jkson
码龄10年

别再用廉价的勤奋掩饰你的懒惰

  • 332,369
    被访问量
  • 122
    原创文章
  • 18,430
    作者排名
  • 168
    粉丝数量
  • 于 2011-07-18 加入CSDN
获得成就
  • 获得157次点赞
  • 内容获得46次评论
  • 获得256次收藏
荣誉勋章
兴趣领域
  • #后端
    #Java#分布式#Spring Boot#Spring#架构#MySQL#Elasticsearch#Redis#Go/GoLang#Linux
TA的专栏
  • ES
    2篇
  • DDD
    2篇
  • opennms
    1篇
  • spring
    12篇
  • 面试
    2篇
  • 面试总结
    5篇
  • linux
  • oracle
    1篇
  • kafka
    1篇
  • rpc
    11篇
  • Java
    66篇
  • mysql
    5篇
  • git
    2篇
  • nginx
    6篇
  • lua
    3篇
  • disruptor
    1篇
  • tomcat
    2篇
  • 设计模式
    8篇
  • redis
    16篇
  • 架构
    29篇
  • 大数据
    1篇
  • 并发编程
    12篇
  • 数据库
    6篇
  • 前端
    2篇
  • 程序员那些事
    17篇
  • 运维
    4篇
  • 数据结构和算法
    11篇
  • 计算机系统
    4篇
  • jvm
    3篇
  • maven
    3篇
  • 最近
  • 文章
  • 资源
  • 问答
  • 课程
  • 帖子
  • 收藏
  • 关注/订阅

Leaf——美团点评分布式ID生成系统

背景在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识。如在美团点评的金融、支付、餐饮、酒店、猫眼电影等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数据库的自增ID显然不能满足需求;特别一点的如订单、骑手、优惠券也都需要有唯一ID做标识。此时一个能够生成全局唯一ID的系统是非常必要的。概括下来,那业务系统对ID号的要求有哪些呢?全局唯一性:不能出现重复的ID号,既然是唯一标识,这是最基本的要求。 趋势递增:在MySQL InnoDB引擎中使用的是聚集
转载
53阅读
0评论
0点赞
发布博客于 8 天前

Mybatis的插件管理怎么处理的

1. 原理MyBatis可以帮助我们在语句执行过程中的某一点进行拦截调用。它的实现原理就是插件采用责任链模式,通过动态代理组织多个拦截器(插件)将四大核心对象进行拦截增强变成个代理对象,从而可以改变Mybatis的默认对象的行为(诸如SQL分页改写,统计性能,打印日志等),mybatis源码环境搭建参考,通过mybatis的源码分析,我们可以更清楚的了解到策略模式和动态代理模式是如何使用的,后续在代码逻辑中可以借鉴2. 流程图3. 代码示例 <plugins>
原创
12阅读
0评论
0点赞
发布博客于 2 月前

本地缓存小计

1.概念 本地缓存,在我们日常开发中是必不可少的一种解决数据读取性能问题的方法。简单的说,cache 就是为了提升系统性能而开辟的一块内存空间,SpringBoot 1.x版本中的默认本地cache是Guava Cache。在2.x(Spring Boot 2.0(spring 5))版本中已经用Caffine Cache取代了Guava Cache。毕竟有了更优的缓存淘汰策略。这2个都是线程安全的,可以指定容量,多种过期策略,主要特性是将数据写入缓存时是原子操作。当缓存的数据达到最大规模时...
原创
27阅读
0评论
1点赞
发布博客于 2 月前

JAVA设计模式之装饰器模式

1.概念: 以对客户透明的方式来扩展对象的功能,用户根据功能需求随意选取组成对象的成分进行动态地将责任附加到对象上,通过方法的链式调用来实现装饰者提供了比继承更有弹性的替代方案,应遵循开闭原则(类应该对扩展开发,对修改关闭) 简单来讲就是动态的给一个对象增加一些职能,相对与生成子类更加灵活2.应用以及说明:1装饰模式增加强了单个对象的能力。Java IO到处都使用了装饰模式,经典的例子就是Buffered系列类如BufferedReader和BufferedWriter,它们增强了Read..
原创
22阅读
0评论
0点赞
发布博客于 2 月前

你不好奇 CPU 是如何执行任务的?

前言你清楚下面这几个问题吗? 有了内存,为什么还需要 CPU Cache? CPU 是怎么读写数据的? 如何让 CPU 能读取数据更快一些? CPU 伪共享是如何发生的?又该如何避免? CPU 是如何调度任务的?如果你的任务对响应要求很高,你希望它总是能被先调度,这该怎么办? … 这篇,我们就来回答这些问题。正文CPU 如何读写数据的?先来认识 CPU 的架构,只有理解了 CPU 的 架构,才能更好地理解 CPU 是如何读写数据
转载
32阅读
0评论
0点赞
发布博客于 2 月前

STAR结构化思维

概念S指的是situation,中文含义是情景,也就是在面谈中我们要求应聘者描述他在所从事岗位期间曾经做过的某件重要的且可以当作我们考评标准的事件的所发生的背景状况。T指的是task,中文含义为任务,即是要考察应聘者在其背景环境中所执行的任务与角色,从而考察该应聘者是否做过其描述的职位及其是否具备该岗位的相应能力。A指的是action,中文含义是行动,是考察应聘者在其所描述的任务当中所担任的角色是如何操作与执行任务的。R指的是result,中文含义为结果,即该项任务在行动后所达到的效果,通常
原创
45阅读
0评论
0点赞
发布博客于 2 月前

Elastic Search中filter的理解

在ES中,请求一旦发起,ES服务器是按照请求参数的顺序依次执行具体的搜索过滤逻辑的。如何定制请求体中的搜索过滤条件顺序,是一个经验活。类似query(指search中的query请求参数),也是搜索的一种方式。与常见的搜索对比,filter不会计算搜索条件相关度分数,也不会根据相关度分数进行排序,相对效率更高一些。且filter内置cache,自动缓存常用的filter数据,有效提升过滤速度。语法:GET /test_sort/_search{"query": {"bool": {"filt
转载
32阅读
0评论
0点赞
发布博客于 2 月前

使用枚举来巧妙干掉if-else,使代码更加优雅

导读:本文通过一个简单的例子来展示如何通过枚举巧妙地干掉if-else,使代码看起来更佳优雅。场景:当我们接收到一些数据需要对其进行处理时,由于它们来自于不同的渠道(如:腾讯,头条),不同渠道所需的处理方式不同,下面我们写一个简单Demo来实现该的场景。解决思路1、首先构建一个 GeneralChannelRule 基础规则抽象类,定义一个抽象方法process(),不同的渠道都需要实现该抽象方法。public abstract class GeneralChannelRule..
转载
52阅读
0评论
0点赞
发布博客于 2 月前
java集合对象排序总结
发布Blink于 2 月前

从 Java 内存模型看内部细节

写在前面Java 内存模型简称 JMM,其实是一个抽象模型,并非具体的存在。如上图想表达的,线程的读写都是直接跟 work memory 打交道,CPU 会通过一种机制将数据 flush 到 main memory 中。那么在 flush 发生之前,不同 CPU 之间就会出现可见性的问题,这很好理解。熟悉 Java 的大概都知道volatile关键字是用来解决内存可见性和指令重排序问题的,我们往往知道这两点,但却不知道其中的关联。关于 volatile 也有很多人误认为这是 Java 的特色..
转载
36阅读
0评论
0点赞
发布博客于 2 月前
跳表笔记
发布Blink于 3 月前

java集合对象排序总结

java集合对象按照某个属性进行排序有很多种方式,下面简单记录下1对象实现Comparable接口中的compareTo 方法,然后通过Collections.sort进行排序2通过Collections.sort配合匿名内部类Comparator来处理(Java1.7或更早版本的JVM不支持Lambda语法的情况下推荐使用这种)或通过List接口的(JDK1.8默认实现方法)Collections.sort(list, new Comparator<Order1>()...
原创
78阅读
0评论
1点赞
发布博客于 3 月前

从 Java 内存模型看内部细节

写在前面Java 内存模型简称 JMM,其实是一个抽象模型,并非具体的存在。如上图想表达的,线程的读写都是直接跟 work memory 打交道,CPU 会通过一种机制将数据 flush 到 main memory 中。那么在 flush 发生之前,不同 CPU 之间就会出现可见性的问题,这很好理解。熟悉 Java 的大概都知道volatile关键字是用来解决内存可见性和指令重排序问题的,我们往往知道这两点,但却不知道其中的关联。关于 volatile 也有很多人误认为这是 Java 的特色..
转载
49阅读
0评论
0点赞
发布博客于 3 月前

Redis命令之hscan

1、业务背景 在互联网的项目中为了提高性能和吞吐量,通常需要做一些优化和数据异构,比如查询DB,我们可以优化索引,通过命中索引来提高查询速度,也可以把数据异构到Redis,虽然Redis的性能非常好也支持5种数据结构,如果想性能更好的话,可以考虑异构到JVM缓存,也就是DB的数据异构到Redis,Redis的数据定期异构到JVM缓存2、带来问题 在Redis中通过用一个hashmap来存储业务数据,当这些业务数据比较小,我们可以通过hGetAll来获取redis的整个map然后设...
原创
103阅读
0评论
0点赞
发布博客于 3 月前

跳表笔记

1. 概念 跳表就是在链表的基础上增加了多层索引链表,这样在查找时就可以通过在上下不同层级的索引链表间跳跃,就能像二分查找(底层依赖的是数组随机访问的特性)算法一样达到快速查找的目的,但是它可以支持快速的插入、删除、查找操作,写起来也不复杂,甚至可以替代红黑树(Red-black tree)。jdk包下ConcurrentSkipListMap就是基于跳表实现的2.原理​​​ 为一个值有序的链表建立多级索引,比如每2个节点提取一个节点到上一级,我们把抽出来的那一级叫做索引或索引层。如...
原创
24阅读
0评论
1点赞
发布博客于 4 月前

Spring如何灵活使用Schema使得业务配置化?

最近在使用一个小组件,发现spring可以通过扩展Schema支持生成复杂的java对象,发现很多组件也是这么做的,比如dubbo,原理挺简单的,就是先定义xsd,xml,javabean,然后通过spring提供的工具来生成对应的实体对象,其实我们在做自定义组件的时候也可以借鉴这种思路去做,接下来以dubbo为例简单说明下这个过程,dubbo源码可以从github上下载下来1.设计java对象和属性在dubbo里就是ApplicationConfig,RegistryConfig,Pro...
原创
39阅读
0评论
0点赞
发布博客于 4 月前

查找算法之二分查找

1. 概念 二分查找(Binary Search)算法,也叫折半查找算法、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法,查找思想有点类似分治思想。每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为0。类似生活中猜字游戏,它的时间复杂度是O(logn),适用于经常查找的、但是不变的(增删)的有序列表。虽然查询效率很高,但也有一定的局限性,二分查找依赖顺序表结构,那么只能使用数组作为底层数据结构,数组按照下标随机访问数据的时间复杂度...
原创
839阅读
0评论
0点赞
发布博客于 5 月前

日志几点思考

在系统中经常会加很多必要的日志来帮忙我们定位分析解决问题,虽然这个日志挺简单,但是真的很重要,下面从几个方面来总结下 1.日志框架的来源 java有很多现成的日志框架,我们可以借鉴学习源码和设计思想,可参考之前转载的文章https://blog.csdn.net/jiangzhexi/article/details/80771163 2.日志打印规范 2.1日志分级:像log4j2有8个日志级别,按照从低到高为:ALL < TRACE < DEBUG ...
原创
37阅读
0评论
0点赞
发布博客于 5 月前

假如你是架构师,你要做些什么

很多做软件开发同学的梦想都是成为一名架构师,而架构师的核心工作就是做好软件设计。软件设计是软件开发过程中的一个重要环节,那么如何进行软件设计,其输出标准又是什么呢?软件设计过程中,如何和各个相关方沟通,使软件设计能同时满足用户的功能需求和非功能需求,并降低公司的开发成本? 前期思考  很多软件开发同学的职业规划都是架构师,试想这样一个场景,如果公司安排你做架构师,让你在项目开发前期进行了一些架构设计。你该如何开展你的工作? 应该如何说出你的工作成果? 你如何确定你的设计是否满足用户需求的.
转载
53阅读
0评论
0点赞
发布博客于 6 月前

排序算法之快速排序

1. 概念通过一趟排序将待排记录使用分治算法把一个串(list)分为两个子串(sub-lists),其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。2.原理​​​将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边,在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。简要步骤如下1) 每次排序
原创
41阅读
0评论
0点赞
发布博客于 6 月前

观察者模式实现之EventBus(Google)

观察者模式又叫发布-订阅(publish/subscribe)模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新自己,我们第一时间可能会想到消息队列,但如果在同一个JVM进程中要实现这种观察者模式该怎么去做?我们可能会想到JDK内置的java.util.Observer,或者自己写代码,其实Google提供的guava工具包也有类似的实现,这就是EventBus,wiki地址为https://githu...
原创
91阅读
0评论
0点赞
发布博客于 7 月前

Java Builder和静态工厂方法用法总结(Effective java)

我们在创建类的时候正常的就是定义几个属性,然后提供get,set方法,再加几个构造函数,如果对象的构造函数有多个,可能在实例化的时候会出问题,代码也不够优雅,这是我们通常会用lombok的注解,比如@Builder,@Data,@NoArgsConstructor,@AllArgsConstructor等等,如果我们不用注解的话,也可以自己写,下面的写法也是Effective java书中的推荐的写法,希望在以后写代码的过程中多借鉴这种优雅的写法和思路,示例如下public clas...
原创
101阅读
0评论
0点赞
发布博客于 7 月前

排序算法之归并排序

1. 概念归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序是一种稳定的排序方法。归并排序的核心思想是排序一个数组,我们先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,就是分而治之思想,分治算法一般都是用递归来实现的。2.原理​​​1. 把长度为n的输入序列分成两个长度为n/2的子序列; 2. 对这两个子序列分别采用归并排序;重点在于递归函数 3. 将两个排序好的子序列
原创
89阅读
0评论
0点赞
发布博客于 7 月前

排序算法之选择排序

1. 概念选择排序(Selection-sort)是一种简单直观的排序算法,实现思路有点类似插入排序,也分已排序区间和未排序区间。在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。它是最稳定的排序算法之一,因为无论什么数据进去都是O(n2)的时间复杂度,所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。2.原理1.无序区为数组[1..n],有序区为空; 2.
原创
53阅读
0评论
0点赞
发布博客于 7 月前

RPC接口调用容灾组件笔记

1. 背景概述 随着移动互联网的兴起,微服务架构的流行,现在很多大的系统会根据业务功能等因素划分成一个一个的微服务,那么在我们的应用中就会有很多rpc接口调用,为了高可用,一般都是双机房部署,当某个机房挂掉的时候可以去调用另外一个机房的服务进行重试,当A机房服务a比如连续N次不可用,或者1分钟内M次不可用,则把这个A机房的这个服务a标记1分钟内不可用,1分钟后再去探活,探活频率可以为1分钟内3次可用则标记该服务可用,这种RPC跨机房重试按理都应该在rpc框架去做,但是如果rpc某个版本没有提供...
原创
87阅读
0评论
0点赞
发布博客于 7 月前

排序算法之插入排序

1. 概念简单来讲就是将数组中的数据分为两个区间,已排序区间和未排序区间。初始已排序区间只有一个元素,就是数组的第一个元素。插入算法的核心思想是取未排序区间中的元素,在已排序区间中找到合适的插入位置将其插入,并保证已排序区间数据一直有序。重复这个过程,直到未排序区间中元素为空,算法结束。2.原理从第一个元素开始,该元素可以认为已经被排序; 取出下一个元素,在已经排序的元素序列中从后向前扫描(每次取下个元素当成基准参数和之前的数字进行挨个比较); 如果该元素(已排序)大于新元素,将该元素移到下
原创
39阅读
0评论
0点赞
发布博客于 7 月前

排序算法之冒泡排序

1. 概念冒泡排序是一种简单的排序算法。只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩互换。一次冒泡会让至少一个元素移动到它应该在的位置,重复n次,就完成了n个数据的排序工作。2.原理1.比较相邻的元素。如果第一个比第二个大,就交换它们两个;2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;3.针对所有的元素重复以上的步骤,除了最后一个;4. 重复步骤1~3,直到排序完成(需要注意
原创
32阅读
0评论
0点赞
发布博客于 7 月前

JSON序列化小计

项目中经常需要对象转成json字符串,json串转对象,一般经常用fastjson,gson,以及springboot默认支持的jackson,由于fastjson爆出漏洞太频繁,新项目一般建议用gson或jackson,也可以用protostuff来做,protostuff的性能比较好,具体benchmark可以参考https://github.com/eishay/jvm-serializers/wiki,如果想提供多种工具类可以定义统一的接口采用SPI的机制,通过SPI可以对外提供多种选...
原创
60阅读
0评论
0点赞
发布博客于 7 月前

享元模式在程序中的应用

享元模式的概念:如果在一个系统中存在多个相同的对象,那么只需要共享一份对象的拷贝,而不必为每一次使用都创建新的对象。说白了就是减少创建对象的数量,以减少内存占用和从而提高系统性能。我举个简单的场景,我们根据异常code码定义了几个异常,程序在处理过程中抛出这些异常,正常来讲,我们通过new一个RuntimeException就好了,但是如果程序的调用量比较大的时候频繁的new一些临时对象,会引起GC,影响系统稳定,我们可以考虑把这几个对象缓存起来,这样就可以不用频繁创建对象,其实这就是一种池技...
原创
37阅读
0评论
0点赞
发布博客于 7 月前

IO概念和IO模型

1.前言 IO的概念和模型很重要,不过每次看完资料过段时间又忘了,还得需要亲自写一下,加深下记忆和理解,本篇文章大部分是依据网上资料整理而来,从而构建IO这块的知识体系!在Unix的世界里,一切皆文件,比如socket,在socket处理过程中,我们对这些流进行的读写操作就是IO操作,操作系统会把socket流转换成一个文件描述符,也就是fd(整数),对这个整数的操作就是对socket操作.IO的分类可以分为网络IO和磁盘IO,I/O 模型就是操作系统执行 I/O 指令的方法。主流的 I...
原创
94阅读
0评论
0点赞
发布博客于 8 月前

京东毫秒级热key探测框架设计与实践,已完美支撑618大促(转载)

在拥有大量并发用户的系统中,热key一直以来都是一个不可避免的问题。或许是突然某些商品成了爆款,或许是海量用户突然涌入某个店铺,或许是秒杀时瞬间大量开启的爬虫用户, 这些突发的无法预先感知的热key都是系统潜在的巨大风险。风险是什么呢?主要是数据层,其次是服务层。热key对数据层的冲击显而易见,譬如数据存放在redis或者MySQL中,以redis为例,那个未知的热数据会按照hash规则被存在于某个redis分片上,平时使用时都从该分片获取它的数据。由于redis性能还不错,再加上集群模式,每秒我们
转载
116阅读
0评论
0点赞
发布博客于 8 月前

java异步任务执行ListenableFuture

1.业务场景 在实际应用中 我们在优化一个方法的性能时通常会考虑使用多线程,比如网站单品页会后台调用诸如商品,库存,优惠券,促销,风控等特别多的接口,如果都串行调用接口会很慢(相当于各个rpc的执行时间),为了提高方法的性能,我们会用并行去调用各个RPC接口,有的接口会有依赖关系,既调用A接口,拿到结果再去调用B接口,如果我们想调用完一个RPC接口后直接去调用另外一个接口,或者调用完一个RPC接口后增加个回调函数做其它动作该怎么去处理 2.方案分析 Fu...
原创
195阅读
0评论
0点赞
发布博客于 8 月前

HTTP Server : 一个差生的逆袭(转码农翻身)

我刚毕业那会儿,国家还是包分配工作的,我的死党张大胖被分配到了一个叫数据库的大城市,天天都可以坐在高端大气上档次的机房里,在那里专门执行SQL查询优化,工作稳定又舒适。隔壁宿舍的小白被送到了编译器镇,在那里专门把C源文件编译成EXE程序,虽然累,但是技术含量非常高,工资高,假期多。我成绩不太好,典型的差生,四级补考了两次才过,被发配到了一个不知道什么名字的村庄,据说要处理什么HTTP请求,这个村庄其实就是一个破旧的电脑,令我欣慰的是可以上网,时不时能和死党们通个信什么的。不过辅导员说了,我们都有...
转载
80阅读
0评论
0点赞
发布博客于 9 月前

JVM优化分析笔记

1.前言我们的Java应用一般会配置JVM参数,比如GC策略,Java堆大小等等,当系统遇到问题是,我们可以通过jmap查看堆内对象示例的统计信息,通过jstack命令可以继续查看该线程当前的堆栈状态,通过jstat命令可以查看堆内存各部分的使用量,以及加载类的数量等各种指标,通过JVisualVM来查库JVM的运行信息包括线程和内存使用情况,还可以设置参数打印GC日志,-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/export/Logs/...
原创
71阅读
0评论
0点赞
发布博客于 9 月前

ElasticSearch知识点总结

先举个场景,假如ES有10个分片,我们根据某个关键字查询数据,且按照时间排序,当查询第9页的数据,每页100条数据,当客户端发起这个操作,ES的处理流程是怎么样的?(带着问题去思考) 1. from+size分页方式 查询过程大体上分为查询和取回这两个阶段,广播查询请求到所有相关分片,并将它们的响应整合成全局排序后的结果集合,这个结果集合会返回给客户( 具体参考https://www.elastic.co/guide/en/elasticsearch/referen...
原创
146阅读
0评论
0点赞
发布博客于 9 月前

HashMap在JDK8前后的区别

背景 目前,部门的很多JAVA项目使用的还是JDK7,其实JDK8的升级进行了很多优化,而且目前最新的JDK版本已经已经到了JDK12,版本帝真的很可怕。其实也不用很慌,因为从JDK9开始就是每半年发布一个版本,2019年JDK就会到JDK13,更多的关注重大功能变更就好了。但是对于HashMap来说,JDK8的优化还是有可以看一下源码的意义的,本文的目的就是针对于这个优化画一下重点。JDK7的HashMap原理 在JDK7中,HashMap的实现方式是数组+链表。...
转载
159阅读
0评论
0点赞
发布博客于 9 月前
优秀站点大全(持续更新)
发布Blink于 10 月前

优秀站点大全(持续更新)

我们搞技术的都会有收藏的干货网址,我把我的干货网址分享出来,如果对大家有用的话,可以点赞转发收藏,如果你有更好的技术网址欢迎留言分享啊1.Github技术Java 核心知识库 https://github.com/crossoverJie/JCSprout技术必备基础知识 https://github.com/CyC2018/CS-NotesJava program...
原创
203阅读
1评论
1点赞
发布博客于 10 月前

监控系统学习总结

1.背景介绍 我们在工作中开发的业务系统都要接入监控系统并配置上报警信息,当某个业务系统的某个方法调用性能飚高,或者可用率下降的时候,我们通过报警能及时发现并处理,监控系统可以按照秒,分钟,小时看这个方法的执行调用情况,类似下图,那么这种监控系统我们是否考虑过业界有哪些实现?以及这种监控系统的原理是啥?底层存储的数据结构是啥?2. 原理分析 通常我们的业务系统...
原创
183阅读
0评论
0点赞
发布博客于 10 月前

重新认识AOP(二)

1.使用场景 项目中比如日志,事物,方法调用监控,自定义链路监控等场景都需要在方法的执行前后加一段代码处理逻辑,如果都在业务类里进行写的话,代码会出现很多冗余重复的代码.比如下面这种在方法执行前后增加日志,考虑采用插桩机制避免这种重复代码 public void testInfo(String param){ log.info("before invoke,...
原创
124阅读
0评论
0点赞
发布博客于 10 月前

org.apache.catalina.LifecycleException: A child container failed during start

1.问题产生 在开发一个需求的时候需要引用二方包,引入后起来报下面的错误,项目是springboot-1.4.5,下面是截取部分日志,关键日志 Unable to start embedded Tomcat 该异常出现在TomcatEmbeddedServletContainer类中2020-04-23 17:20:34.217 [main ] [,,] ...
原创
116阅读
0评论
1点赞
发布博客于 10 月前

springboot加载配置项application.yml的优先级

我们在用springboot开发项目的时候,我们在线上或预发部署的时候,经常需要把这个文件application.yml提出来,然后根据不同分组配置不同的配置项,比如配置日志参数等,比如我代码的appliction.yml(配置文件路径在–file:./config/)的有个日志配置项配置的级别是debug,然后如果我再线上分组也提出来个appliction.yml(路径是–file...
原创
578阅读
0评论
0点赞
发布博客于 10 月前

重新认识AOP(一)

我们知道springframework的核心是IOC和AOP,通过AOP可以轻松实现诸如日志,事物,监控等功能,我们最近在做数据库归档技改也用到了AOP切面,spring aop提供了下面一些注解,比如@Before,@Around,@After @AfterReturning @AfterThrowing,这些注释参考官网文档即可https://docs.spring.io/spri...
原创
67阅读
0评论
0点赞
发布博客于 11 月前

spring容器和bean加载流程图

上面这些类的作用和区别?比如PostConstruct InitializingBean在使用上基本没啥区别,我觉得区别就在一个是spring的注解,一个是Java的注解(符合JSR定义的规范)...
原创
155阅读
0评论
1点赞
发布博客于 1 年前
Java线程池源码分析(一)
发布Blink于 1 年前

Java线程池实现原理及其在美团业务中的实践(转载加总结)

随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流。使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器。J.U.C提供的线程池ThreadPoolExecutor类,帮助开发人员管理线程并方便地执行并行任务。了解并合理使用线程池,是一个开发人员必修的基本功。本文开篇简述线程池概念和用途,接着结合线程池的源码,帮助读者领略线程池的设计思路,最后回归实践,通过案...
转载
132阅读
0评论
0点赞
发布博客于 1 年前

MySQL索引原理背后的思考(转载加总结)

MYSQL索引的思考 当我们在用mysql做查询时候,经常会建立索引,因为索引可以提高查询性能,那你是否思考过mysql索引的底层原理是啥?底层存储结构是啥?我们从网上可以查到索引是数据库管理系统中一个排序的数据结构,以协助快速查询,更新数据库表中的数据索引是个数据结构,并且索引数据也会占用大量空间,所以数据库索引数据是一般放在磁盘上的 既然知道建立索引就是为了更快的查...
转载
66阅读
0评论
0点赞
发布博客于 1 年前

Guava工具之BloomFilter

我们都知道Guava提供了很多有用的工具包,比如Guava cache,Guava中令牌桶实现RateLimiter,Google Collections,又比如使用guava的Lists.partition,Lists.transform做分割转换工具,我们都可以在github上把源码下载下来进行详细的解读, 下载地址如下https://github.com/g...
原创
183阅读
0评论
0点赞
发布博客于 1 年前

学习Mybatis源码

在周末没事的时候,可以学习下Kafka,Mybatis,Tomcat,Spring,Zk,springBoot等源码,从中可以学习到很多东西,比如里面用到哪些设计模式,项目架构,优秀代码示例,这对我们工作中 开发代码或排查定位问题都会提供一定的帮助。1.新建demo项目搞个简单的增删改查就行,这个很简单(不会的网上查下)然后同时把源码也从github上下载,下载地址见ht...
原创
143阅读
0评论
1点赞
发布博客于 1 年前

大家一直在谈的领域驱动设计(DDD),我们在互联网业务系统是这么实践的

前言至少30年以前,一些软件设计人员就已经意识到领域建模和设计的重要性,并形成一种思潮,Eric Evans将其定义为领域驱动设计(Domain-Driven Design,简称DDD)。在互联网开发“小步快跑,迭代试错”的大环境下,DDD似乎是一种比较“古老而缓慢”的思想。然而,由于互联网公司也逐渐深入实体经济,业务日益复杂,我们在开发中也越来越多地遇到传统行业软件开发中所面临的问题。本...
转载
262阅读
0评论
0点赞
发布博客于 1 年前

老大难的 Java ClassLoader,到了该彻底理解它的时候了

ClassLoader 是 Java 届最为神秘的技术之一,无数人被它伤透了脑筋,摸不清门道究竟在哪里。网上的文章也是一篇又一篇,经过本人的亲自鉴定,绝大部分内容都是在误导别人。本文我带读者彻底吃透 ClassLoader,以后其它的相关文章你们可以不必再细看了。ClassLoader 做什么的?顾名思义,它是用来加载 Class 的。它负责将 Class 的字节码形式转换成内存形式的...
转载
61阅读
0评论
0点赞
发布博客于 1 年前

JVM笔记

1. JVM虚拟机常见种类如:HotSpot VM,JRockit,J9,Azul VM,Liquid VM,Dalvik VM,Microsoft JVM2. 垃圾回收简介垃圾收集(Garbage Collection)的意思就是 —— 找到垃圾并进行清理。但现有的垃圾收集实现却恰恰相反: 垃圾收集器跟踪所有正在使用的对象,并把其余部分当成垃圾 ,JVM明确定义了什么是对象的可达性(...
原创
382阅读
0评论
0点赞
发布博客于 1 年前

领域驱动设计: 服务边界划分

DDD是什么?领域驱动设计是一种处理高度复杂域的设计方法,试图分离技术实现的复杂性,围绕业务概念构建领域模型来控制业务的复杂性,以解决软件难以理解,难以演化等问题。团队应用它可以成功地开发复杂业务软件系统,使系统在演进时任然保持敏捷。另外一种解读:DDD不是语言,不是框架,不是架构,而是一种思想,一种套路,它可以分离业务复杂度和技术复杂度,DDD也并不是一个新的事物,它是面向对象的拔高...
转载
470阅读
0评论
0点赞
发布博客于 1 年前

浅谈我对DDD领域驱动设计的理解

从遇到问题开始当人们要做一个软件系统时,一般总是因为遇到了什么问题,然后希望通过一个软件系统来解决。比如,我是一家企业,然后我觉得我现在线下销售自己的产品还不够,我希望能够在线上也能销售自己的产品。所以,自然而然就想到要做一个普通电商系统,用于实现在线销售自己企业产品的目的。再比如,我是一家互联网公司,公司有很多系统对外提供服务,面向很多客户端设备。但是最近由于各种原因,导致服务经常出...
转载
164阅读
0评论
0点赞
发布博客于 1 年前

关于电商秒杀系统中防超卖、以及高性能下单的处理方案简述

秒杀抢购系统的成功平稳运行,有一些需要注意的知识点。1 高并发,以及刷接口等黑客请求对服务端的负载冲击2 高并发时带来的超卖,即商品数量的控制3 高负载下,下单的速度和成功率的保证4 其他以秒杀单品为例,如抢小米手机。解决方案探讨:第一步 限制前端发来的请求量譬如定在了周二10点开启抢购,那么在之前的一周时间内,都会有预约通知,或者普通的用户浏览。通过预约量、浏览...
转载
672阅读
0评论
0点赞
发布博客于 1 年前

netty的Future异步回调难理解?手写个带回调异步框架就懂了

netty是一个经典的网络框架,提供了基于NIO、AIO的方式来完成少量线程支持海量用户请求连接的模型。netty里面充斥了大量的非阻塞回调模式,主要是靠Future/Promise异步模型来实现的。Future是java.util.concurrent.Future,是Java提供的接口,可以用来做异步执行的状态获取,它避免了异步任务在调用者那里阻塞等待,而是让调用者可以迅速得到一个Futu...
转载
521阅读
1评论
1点赞
发布博客于 1 年前

关于MySQL数据库超时设置感悟?

要时刻对线上系统保持敬畏之心,那么线上系统的JVM参数配置,数据库连接配置就得认真对待,不能疏忽1线上系统的数据库配置的参数的具体含义,以及该设置多大2线上系统对应的数据库最大支持的链接数是多少,通过压测能压到2000,还是5000 还是多少3apache的数据库连接池和阿里的DruidDataSource区别是啥。什么情况下该用哪个?4connectTimeout和socke...
原创
39阅读
0评论
0点赞
发布博客于 2 年前

junit源码之设计模式

我们做需求时候经常用junit单元测试,由于junit是一个Java测试框架,通过maven依赖直接就可以看到对应的源码,今天在看源码的时候发现用到了好多设计模式,我们平常不仅要看懂源码,还要理解设计理念,设计思想,其中用到的设计模式有命令模式,组合模式,模板方法模式,观察者模式,装饰器模式。包结构如下类图3总结对于Junit源码的设计模式的解释,网上一堆,但...
原创
71阅读
0评论
0点赞
发布博客于 2 年前

估算sqlserver数据占用多大空间

查询所有的表select * from sys.objects Where type='U' And type_desc='USER_TABLE' order by create_date desc查询表的数量select Count(0) as '用户定义表的个数' from sys.objects Where type='U' And type_desc='USER_TABLE'查...
原创
984阅读
0评论
0点赞
发布博客于 2 年前

如何写出漂亮的好代码?

我们平常在做需求过程中,有的同学会按照面向对象的原则设计写出和框架代码一样高水平的代码,有的可能就是用面向过程的方式把需求给实现了,但是感觉不漂亮!也就是复用性比较差,修改一点地方容易导致别的地方出问题,扩展性也比较差,我觉得我们要写出漂亮的代码应该考虑下面几个因素1. 向对象的的基本特征:封装,继承,多态2. 类之间的关系:实现、依赖、关联、聚合(has-a)、组合(cont...
原创
597阅读
0评论
1点赞
发布博客于 2 年前

如何通过maven打包使得spring加载对应的配置文件,对应的类,引入对应的jar?

1 POM修改 第一个是根据不同的打包参数,引用不同的jar<dependencies> <dependency> <groupId>com.**.**</groupId> <artifactId>orderbank-cbd-service-${maven-site-suffix}</artifactId&g...
原创
415阅读
0评论
0点赞
发布博客于 2 年前

各种加密算法比较

各种加密算法比较 算法选择:对称加密AES,非对称加密: ECC,消息摘要: MD5,数字签名:DSA   对称加密算法(加解密密钥相同) 名称 密钥长度 运算速度 安全性 资源消耗 ...
转载
378阅读
0评论
0点赞
发布博客于 2 年前

京东「卖家日志」系统的构建 | 流式计算日志系统应用实践

引言本文讲述如何去构建一个日志系统,用到了哪些技术?为什么用这些技术?遇到的问题及优化的过程,希望给大家在实践中提供一些参考。这是一个有关于日志的项目,负责收集、处理、存储、查询京东卖家相关操作的日志,这里就叫它“卖家日志”。在日常的开发过程中,可能对日志这个词并不陌生,例如常接触到的Log4j、slf4j等等,这些日志工具通常用来记录代码运行的情况,当系统出问题时,可以通过查看日志及时的...
转载
182阅读
0评论
0点赞
发布博客于 2 年前

mac下idea启动各种端口号被占用,服务起不来

问题:idea启动项目报错:Unable to open debugger port(127.0.0.1:1099):java.net.SocketException"socket closed分析:1、可能是端口被占用导致,其他软件占用了tomcat的端口。2、可能是在打开Tomcat的情况下关闭了idea等开发工具,idea非正常关闭(软件卡死),导致先前的Tomcat没有被关闭,...
原创
2295阅读
0评论
1点赞
发布博客于 2 年前

IO多路复用select,poll epoll以及区别

看这个一次读懂 Select、Poll、Epoll IO复用技术 文章来简单理解下,如果不是很明白的话,可以参考下面转的知乎上面白话文列子作者:Leslie链接:https://www.zhihu.com/question/32163005/answer/76577586来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。要弄清问题 先要知道问题的出现原因...
转载
3328阅读
0评论
0点赞
发布博客于 2 年前

mac下的idea打开maven一直loading的问题

用的Mac电脑,可能是关机的时候强制关了idea程序的原因吧,导致打开maven的时候一直是loading如下图遇到这种问题后开始各种尝试解决,1包括删除maven的本地仓库2删除idea的本地缓存/Users/jiangkunkun/Library/Caches/IntelliJIdea2018.1/Maven(备注:idea在mac按照的目录~/Library/Cach...
原创
1087阅读
0评论
1点赞
发布博客于 2 年前

单点登录的三种实现方式

单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任。单点登录在大型网站里使用得非常频繁,例如像阿里巴巴这样的网站,在网站的背后是成百上千的子系统,用户一次操作或交易可能涉及到几十个子系统的协作,如果每个子系统都需要用户认证,不仅用户会疯掉,各子系统也会为这种重复认证授权的逻辑搞...
转载
290阅读
0评论
0点赞
发布博客于 2 年前

如果20万用户同时访问一个热点缓存,如何优化你的缓存架构?

(1)为什么要用缓存集群这篇文章,咱们来聊聊热点缓存的架构优化问题。其实使用缓存集群的时候,最怕的就是热key、大value这两种情况,那啥叫热key大value呢?简单来说,热key,就是你的缓存集群中的某个key瞬间被数万甚至十万的并发请求打爆。大value,就是你的某个key对应的value可能有GB级的大小,导致查询value的时候导致网络相关的故障问题。这篇文章,我们就来聊聊热k...
转载
1504阅读
0评论
2点赞
发布博客于 2 年前

Java 8 函数式编程 例子汇总

在 Java 程序中采用函数式方法和语法有许多好处:代码简洁,更富于表达,不易出错,更容易并行化,而且通常比面向对象的代码更容易理解。我们面临的挑战在于将思维方式从命令式编程 — 绝大多数开发人员都熟悉它 — 转变为声明式思考。尽管函数式编程不那么容易或直观,但您可以通过学习关注您想要程序实现的目的 而不是关注您希望它执行的方式,从而实现思维上的巨大飞跃。Java 8 Examples...
原创
706阅读
0评论
0点赞
发布博客于 3 年前

CountDownLatch的使用

      我们在写服务的时候,有时候需要利用线程池来批量作业,这个时候需要等全部作业处理完后统一返回,这种情况只能用CountDownLatch来处理了,比如下面的代码实例 @RequestMapping(value = "/demo4", method = RequestMethod.GET) public String demo4() throws Exception...
原创
59阅读
0评论
0点赞
发布博客于 3 年前

AbstractProcessor如何开发测试?

        我们在开发中会用到监控日志,或者权限校验等功能,一般我们都是通过AOP的动态代理来搞定,这个AOP动态代理一般也就是2种方式,一种是根据JDK的反向代理(基于接口),一种是基于cglib生成子类(基于asm)来搞定,这种动态代理就是在运行的时候通过接口或子类来进行代码增强,        其实还有一种方式就是编译代码的时候把监控日志代码或者权限校验植入进去,其实就是Abstra...
原创
911阅读
0评论
0点赞
发布博客于 3 年前

AbstractProcessor如何开发测试?

        我们在开发中会用到监控日志,或者权限校验等功能,一般我们都是通过AOP的动态代理来搞定,这个AOP动态代理一般也就是2种方式,一种是根据JDK的反向代理(基于接口),一种是基于cglib生成子类(基于asm)来搞定,这种动态代理就是在运行的时候通过接口或子类来进行代码增强,        其实还有一种方式就是编译代码的时候把监控日志代码或者权限校验植入进去,其实就是Abstra...
原创
911阅读
0评论
0点赞
发布博客于 3 年前

批量打印订单的技术方案

 最近有个需求,要支持批量打印用户订单部分信息,考虑个技术方案如下 定义一个freemaker模板,把订单信息放到freemaker模板里,然后通过freemaker把数据合并成一个html字符串,然后通过itext把html信息转成对应的pdf1引入POM  &lt;dependency&gt; &lt;groupId&gt;com.itextpdf&lt;/...
原创
700阅读
0评论
0点赞
发布博客于 3 年前

迁移数据方案

我们在做系统的时候,有时候会遇到迁移数据或者处理任务(任务量又比较大),比如把redis的数据取出来做一些操作,然后处理完的数据在存到hbase我们需要考虑到数据处理过程中失败情况,需要处理高并发去执行,具体怎么设计,怎么做呢,有一种简单的方式如下:1我们先把任务数据存到redis任务队列里2定义一个bean启动3个线程来处理   线程1的:从任务队列取出数据,同时存到备份队列...
原创
961阅读
0评论
0点赞
发布博客于 3 年前

蚂蚁金服中间件,一大波面经来袭!

蚂蚁金服中间件一号机一面:自我介绍1、Java中的多线程了解么,线程池的增长策略和拒绝策略了解么,说一下。2、讲一下线程增加的过程和拒绝策略的执行。3、讲了一下fixthreadpool的增长策略,然后几种拒绝策略。4、高并发情况下,如何使用线程池,用哪个,问了一下线程结束要多久,是否在下一个线程结束前完成(我想的是cachethreadpool,其实思路错了)。5、表...
转载
430阅读
0评论
0点赞
发布博客于 3 年前

Java面试常问

一、数据结构与算法基础 说一下几种常见的排序算法和分别的复杂度。 用Java写一个冒泡排序算法 描述一下链式存储结构。 如何遍历一棵二叉树? 倒排一个LinkedList。 用Java写一个递归遍历目录下面的所有文件。  二、Java基础 接口与抽象类的区别? Java中的异常有哪几类?分别怎么使用? 常用的...
转载
180阅读
0评论
0点赞
发布博客于 3 年前

在使用线程池等会缓存线程的组件情况下传递ThreadLocal

最近开发的系统有一个场景在多个RPC调用链中需要传递一些公有参数过去。这个时候首先想到的是ThreadLocal,但是有一个问题就是它不能在父子线程中传递上下文信息(ThreadLocal变量信息),这时我们考虑用InheritableThreadLocal,它可以解决父子线程中上下文的传递,但是又发现一个问题,InheritableThreadLocal在线程池复用的组件里无法复制,最后我们...
原创
487阅读
0评论
0点赞
发布博客于 3 年前

TransmittableThreadLocal详解(转)

1、简介TransmittableThreadLocal 是Alibaba开源的、用于解决 “在使用线程池等会缓存线程的组件情况下传递ThreadLocal” 问题的 InheritableThreadLocal 扩展。若希望 TransmittableThreadLocal 在线程池与主线程间传递,需配合 TtlRunnable 和 TtlCallable 使用。2、使用场景下面是几...
转载
642阅读
0评论
0点赞
发布博客于 3 年前

Mac IntelliJIdea 打开项目没反应

  最近拿着公司的mac回家想通过VPN写点东西,发现通过idea打开项目没反应,只能首先去当前用户目录里的idea启动日志去分析原因:  
原创
6624阅读
10评论
0点赞
发布博客于 3 年前

myBatis多路径参数配置

项目中用到了myBatis多路径配置的情况,需要指定不同的路径去加载不同的配置文件,dao包等信息,配置如下:需要注意的是dao配置文件要和dao路径一样否则可能mybatis识别不了&lt;!-- MyBatis配置 --&gt; &lt;bean id="sqlSessionFactoryBS" class="org.mybatis.spring.SqlSessionFact...
原创
652阅读
0评论
0点赞
发布博客于 3 年前

代码生成器 or 系统规划

        后台增删改查搞多了也就没啥意思了,感觉特别没有成就感,心里想着业务时间趁搞个后台的平台,达到什么目的呢?就是开发人员很快开发一个模块,不用再增删改查上浪费时间,该平台该提供什么能力呢?        代码生成器:这个肯定要有的,定义好表结构然后输出结果是controller,service,dao,mybatis配置文件,前台页面JS等        实现方案:  1)构建...
原创
284阅读
0评论
0点赞
发布博客于 3 年前

Could not create connection to database server

启动项目报错,报错如下:就是连接mysql的时候报的错2018-07-24 17:01:13,368 ERROR [com.alibaba.druid.pool.DruidDataSource] - create connection error, url: jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&amp;characterEncod...
原创
3414阅读
0评论
0点赞
发布博客于 3 年前

mac系统mysql,maven环境变量配置

首先要知道你使用的Mac OS X是什么样的Shell,使用命令echo $SHELL如果输出的是:csh或者是tcsh,那么你用的就是C Shell。如果输出的是:bash,sh,zsh,那么你的用的可能就是Bourne Shell的一个变种。Mac OS X 10.2之前默认的是C Shell。Mac OS X 10.3之后默认的是Bourne Shell。我用的是zs...
原创
221阅读
0评论
0点赞
发布博客于 3 年前

线程阻塞工具类LockSupport

 LockSupport是一个线程阻塞工具,它可以在线程内的任意位置让线程阻塞,和Thread.suspend()相比,它弥补了resume()在前发生导致线程无法继续执行的情况,和Object.wait()相比它也不需要获取某个对象锁。LockSupport使用了类似信号量的机制,它为每一个线程准备了一个许可,如果该许可可用,会立即返回,并且消费这个许可,如果许可不可用,线程就会阻塞代码实例...
原创
123阅读
0评论
0点赞
发布博客于 3 年前

可重入锁ReentrantLock

     可重入锁ReentrantLock可以完全替代synchronized,在JDK5之前,synchronized太重,而可重入锁性能远远好于synchronized,从JDK6后,JDK团队对synchronized做了大量的优化以至于把这2个锁的性能差异不是很大.至于可重入锁的命名是因为这种锁在同一个线程可以反复进入,也就是可以调用lock()方法多次,当然也必须调用同样次数的unlo...
原创
77阅读
0评论
0点赞
发布博客于 3 年前

Java对象中等待(wait)和通知(notify)

JDK在Object对象中提供了2个非常重要的接口线程方法wait方法和notify方法,也就是所有Java对象都有这2个方法,意思就是当在一个实例Java对象上调用wait方法,那么当前线程就会从执行状态转变成等待状态,同时释放在实例对象上的锁,直到其它线程在刚才那个实例对象上调用notify方法并且释放实例对象上的锁,那么刚才那个当前线程才会再次获取实例对象锁并且继续执行。这样我们...
原创
20244阅读
10评论
11点赞
发布博客于 3 年前

错误的加锁(初学者常犯的错误)

      我们常常在程序中使用多线程来处理任务,这个时候是否正确使用加锁就很重要了,有时候看着代码没啥问题,但是执行起来发现结果并不是看到的那样,比如我们看下面的代码package me.lishuo;/** * @date 2018/7/21 下午5:10 */public class WrongLockOnInteger implements Runnable { p...
原创
384阅读
1评论
0点赞
发布博客于 3 年前

FactoryBean是如何运用在我们程序中的

我们在项目中可能都会用到redis,es,或者数据库,比如我们项目中需要连接多个es分片的时候,我们的配置文件最开始可能是下面的形式 ,ConnectionConfig是连接信息类,TransportUtils是工具类,下面是列举了2个业务分片,假如有10多个业务分片的时候需要十多个链接信息类和TransportUtils,显然是不合理的。&lt;bean id="connec...
原创
1615阅读
0评论
0点赞
发布博客于 3 年前

一个想休息的线程:JVM到底是怎么处理锁的?怎么不让我阻塞呢?(转自码农翻身)

我是一个线程,生活在JVM(Java虚拟机)中, 这一段日子过得有些无聊,整个世界似乎只有这一个人,天天忙着执行代码,想休息一下都很难。我听说人类写的代码中有些特殊的地方,叫做临界区,比如synchronized修饰的方法或者代码块,他们非常神奇,在同一时刻JVM老大只允许一个线程进入执行。实际上,老大设置了一把锁,抢到了这把锁就可以执行,否则只能阻塞,等待别人释放锁。老大说,阻塞就是不用干活了,...
转载
198阅读
1评论
1点赞
发布博客于 3 年前

坐在马桶上看算法:快速排序(转)

高快省的排序算法有没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”啦!光听这个名字是不是就觉得很高端呢。假设我们现在对“6  1  2 7  9  3  4  5 10  8”这个10个数进行排序。首先在这个序列中随便找一个数作为基准数(不要被这个名词吓到了,就是一个用来参照的数,待会你就知道它用来做啥的了)。为了方便,就让第一个数6作为基准数吧。接下来,需要将这个序列中所有比基准数大...
转载
122阅读
0评论
0点赞
发布博客于 3 年前

一个著名的任务调度系统是怎么设计的?(转自码农翻身)

实习生张大胖这是个代码写得很烂的电商系统,只要运行一段时间,服务器就会出现Out Of Memory。别人都忙得四脚朝天,于是实习生张大胖被抓了壮丁去研究为什么会出现OOM。刚入行的张大胖技术水平一般,“装模作样”地看代码,研究日志,请教老员工,一个星期过去了,还是一无所获。周一例行的项目会议上, 大家似乎要看张大胖的笑话了,没想到他却提了一个歪招:“这个OOM问题非常复杂,一时半会儿也解决不了,...
转载
4905阅读
0评论
0点赞
发布博客于 3 年前

mybatis中if判断把整数0识别为false(深坑)

1先看mybatis配置文件&lt;select id="listByParam" resultMap="orderSettlePartnerResultMap" parameterType="com.jd.ept.settlement.domain.settle.OrderSettlePartner"&gt; SELECT &lt;include refid="all_ta...
原创
2901阅读
1评论
2点赞
发布博客于 3 年前

Maven最佳实践:版本管理

原文作者:juvenshun原文地址:http://juvenshun.iteye.com/blog/376422-------------------------------------------------------------------------------------什么是版本管理        首先,这里说的版本管理(version management)不是指版本控制(vers...
转载
403阅读
0评论
1点赞
发布博客于 3 年前

Maven实战 --- dependencies与dependencyManagement(转)

一、dependencyManagement 统一多模块的依赖版本如果你的项目有多个子模块,而且每个模块都需要引入依赖,但为了项目的正确运行,必须让所有的子项目(以下子项目即指子模块)使用依赖项的统一版本,才能保证测试的和发布的是相同的结果。那么如何保证模块之间的版本是一致的呢?Maven 使用 dependencyManagement 来统一模块见的依赖版本问题。在父项目的POM文件中,我们会使...
转载
71阅读
0评论
0点赞
发布博客于 3 年前

Spring事务管理之几种方式实现事务

1、事务认识大家所了解的事务Transaction,它是一些列严密操作动作,要么都操作完成,要么都回滚撤销。Spring事务管理基于底层数据库本身的事务处理机制。数据库事务的基础,是掌握Spring事务管理的基础。这篇总结下Spring事务。事务具备ACID四种特性,ACID是Atomic(原子性)、Consistency(一致性)、Isolation(隔离性)和Durability(持久性)的英...
转载
1143阅读
0评论
1点赞
发布博客于 3 年前

JAVA中Long与Integer踩的坑

 前几天在项目上看到代码2个Long型变量判断是否相等用的是==,代码在测试环境部署测试没有问题,放到预发环境就有问题,于是就在main进行了如下测试public class TestDemo { public static void main(String args[]){ Long a=50L; Long b=50L; Long c=5...
原创
4598阅读
1评论
0点赞
发布博客于 3 年前

20 个设计模式和软件设计面试问题(转)

不管是参加Java面试还是C#面试,设计模式和软件设计都是任何编程面试中的必问问题。实际上,编程能力和设计技巧是对彼此很好的补充。一个好的程序员通常都是一个好的软件设计人员。他们知道怎么把一个问题分割成一段段代码或者软件设计,但这些能力和技巧并不能凭空而来。你需要持续做大型、小型系统的设计和编码,并且不断从错误中学习。从面向对象设计原则 开始是一个不错的选择。好吧,这篇文章是关于一些在各种面试中频...
转载
1065阅读
0评论
0点赞
发布博客于 3 年前

Redis 分布式锁的正确实现方式( Java 版 )

来源:吴兆锋,wudashan.cn/2017/10/23/Redis-Distributed-Lock-Implement/如有好文章投稿,请点击 → 这里了解详情前言分布式锁一般有三种实现方式:1. 数据库乐观锁;2. 基于Redis的分布式锁;3. 基于ZooKeeper的分布式锁。本篇博客将介绍第二种方式,基于Redis实现分布式锁。虽然
转载
232阅读
2评论
0点赞
发布博客于 3 年前

关于Java面试,你应该准备这些知识点

马老师说过,员工的离职原因很多,只有两点最真实:钱,没给到位心,受委屈了当然,我是想换个平台,换个方向,想清楚为什么要跳槽,如果真的要跳槽,想要拿到一个理想的offer,除了运气,基本功也要足够的扎实,希望下面的面试经验能给你们能够提供一些帮助。项目经验面试官在一开始会让你进行自我介绍,主要是想让你介绍一下自己做过的一些项目,看看你对这些项目的了解程度,因为很多人简历上写的项目
转载
251阅读
0评论
0点赞
发布博客于 3 年前

BloomFilter——大规模数据处理利器

Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法。通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合。 一. 实例   为了说明Bloom Filter存在的重要意义,举一个实例:  假设要你写一个网络蜘蛛(web crawler)。由于网络间的链接错综复杂,蜘蛛在网络间爬行很可能会形成“环”。
转载
190阅读
0评论
0点赞
发布博客于 4 年前