自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(68)
  • 收藏
  • 关注

转载 教你如何成为Java的OOM Killer

前言虽然事隔半年,当时排查线上OOM事故的过程记忆犹新,每一个步骤都历历在目,感谢业务组、系统部、压测组、监控与应急部对架构组的强力支持,得以让这个Java内存问题水落石出,经过半年多的全面的应用日志切割方式的改造,现在基本没有OOM的问题了,线上服务运行非常健康,对可用性的保障起到了很大的作用,如果你在经历OOM,读了这个文章会有很大的启发。Become OOM Killer我们都知

2017-08-31 10:38:16 1163

转载 OOM异常解析

JVM对象访问解析对象访问过程的内存情况?123publicvoid function(){    Object obj =new Object();}function方法被执行的时候,JVM在JVM栈中为function创建一个栈帧,用于存放function在运行过程中的一些信息。Ob

2017-08-31 10:35:25 774

转载 Java NIO 系列教程

Java NIO 系列教程原文地址 作者:Jakob Jenkov   译者:郭蕾    校对:方腾飞Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。Java NIO: Channels and Buffers(通道和缓冲区)标准的IO基于字节流和字符流

2017-08-30 17:58:35 871

原创 24.Redis集群安装使用

下载安装:wget http://download.redis.io/redis-stable.tar.gztar xzf redis-stable.tar.gzcd redis-stablemakemake install部署配置要让集群正常工作至少需要3个主节点,创建6个redis节点,其中三个为主节点,三个为从节点,对应的r

2017-08-30 17:35:32 864

原创 23.Redis单机安装使用

单机安装使用下载安装:wget http://download.redis.io/redis-stable.tar.gztar xzf redis-stable.tar.gzcd redis-stablemakemake install启动停止启动Redis:redis-server 停止Redis

2017-08-30 17:31:21 658

原创 分布式通信协议

分布式基础通信协议:paxos,totem和gossip背景:在分布式中,最难解决的一个问题就是多个节点间数据同步问题。为了解决这样的问题,涌现出了各种奇思妙想。只有在解决了如何进行信息同步的基础之上才衍生出形形色色的应用。这里开始介绍几种分布式通信协议。简单即有效——totem协议:totem协议也许你还比较陌生,但是corosyn

2017-08-30 16:59:05 1636

原创 22.Redis配置文件

Redis配置文件为了对Redis的系统实现有一个直接的认识,下面来看一下Redis的配置文件中定义了哪些主要参数以及这些参数的作用。使用包含(include)把通用配置和特殊配置分离,方便维护include /opt/redis/redis-common.conf 1)daemonize no 默认情况下,redis不是在后台运行的。如

2017-08-30 16:24:47 568

原创 21.Redis Cluster - 故障转移

复制与故障转移Redis集群中的节点分为主节点(master)和从节点(slave),其中主节点用于处理槽,而从节点则用于复制某个主节点,并在被复制的主节点下线时,代替下线主节点继续处理命令请求。 一个节点成为从节点,并开始复制某个主节点这一信息会通过消息发送给集群中的其他节点,最终集群中的所有节点都会知道某个从节点正在复制某个主节点。故障检测集群中的每个节点都会定期的向集群中的其他节点发送

2017-08-30 14:57:57 2053

原创 20.Redis Cluster - 重新分片

重新分片Redis集群的重新分片操作可以将任意数量已经指派给某个节点(源节点)的槽改为指派给另一个节点(目标节点),并且相关槽所属的键值对也会从源节点被移动到目标节点。 重新分片操作可以在线进行,在重新分片过程中,集群不需要下线,并且源节点和目标节点都可以继续处理命令请求。集群管理工具redis-tribRedis的集群管理工具redis-trib,通过向源节点和目标节点发送命令来进行重新分片操作

2017-08-30 14:54:08 2336

原创 19.Redis Cluster - 槽Slot

槽 Slot Redis集群通过分片的方式来保存数据中的键值对:集群中的数据库被分为16384个槽(slot),数据库中的每个健都属于这16384个槽的其中一个,集群中的每个节点可以处理的0个或最多16384个槽。当数据库中的16384个槽都有节点在处理时,集群处于上线状态(ok);相反,如果数据库中有任何一个槽没有得到处理,那么集群处于下线状态(fail)。槽指派通过向节点发送CLUSTER ADD

2017-08-30 14:43:28 3504

原创 18.Redis Cluster - 集群

集群Redis集群是Redis提供的分布式数据库方案,集群通过分片(sharding)来进行数据共享,并提供复制和故障转移功能。集群数据结构一个节点就是一个运行在集群模式下的Redis服务器,Redis服务器在启动时会根据cluster-enabled配置选项是否为yes来决定是否开启服务器的集群模式。 每个节点都会使用一个clusterNode

2017-08-30 14:27:42 666

原创 17.Sentinel

SentinelSentinel(哨岗、哨兵)是Redis的高可用性(high availability)解决方案。由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继

2017-08-29 17:55:35 738

原创 16.Redis心跳检测

心跳检测在命令传播阶段,从服务器默认以每秒一次的频率,向主服务器发送命令:REPLCONFACK  //replication_offset是从服务器当前的复制偏移量。心跳检测的作用:检测主服务器的网络连接状态;辅助实现min-slaves选项;检测命令丢失。检测主从服务器的网络连接状态通过向主服务器发送INFO replication命令,可以

2017-08-29 11:00:39 8071

原创 15.Redis高级复制

Redis复制在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制(replication)另一个服务器,我们称呼被复制的服务器为主服务器(master),而对主服务器进行复制的服务器被称为从服务器(slave)。进行复制中的主从服务器双方的数据库将保存相同的数据,概念上将这种现象称作“数据库状态一致”,或者简称“一致”。

2017-08-29 10:56:51 697

转载 唯品会Redis cluster大规模生产实践

唯品会Redis cluster大规模生产实践嘉宾:陈群很高兴有机会在Redis中国用户组给大家分享redis cluster的生产实践。目前在唯品会主要负责redis/hbase的运维和开发支持工作,也参与工具开发工作。Outline一、生产应用场景二、存储架构演变三、应用最佳实践四、运维经验总结第1、2节:介绍redis cluster在唯品会的

2017-08-25 10:34:28 1071

原创 14.耗时命令日志

耗时命令日志:当一条命令执行时间超过限制时,Redis会将该命令的执行时间等信息加入耗时命令日志(slow log)以供开发查看。可以通过配置文件的slowlog-log-slower-than参数设置这一限制,单位是微妙(1000000微秒=1秒),默认值是10000。耗时命令日志存储在内存中,可以通过配置文件的slowlog-max-len参数来限制记录

2017-08-24 11:40:35 1119

原创 13.Redis简单复制

如果数据存储在一台服务器上,当硬盘出现故障时,也会导致数据丢失。为了避免单点故障,Redis提供了复制功能可以自动实现同步的功能,将数据库复制多个副本以部署在不同的服务器上。通过复制可以实现读写分离以提高服务器的负载能力。 Redis数据库分两类:主数据库、从数据库;主数据库可以进行读写操作,当发生写操作时自动将数据同步给从数据库;从数据

2017-08-24 11:35:05 834

原创 12.持久化RDB、AOF

持久化通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据。RDBRDB持久化通过保存数据库中的键值对来记录数据库状态的不同。将某个时间点上的数据库状态保存到一个RDB文件(经过压缩的二进制文件)中,通过该文件可以还原数据库状态。RDB持久化可以手动执行,也可以根据配置定期执行。 有两个Redis命

2017-08-24 11:32:47 935

转载 HashMap死循环,CPU100%

在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历过,本来觉得没什么好写的,因为Java的HashMap是非线程安全的,所以在并发下必然出现问题。但是,我发现近几年,很多人都经历过这个事(在网上查“HashMap Infini

2017-08-24 10:40:45 987

转载 ConcurrentHashMap的锁

ConcurrentHashMap是Java5中新增加的一个线程安全的Map集合。对于ConcurrentHashMap是如何提高其效率的,可能大多人只是知道它使用了多个锁代替HashTable中的单个锁,也就是锁分离技术(Lock Stripping)。实际上,ConcurrentHashMap对提高并发方面的优化,还有一些其它的技巧在里面(比如在get操作的时候它是否也使用了锁来保护?)。

2017-08-24 10:18:42 7208 1

转载 CGlib无入侵代理入门使用

CGlib是什么? CGlib是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。 当然这些实际的功能是asm所提供的,asm又是什么?Java字节码操控框架,具体是什么大家可以上网查一查,毕竟我们这里所要讨论的是cglib,cglib就是封装了asm,简化了asm的操作,实现了在运行期动态生成新的class。 可能大家还感觉

2017-08-23 18:45:33 1091

原创 JDK动态代理为什么必须用接口

JDK动态代理为什么必须用接口JDK动态代理与CGLIB动态代理。从Spring的AOP框架介绍中得知对于使用接口的类,Spring使用JDK动态代理,没有接口的就使用别的AOP框架aspectj,但这些都是依赖于Java字节码工具ASM生成一个原类的新类,调用Callback 。但是JDK动态代理为什么必须使用接口呢,难道原理不是像ASM一样修改字节码吗?带着这个疑问,开始看JD

2017-08-23 14:00:51 7783

转载 Spring获取bean的几种方式

Spring获取bean的几种方式:方法一:在初始化时保存ApplicationContext对象 方法二:通过Spring提供的utils类获取ApplicationContext对象 方法三:继承自抽象类ApplicationObjectSupport 方法四:继承自抽象类WebApplicationObjectSupport 方法五:实现接口Application

2017-08-22 17:43:37 1110

转载 一张小图看懂hibernate

一张小图看懂hibernate

2017-08-22 17:15:08 824

转载 一张图让你看懂各开源License

一张图让你看懂各开源License

2017-08-22 16:55:53 2077

转载 史上最全的架构师图谱

本文是笔者多年来积累和收集的知识技能图谱,有的是笔者原创总结的最佳实践,有的是小伙伴们的分享,其中每个秘籍图谱里面的内容都是互联网高并发架构师应该了解和掌握的知识,笔者索性把这些图谱收集在一起,并且归类便于查找和学习,希望能够帮助到每一位想成为架构师或者已经是架构师的小伙伴,这里我们的标题“史上最全的架构师图谱”是本文的目标,作者计划把这篇文章作为一个开放性的文章,如果读者发现更多

2017-08-21 15:57:51 2083

转载 ConcurrentHashMap源码分析

HashTable容器是线程安全的,在竞争激烈的并发环境下表现出效率低下的原因是所有访问HashTable的线程都必须竞争同一把锁,那假如容器里有多把锁,每一把锁用于锁容器其中一部分数据,那么当多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效的提高并发访问效率,这就是ConcurrentHashMap所使用的锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据

2017-08-21 15:49:28 826

原创 11.存储空间优化

优化Redis的存储空间Redis是一个基于内存的数据库,所有的数据都存储在内存中,所以优化存储、减少内存空间占用对成本控制来说非常重要。1.精简键名和键值;2.内部编码优化:Redis为每种数据类型提供了两种内部编码方式,并且Redis会根据实际情况自动调整。 共享对象:Redis启动后会预先建立10000个分别存储从0到9999这些数

2017-08-18 17:00:04 1096

原创 10.管道、脚本支持

Redis的管道客户端和Redis使用TCP协议连接。不论是客户端向Redis发送命令还是Redis向客户端返回命令的执行结果,都需要经过网络传输,这两部分的总耗时称为往返时延。在执行多个命令时每条命令都需要等待上一条命令执行完才能执行,即使命令不需要上一条命令的执行结果。Redis的底层通信协议对管道(pipelining)提供了支持。通过管道可以一次性发送多条命令并

2017-08-18 16:56:36 773

原创 9.实现消息通知

消息通知任务队列:即传递任务的队列,可以借助任务队列实现通知的过程。任务队列的好处:松耦合,生产者和消费者无需知道彼此的实现细节;易于扩展消费者,可以有多个并可以分布在不同的服务器中。Redis实现任务队列:使用Redis的列表类型,以及其LPUSH和RPOP命令实现队列的概念。BRPOP和BLPOP还实现了没有元素则阻塞机制。 优先级队列:优先

2017-08-18 16:53:19 1354

原创 8.Redis的排序

Redis的排序SORT命令:SORT命令可以对列表类型、集合类型和有序集合类型键进行排序,并且可以完成与关系数据库中的连接查询相类似的任务。除了可以排列数字外,SORT命令还可以通过ALPHA参数实现按照字典顺序排列非数字元素。SORT命令默认是按照从小到大的顺序排列,如果想从大到小的顺序排列,需要使用DESC参数。SORT命令实现分页:通过支

2017-08-18 16:49:54 955

原创 7.生存时间TTL

生存时间TTL有时效的数据,比如限时优惠活动、缓存或验证码等,过了一定的时间就需要删除这些数据。设置过期时间Redis可以使用EXPIRE命令设置一个键的生存时间,到时候后Redis会自动删除它。默认不设置时间的为永久存在。命令:EXPIRE key seconds  //上述命令标识key键在seconds秒后会被删除, 实现访问频

2017-08-18 16:47:30 1395

转载 StringBuilder在高性能场景下的正确用法

StringBuilder在高性能场景下的正确用法    关于StringBuilder,一般同学只简单记住了,字符串拼接要用StringBuilder,不要用+,也不要用StringBuffer,然后性能就是最好的了,真的吗吗吗吗?还有些同学,还听过三句似是而非的经验:1. Java编译优化后+和StringBuilder的效果一样;2. StringBuilde

2017-08-18 14:53:32 1871

转载 高性能场景下,HashMap的优化使用建议

1. HashMap 在JDK 7 与 JDK8 下的差别顺便理一下HashMap.get(Object key)的几个关键步骤,作为后面讨论的基础。1.1 获取key的HashCode并二次加工因为对原Key的hashCode质量没信心,怕会存在大量冲突,HashMap进行了二次加工。JDK7的做法:h ^= (h >>> 20) ^ (h >>> 12);r

2017-08-18 13:56:19 933

原创 JVM内存对象分配率和提升率

对JVM关注最多的就是其内存管理、垃圾回收,本文从java内存对象在JVM中的分配率和提升率来分析对程序性能的影响。主要信息来自网络。高分配速率(High Allocation Rate)分配速率(Allocation rate)表示单位时间内分配的内存量。通常使用 MB/sec作为单位, 也可以使用PB/year 等。分配速率过高就会严重影响程序的性能。在JVM中会导致巨

2017-08-18 10:16:16 1845

原创 sleep和wait区别总结

sleep和wait区别总结来源类: sleep是Thread类的静态方法; wait是Object的方法,可以对任意一个对象调用wait方法使用范围: sleep可以在任何地方使用,必须捕获异常; wait只能在同步控制方法或者同步控制块里面使用,不需要捕获异常锁: sleep不释放锁,不出让系统资源; wait释放了锁,进入线程等待池等待,出让系统资源唤醒: sleep(ms)将一

2017-08-16 17:21:20 1289

原创 6.Redis的事务

Redis的事务:Redis中的事务(transaction)是一组命令的集合。事务同命令一样都是Redis的最小执行单元,一个事务中的命令要么都执行,要么都不执行。事务的原理是先将属于一个事务的命令请求打包发送给Redis,然后再让Redis一次性、按顺序地执行这些命令。在事务执行期间,服务器不会中断事务而改去执行其他客户端的命令请求,它会将事务中的所有命令都

2017-08-16 14:12:30 824

原创 5.Redis中的对象

Redis内部使用一个redisObject对象来表示所有的key和value。 OBJECT 命令可以在内部调试(debugging)给出keys的内部对象,它用于检查或者了解你的keys是否用到了特殊编码 的数据类型来存储空间z。 当redis作为缓存使用的时候,你的应用也可能用到这些由OBJECT命令提供的信息来决定应用层的key的驱逐策略(eviction policies)OBJECT

2017-08-16 14:00:15 916

原创 4.Redis的数据库

Redis多数据库 一个Redis实例提供了多个用来存储数据的字典,客户端可以指定将数据存储在哪个字典中。 每个字典类似于一个独立的数据库。每个字典对外以一个从0开始的递增数字命名,默认支持16个,不支持自定义数据库名字。 一般不同应用的数据应该使用不同的Redis实例存储。 Redis是一个键值对数据库服务器,服务器中的每个数据库都由一个redis.h/redisDb结构标识,其中re

2017-08-16 13:55:39 812

原创 3.Redis的数据结构

Redis的数据结构Redis支持String、Hash、List、Set和Sorted Set五种数据类型。Redis内部使用一个redisObject对象来表示所有的key和value。 字符串类型 String简介:可以存储任何形式的字符串,一个字符串类型键允许存储的数据的最大容量是512MB。常用命令:set/get/decr/incr/mget等;应用

2017-08-15 11:35:49 869

空空如也

空空如也

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

TA关注的人

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