- 博客(27)
- 资源 (12)
- 收藏
- 关注
转载 常用缓存系统使用经验总结
0. 前言缓存系统是提升系统性能和处理能力的利器,常用的缓存系统各自的特性和使用场景有所不同,这里总结下常用缓存系统时需要关注的点以及解决方案,以及业务中缓存系统的选型等。本文内容主要包括以下: * 缓存使用中需要注意的点:热点、惊群、击穿、并发、一致性、预热、限流、序列化、压缩、容灾、统计、监控。 * spring cache、分布式锁。1、常用缓存系统在平常的业务开发过...
2018-07-30 23:13:13 1127
转载 同步、异步、阻塞与非阻塞
1 同步与异步首先来解释同步和异步的概念,这两个概念与消息的通知机制有关。也就是同步与异步主要是从消息通知机制角度来说的。1.1 概念描述所谓同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后, 依赖的任务才能算完成,这是一种可靠的任务序列。要么成功都成功,失败都失败,两个任务的状态可以保持一致。所谓异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要...
2018-07-30 23:12:21 362
原创 Redis 和 IO 多路复用
最近在看 UNIX 网络编程并研究了一下 Redis 的实现,感觉 Redis 的源代码十分适合阅读和分析,其中 I/O 多路复用(mutiplexing)部分的实现非常干净和优雅,在这里想对这部分的内容进行简单的整理。几种 I/O 模型为什么 Redis 中要使用 I/O 多路复用这种技术呢?首先,Redis 是跑在单线程中的,所有的操作都是按照顺序线性执行的, 但是由于读写操作...
2018-07-30 23:11:16 1952
原创 IO多路复用之select、poll、epoll
IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。与多进程和多线程技术相比,I/O多路复用技术的最大优势是系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而大大减小了系统的开销。目前支持I/O多路复用的系统调用有 select,pselect,poll,epoll,I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就...
2018-07-30 23:09:32 397
转载 memcached与redis的实现对比
0. 前言memcached和redis,作为近些年最常用的缓存服务器,相信大家对它们再熟悉不过了。前两年还在学校时,我曾经读过它们的主要源码,如今写篇笔记从个人角度简单对比一下它们的实现方式,权当做复习, 有理解错误之处,欢迎指正。1. 综述读一个软件的源码,首先要弄懂软件是用作干什么的,那memcached和redis是干啥的?众所周知,数据一般会放在数据库中,但是查询数据会相...
2018-07-30 23:07:58 212
转载 redis线程模型
0. 前言Redis 基于 Reactor 模式开发了自己的网络事件处理器: 这个处理器被称为文件事件处理器(file event handler):文件事件处理器使用 I/O 多路复用(multiplexing)程序来同时监听多个套接字, 并根据套接字目前执行的任务来为套接字关联不同的事件处理器。 当被监听的套接字准备好执行连接应答(accept)、读取(read)、写入(writ...
2018-07-30 23:06:02 257
原创 Tair-淘宝自主开发的一个分布式key/value存储系统
0. 简介tair 是淘宝自己开发的一个分布式 key/value 存储引擎. tair 分为持久化和非持久化两种使用方式. 非持久化的 tair 可以看成是一个分布式缓存. 持久化的 tair 将数据存放于磁盘中. 为了解决磁盘损坏导致数据丢失, tair 可以配置数据的备份数目, tair 自动将一份数据的不同备份放到不同的主机上, 当有主机发生异常, 无法正常提供服务的时候, 其于的...
2018-07-20 08:43:20 784
原创 CLH队列锁
1. NUMA与SMPSMP(Symmetric Multi-Processor),即对称多处理器结构,指服务器中多个CPU对称工作,每个CPU访问内存地址所需时间相同。其主要特征是共享,包含对CPU,内存,I/O等进行共享。SMP的优点是能够保证内存一致性,缺点是这些共享的资源很可能成为性能瓶颈,随着CPU数量的增加,每个CPU都要访问相同的内存资源,可能导致内存访问冲突,可能会导致CPU资...
2018-07-20 08:41:54 464
原创 Java未开源的Unsafe类
0. 前言Unsafe类可以为我们提供高效并且线程安全方式操作变量,直接和内存数据打交道。1. 获取Unsafe实体的方法private static Unsafe getUnsafeInstance() throws SecurityException, NoSuchFieldException, IllegalArgumentException, ...
2018-07-20 08:41:04 393
原创 Java接口限流算法
0. 前言常见的限流算法有:令牌桶、漏桶。计数器也可以进行粗暴限流实现。1. 算法介绍1.1 令牌桶算法令牌桶算法是一个存放固定容量令牌的桶,按照固定速率往桶里添加令牌。令牌桶算法的描述如下: * 假设限制2r/s,则按照500毫秒的固定速率往桶中添加令牌; * 桶中最多存放b个令牌,当桶满时,新添加的令牌被丢弃或拒绝; * 当一个n个字节大小的数据包到达,将从桶中删...
2018-07-20 08:39:55 2808
转载 Java锁优化思路及JVM实现
1. 锁优化的思路和方法这里提到的锁优化,是指在阻塞式的情况下,如何让性能不要变得太差。但是再怎么优化,一般来说性能都会比无锁的情况差一点。 这里要注意的是,在ReentrantLock中的tryLock,偏向于一种无锁的方式,因为在tryLock判断时,并不会把自己挂起。 锁优化的思路和方法总结一下,有以下几种。 * 减少锁持有时间 * 减小锁粒度 * 锁分离 * 锁粗化 * ...
2018-07-15 17:49:01 516
转载 Java之Lock的实现原理
0. 前言与synchronized不同的是,Lock完全用Java写成,在java这个层面是无关JVM实现的。 在java.util.concurrent.locks包中有很多Lock的实现类,常用的有ReentrantLock、ReadWriteLock(实现类ReentrantReadWriteLock),其实现都依赖java.util.concurrent.AbstractQueue...
2018-07-15 17:48:06 291
转载 Java之synchronized的实现原理
0. 前言目前在Java中存在两种锁机制:synchronized和Lock, Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea。本文并不比较synchronized与Lock孰优孰劣,只是介绍二者的实现原理。数据同步需要依赖锁,那锁的同步又依赖谁?synchronized给出的答案是在软件层面依赖JVM,而Lock给出的方案是在硬件层面依赖特殊的CP...
2018-07-15 17:46:52 939
原创 检查异常和未检查异常不同之处
public class ExceptionTypeTest { public void doSomething()throws ArithmeticException{ System.out.println(); } public static void main(){ ExceptionTypeTe...
2018-07-15 17:45:41 390
转载 Java 6中的synchronized
0. 前言在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁, 但是随着Java SE1.6对Synchronized进行了 各种优化 之后,有些情况下它并不那么重了,本文详细介绍了Java SE1.6中 为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁, 以及锁的存储结构和升级过程。1. 术语定义 术语 英文 说明...
2018-07-15 17:44:22 184
原创 Java 偏向锁
Java偏向锁(Biased Locking)是Java6引入的一项多线程优化。它通过消除资源无竞争情况下的同步原语,进一步提高了程序的运行性能。 偏向锁,顾名思义,它会偏向于第一个访问锁的线程,如果在接下来的运行过程中,该锁没有被其他的线程访问,则持有偏向锁的线程将永远不需要触发同步。 如果在运行过程中,遇到了其他线程抢占锁,则持有偏向锁的线程会被挂起,JVM会尝试消除它身上的偏向锁,将锁恢...
2018-07-15 17:43:14 1047
转载 透彻的掌握 Spring 中@transactional 的使用
0. 前言Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编码式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污染, 因此在实际使用中声明式事务用的比较多。声明式事务有两种方式,一种是在配置文件(xml)中做相关的事务规则声明,另一种是基于@Transactional 注解...
2018-07-15 17:41:42 366
转载 全面分析 Spring 的编程式事务管理及声明式事务管理
0. 前言本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务。 通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之。1. Spring 事务属性分析事务管理对于企业应用而言至关重要。它保证了用户的每一次操作都是可靠的,即便出现了异常的访问情况,也不至于破坏后台数据的完整性。就像银行的自助取款机,通常都能正常为客户服务,但是...
2018-07-15 17:39:44 146
原创 Spring AOP 注解方式实现的一些“坑”
1. 首先仔细检查一下,Aspect类是不是少了@Component注解(这一点很重要!),只有一个@Aspect注解是不行的。2. 拦截指定注解的规则怎么写?如拦截所有带了RequestMapping的方法首先声明一个写入点来匹配所有要拦截的方法名 假如拦截所有方法@Pointcut("execution(public * *(..))")private void asp...
2018-07-08 22:43:48 895
原创 分析 MySQL 语句运行时间
为了验证select 1 与 select 1 from tableName 与 select * from tableName的执行效率,需要测试一下各自执行的时间。于是总结一下,查看mysql语句运行时间的方法。1. show profiles。mysql 版本 Query Profiler是MYSQL自带的一种query诊断分析工具,通过它可以分析出一条SQL语句的性能瓶颈在...
2018-07-08 22:43:13 858
原创 AOP的两种实现-Spring AOP以及AspectJ
1. 前言注解是个很奇妙的存在,为什么加上了@Transactional之后,方法会在一个事务的上下文中被执行呢?为什么加上了@Cacheable之后,方法的返回值会被记录到缓存中,从而让下次的重复调用能够直接利用缓存的结果呢? 随着对AOP的逐渐应用和了解,才明白注解只是一个表象,在幕后Spring AOP/AspectJ做了大量的工作才得以实现这些神奇的功能。2. 基于代理(...
2018-07-08 22:42:27 557
翻译 Java常见问题排查
OOM还包括了不报OOM,但GC已经比较频繁了这种现象,比如说应用写得还可以的情况下,压力施加上去,瓶颈会出现在gc,gc会非常的频繁,但它不会报OOM,jvm源码里只有以下七种原因可导致OOM,这七种在java里面多数都是有解决方案的,java工具体系比很多其他语言要成熟:GC overhead limitexceeded、Java Heap Space、Unable to create new...
2018-07-08 22:35:46 1255
原创 RPC原理简介
1 如何调用他人的远程服务?由于各服务部署在不同机器,服务间的调用免不了网络通信过程,服务消费方每调用一个服务都要写一坨网络通信相关的代码,不仅复杂而且极易出错。 如果有一种方式能让我们像调用本地服务一样调用远程服务,而让调用者对网络通信这些细节透明,那么将大大提高生产力,比如服务消费方在执行helloWorldService.sayHello(“test”)时,实质上调用的是远端的服务...
2018-07-04 22:52:40 1259 1
原创 Java序列化工具对比
1. Java序列化工具技术原理比较Binary Formats & language-specific ones JavaBuiltIn(java原生)、JavaManual(根据成员变量类型,手工写)、FstSerliazation、KryoBinary formats-generic language-unspecific ones Protobuf(Google)、Th...
2018-07-04 08:17:15 4593
转载 数据库事务隔离级别和锁实现机制
1. 数据库事务处理中出现的数据不一致的情况在多个事务并发做数据库操作的时候,如果没有有效的避免机制,就会出现种种问题。大体上有四种问题,归结如下:1.1 丢失更新如果两个事务都要更新数据库一个字段X,x=100 事务A 事务B 读取X=100 读取X=100 写入x=X+100 写入x=X+200 事务结束x=200 事务结束...
2018-07-02 23:54:48 396
转载 Innodb中的事务隔离级别和锁的关系
0. 前言对于加锁的处理,可以说就是数据库对于事务处理的精髓所在。本文简单分析了MySQL中InnoDB引擎的加锁机制。1. 一次封锁or两段锁?因为有大量的并发访问,为了预防死锁,一般应用中推荐使用一次封锁法,就是在方法的开始阶段,已经预先知道会用到哪些数据,然后全部锁住,在方法运行之后,再全部解锁。这种方式可以有效的避免循环死锁,但在数据库中却不适用,因为在事务开始阶段,数据库...
2018-07-02 23:46:10 174
原创 Guava并发之ListenableFuture使用介绍
1. 引子ListenableFuture顾名思义就是可以监听的Future,它是对java原生Future的扩展增强。我们知道Future表示一个异步计算任务,当任务完成时可以得到计算结果。如果我们希望一旦计算完成就拿到结果展示给用户或者做另外的计算,就必须使用另一个线程不断的查询计算状态。这样做,代码复杂,而且效率低下。使用ListenableFuture Guava帮我们检测Future...
2018-07-02 23:44:58 413
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人