silen
三流码农
  • 单元测试框架-mockito初探

    对于我们java开发者来说,提到单元测试都会说Junit。确实,Junit是我们用的最多的测试库,但是Junit在面对某些情况的时候,会有点不好搞。比如,你的方法里有依赖外部服务,比如rpc的远程调用,api服务的返回等。而Junit我们更关注结果的返回,而mockito呢,则更多的是在mock数据方面。 今天我们下面简单介绍下mockito 首先我们在pom中引入mockito <!-- https://mvnrepository.com/artifact/org.mockito/mockito-core --> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>2.27.0</version> <scope>test</sc...
    • 1
    • 18
    • 0
    • 2019-10-18
  • TB级数据秒查询之 - ClickHouse初探

    一.背景 1.公司的后端架构基于k8s的微服务体系,每个服务都拥有独立的Mysql库。而我们还有MongoDB集群,redis集群的数据分布,这样对于我们在做数据聚合的时候异常麻烦,数据抽象也不够具体。公司的平均日活大概在500W左右,最近在研发推荐系统,需要大量的数据来跑行为分析,所以搭建完善的数据聚合平台迫在眉睫。 2.每天会有百万次的查询请求,数据的查询粒度由上往下,愈发细,关键业务的数据需要穿插多个rpc,关联好几M的数据,维度的不同,导致查询的压力也极速上升 初始的时候,我们尝试将MySQL做Sharding,但数据量较大,成本还是比较高的。然后又尝试将热点扔到ES中,但是如果信息变化了,每次不得不刷全量数据,所以不太适合做大表的更新。 直到我们碰到ClickHouse! 二.基本介绍 https://clickhouse.yandex/docs/en/ 参考官方文档 下面来说说...
    • 2
    • 51
    • 3
    • 2019-09-14
  • Mysql 事务的一点总结

    事务 事务的概念以及用法这边就不赘述了,事务的ACID特性也不多说了,我们来聊一聊事务的隔离和多版本并发的一点知识 隔离级别 1.Read Uncommited (未提交读) 事务中的修改,即使没有提交,对其他事务也是可见的。事务可以读到未提交的数据,也就是脏读 2.Read Commited (提交读) 一个事务在开始的时候,只能看见已经提交的事务所做的修改。意思也就是,一个事务在正式提交前,所做的修改对其他事务都是不可见的。他所造成的问题是,当执行多个同样的查询时候,可能得到不一样的结果。 3.Repeatable Read (可重复读) 该级别保证了在同一个事务中多次读取同样的记录结果是一致的。但是他无法解决幻读的问题。幻读指当某个事务在读取某个范围内的记录时,另一个事务又插入新的记录,当之前的事务再次读取时会产生幻行。 可重复读是Mysql的默认隔离级别 4.Serizlizabl...
    • 0
    • 17
    • 0
    • 2019-08-11
  • 关于kafka性能调优的一点总结

    关于kafka的一些基础知识我想大家都知道,今天抽空整理下这些年使用kafka的一些调优技巧 首先明确一点,kafka的配置的核心点 在于 磁盘的刷新率 ,这也是影响kafka吞吐量的最最重要的一点! 而对于kafka的性能我们有两个指标,一个是延迟率,一个是吞吐量。所谓延迟率,就是处理一个事件需要多少事件。吞吐率则是说特定的时间内有多少事件到达。他们之间其实是相互平衡的。如果kafka有足够的broker去处理Topic,那么他一定是需要一定的延迟去处理这些消息的。 我们就从生产者和消费者两个方面来分析 生产者 kafka使用的是异步的发布-订阅模型。当我们send()一个消息的时候,结果是返回是在feature(参考java的feature任务)。生产者将消息发送给Broker,Broker等待事件,然后接收返回结果,然后相应事件,完成任务 batch.size batch.size ...
    • 1
    • 33
    • 1
    • 2019-07-09
  • java 线程模型

    执行流程 我们从一个简单的启动线程开始看 public static void main(String[] args){   new Thread(){    @Override    public void run() {     super.run();    }   }.start(); } 这是一个最基础的线程启动方法,我们点进去看下 我们看下上面的这部分代码 第一步校验线程的状态,我们知道线程的状态从new->running,他这新的线程标识为0,也就是说非0的线程不启动,抛出异常 group.add 将线程加入到group组中,这个group组是呈递减的 在下面的核心方法 try{}中的start方法 -start方法我们从上图也能看到最终执行了一个Native方法 start0,也就是说他是JDK提供的 so,我们来看JDK源码中的对这个方法的具体实现 JDK 中的实现 打...
    • 3
    • 34
    • 1
    • 2019-06-10
  • JDK 源码剖析-classLoader

    在剖析ClassLoader源码之前我们先来了解下类加载器 类加载器 类加载机制 我们都知道,java代码编译完成后会先形成一个.class文件,.class文件再加载到虚拟机中才能运行和使用。 虚拟机把描述类的数据从class文件加载到内存,并对数据做校验,转换,解析,初始化,最终形成可以被虚拟机直接使用的JAVA类型,这是类加载机制。 类加载器 类加载器就是对类加载机制过程的封装。 在《深入理解JAVA虚拟机》这本书中是这么定义类加载器的 “通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到JAVA虚拟机外部去实现,以便让应用程序去获取所需要的类,实现这个动作的代码模块就是“类加载器” 怎么来理解上面这一句话? 我们看下类加载机制中第一步-加载的3个主要过程 通过一个类的全限定名来获取描述此类的二进制字节流(说白了根据这个class取一个固定的类名,通过这个类名,获得cla...
    • 0
    • 38
    • 0
    • 2019-02-23
  • 从Java内存模型的角度看Volatile

    Volatile 在多线程编程中,我们常常用到Volatile来维护变量的可见性,他是一个比较弱的同步机制。相较于sychronized关键字,在访问共享变量的时候,volatile不会进行加锁,因此他也不会造成线程阻塞,所以他更加轻量! 深入点看的话,当我们将变量声明为volatile类型的时候,编译与运行的时候,我们都会注意到这个变量是共享的,因此不会对将对该变量的操作和其他内存块一起 重排序,volatile不会被缓存到寄存器或者其他处理器不可见的地方,因此在读取volatile变量时,总会返回最新写入的值。 上文提到了一个词,重排序 ,何为重排序? 重排序即编译器和处理器对代码指令的动态优化 会打乱原本的java代码的执行顺序。而在程序从源代码到机器指令执行的过程中会发生多次的重排序。 既然重排序这是编译器和处理器做的事情,那么我们是怎么来避免了重排序呢?那便是我们下面要说的jav...
    • 1
    • 36
    • 0
    • 2019-02-11
  • Tomcat之 --类加载机制

    开始 我们学习JAVA的时候,都知道JAVA是跑在JVM虚拟机上的,而类加载器则是将编译后的class做加载,校验,转换解析,初始化,最终形成被虚拟机可以直接使用的JAVA类型,这便是我们知道的类加载机制。这是类加载器的执行的必须流程 ClassLoader类 classLoader类是java.lang包中一个类,他的作用是根据类名,将类名所指定的类加载,生成特定的字节码,然后从这些字节码中再实例化出一个java.lang.class的实例。我们来具体看下classLoader的流程。 protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { //省略部分代码。。。 } 首先是loadClass,loadClass做的事情加载name类,返回...
    • 1
    • 36
    • 2
    • 2019-01-25
  • 由一个服务器异常引发的思考 --JVM堆外内存

    开始 前两天意外发现这么一个情况,某个组内共用的JAVA服务器上,莫名其妙的发生个别服务进程被杀死的情况,java服务都像蒸发了一样,莫名其妙的消失了,通过dmesg命令如下所示 通过dmesg命令可以发现,都是超过了系统内存,导致了Linux系统 杀掉了这几个java进程 Linux内存模型  首先,我们来粗略地了解下Linux的内存模型,由于我们的Linux版本是x86的内存架构,这边我们仅针对x86来做分析 主要包含以下几个方面: 虚拟内存管理,介于用户程序和物理内存之间的逻辑层,就是我们常说的用户态内存 物理内存管理,内核级内存,一般由CPU才能调用 内核虚拟内存,这个是内核态,用户映射数据到真实的内存空间的一个逻辑层,他可以接受来自用户的,也可以是来自内核的 交换和缓存,参考操作系统的三级缓存架构,这不做赘述。 我们主要讨论这的虚拟内存管理,...
    • 1
    • 72
    • 2
    • 2019-01-20
文章分组
暂无数据