吹雪的专栏

下雨初晴,水风清;烟敛云收,数峰青。

缓存与数据库一致性

1.使用缓存的场景 缓存是提高系统读性能的常用技术,尤其对于读多写少的应用场景,使用缓存可以极大的提高系统的性能. 例子:查询用户的存款: select money from user where uid = YYY;为了优化该查询功能,我们可以在缓存中建立uid->mone...

2018-10-15 17:20:35

阅读数 55

评论数 0

Java内存模型

前言 我们先来看一个反常识的例子。 int a=0, b=0; public void method1() { int r2 = a; b = 1; } public void method2() { int r1 = b; a = 2; } 这里我定义了两个共享变量 a 和...

2018-10-15 16:17:40

阅读数 44

评论数 0

垃圾回收_下

前言 在读博士的时候,我曾经写过一个统计 Java 对象生命周期的动态分析,并且用它来跑了一些基准测试。 其中一些程序的结果,恰好验证了许多研究人员的假设,即大部分的 Java 对象只存活一小段时间,而存活下来的小部分 Java 对象则会存活很长一段时间。 之所以要提到这个假设,是因为它造就了Ja...

2018-10-15 11:41:44

阅读数 39

评论数 0

垃圾回收_上

前言 你应该听说过这么一句话:免费的其实是最贵的。 Java 虚拟机的自动内存管理,将原本需要由开发人员手动回收的内存,交给垃圾回收器来自动回收。不过既然是自动机制,肯定没法做到像手动回收那般精准高效 [1] ,而且还会带来不少与垃圾回收实现相关的问题。 接下来的两篇,我们会深入探索 Java 虚...

2018-10-15 10:21:06

阅读数 59

评论数 0

Java对象的内存布局

前言 在 Java 程序中,我们拥有多种新建对象的方式。除了最为常见的 new 语句之外,我们还可以通过反射机制、Object.clone 方法、反序列化以及 Unsafe.allocateInstance 方法来新建对象。 其中,Object.clone方法和反序列化通过直接复制已有的数据,来初...

2018-10-15 09:37:14

阅读数 80

评论数 0

JVM是如何实现反射的

前言 反射是 Java 语言中一个相当重要的特性,它允许正在运行的 Java 程序观测,甚至是修改程序的动态行为。 举例来说,我们可以通过 Class 对象枚举该类中的所有方法,我们还可以通过 Method.setAccessible(位于 java.lang.reflect 包,该方法继承自 A...

2018-10-13 20:38:09

阅读数 202

评论数 0

Java虚拟机是怎么实现synchronized的

synchronized字节码 在 Java 程序中,我们可以利用 synchronized 关键字来对程序进行加锁。它既可以用来声明一个 synchronized 代码块,也可以直接标记静态方法或者实例方法。 当声明 synchronized 代码块时,编译而成的字节码将包含 monitoren...

2018-10-13 11:32:45

阅读数 129

评论数 0

HSF学习总结

HSF其实是一个RPC框架,RPC是Remote Procedure Call,就是远程服务调用. 这个功能为什么要写个框架而不是十几行代码呢,因为在分布式场景下并不是这种点对点通讯的模式。 rpc要素:where how 地址:注册中心ConfigServer, 这个中心用来管理整个分布式集群里...

2018-10-12 19:56:59

阅读数 241

评论数 0

TDDL思考总结

单机数据库 分布式数据库 TDDL原理与最佳实践 1. 数据库的结构 1.1. KV存储(id是K) 1.2. B+树与红黑树 B+树的特点是叶子节点是块状,一个叶子里面有多个数据,相邻数据是存在一起的,123,456起等, 而磁盘也是按块的,B+树的数据是按块存储的正好和磁盘的块的概念是相符的,...

2018-10-12 19:55:55

阅读数 76

评论数 0

Java之Integer#highestOneBit代码品读

/** * Returns an {@code int} value with at most a single one-bit, in the * position of the highest-order ("leftmost") one-bit in ...

2018-10-12 19:52:35

阅读数 36

评论数 0

MySQL实现分组排序

想要根据用户分组,以该用户的下单时间为降序,提取所有用户的第二个订单信息。 这属于分组排序,在Oracle有内置函数可以实现,而在mysql就有点麻烦: CREATE TABLE user_orders (orders_id INT UNSIGNED NOT NULL, user_id INT U...

2018-10-12 19:45:36

阅读数 103

评论数 0

metaq最佳实践

1. 前言 本文档旨在描述RocketMQ使用过程中的一些最佳实践,建议用户这样做,但是非必须。 2. Producer最佳实践 2.1 发送消息注意事项 一个应用尽可能用一个Topic,消息子类型用tags来标识,tags可以由应用自由设置。只有发送消...

2018-10-09 22:17:49

阅读数 89

评论数 0

metaq原理简介

1. 前言 本文档旨在描述RocketMQ的多个关键特性的实现原理,并对消息中间件遇到的各种问题进行总结,阐述RocketMQ如何解决这些问题。文中主要引用了JMS规范与CORBA Notification规范,规范为我们设计系统指明了方向,但是仍有不少问题规范没有提及,对于消息中间件又至关...

2018-10-09 22:17:41

阅读数 78

评论数 0

metaq杂记

Name Server:维护broker的地址列表,以及topic和topic对应的队列的地址列表。每个broker与每个Name Server之间使用长连接来保持心跳,并向其定时注册topic信息。可以从两个维度来理解Name Server的能力: 1)Name Server可以提供一个特定的t...

2018-10-09 22:14:34

阅读数 188

评论数 0

NIO与IO区别

流与块的比较 原来的 I/O 库(在 java.io.*中) 与 NIO 最重要的区别是数据打包和传输的方式。正如前面提到的,原来的 I/O 以流的方式处理数据,而 NIO 以块的方式处理数据。 面向流的I/O系统一次一个字节地处理数据。一个输入流产生一个字节的数据,一个输出流消费一个字节的数据。...

2018-10-09 22:09:11

阅读数 21

评论数 0

ClassNotFoundException和NoClassDefFoundError区别

ClassNotFoundException: 它是Exception,不是Error在Throwable体系中只是一个Exception,说明它是可恢复的 发生的时机 当应用试图通过给定的name加载对应的class时可能抛出此异常,找不到对应的class文件时抛出。常见的场景就是: 调用c...

2018-10-09 22:08:30

阅读数 42

评论数 0

Future模式

1. Future模式简介 Future模式就是,当某一程序提交请求,期望得到一个答复。但是可能服务器程序对这个请求的处理比较慢,因此不可能马上收到答复。但是,在传统的单线程环境下,调用函数是同步的,它必须等到服务程序返回结果,才能继续进行其他处理。而Future模式下,调用方法是异步的,原本等待...

2018-09-29 21:28:52

阅读数 96

评论数 0

HSF原理简介

0. 前言 HSF是一个分布式的远程服务调用框架,其实我更喜欢把分布式几个字去掉,因为HSF本身并不是一个单独的服务(指一个进程),他是附属在你的应用里的一个组件,一个RPC组件(远程过程调用——Remote Procedure Call,是一种通过网络从远程计算机程序上请求服务,而不需要了...

2018-08-05 17:35:18

阅读数 76

评论数 0

HSF原理分析

1. HSF的基本概念 HSF全称为High-Speed Service Framework,旨在为淘系的应用提供一个分布式的服务框架,HSF从分布式应用层面以及统一的发布/调用方式层面为大家提供支持,从而可以很容易的开发分布式的应用以及提供或使用公用功能模块,而不用考虑分布式领域中的各种细...

2018-08-05 17:34:19

阅读数 112

评论数 0

服务容错模式

0.背景 随着服务框架和服务治理体系的逐步成熟,服务化已成为系统设计的趋势。随着业务复杂度的增加,依赖的服务也逐步增加,出现了不少由于服务调用出现异常问题而导致的重大事故,如: 1)系统依赖的某个服务发生延迟或者故障,数秒内导致所有应用资源(线程,队列等)被耗尽,造成所谓的雪崩效应 (C...

2018-08-05 17:33:25

阅读数 392

评论数 0

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