自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 如何提升研发效率

摘自《大型网站技术架构演进与性能优化》一、沟通效率:通过规范和约定把大家圈在同一个语言频道里1、统一的术语,减少沟通成本2、结构化表达需求,将一系列需求用术语、图表、页面等更好理解的方式呈现二、开发效率1、开发态和运行态分离:线下开发都是独立进行,各自owner各自的代码,但是线上部署在同一个容器中,兼顾开发效率和运行效率2、对系统进行分层和抽象建模:提炼公共模块,减少重复...

2019-08-27 22:26:56 2195

原创 java中降低锁竞争的一些思路

在高并发系统开发时,由于涉及到多线程,不可避免的会对一些需要独占处理的资源进行加锁处理。但是加锁的话势必会导致锁竞争,若是锁竞争激烈的话会极大影响并发处理效率。因此在写代码的时候需要注意降低锁竞争,以下是一些思路整理:1、缩小锁的范围,无需独占处理的代码一定移到同步代码块之外2、减少锁竞争,例如ConcurrentHashMap的锁分段技术,将需同步的范围拆分成几份,分别用锁控制3、C...

2019-08-27 15:20:49 490

原创 一次异步写入kafka导致的伪内存泄漏

对应用进行压测,刚开始几分钟tps很高能达到3000,压了八分钟后忽然降到了400多,十分奇怪,top看了一下cpu飙到了700%多。用JvisualVM连接上JVM进行监控,发现内存使用率高达90%多,然后在疯狂GC,但是内存却释放不了。心中十分奇怪,难道是内存泄露了?于是查看内存信息,发现了大量HashMap.Node和char[]对象在内存中。几乎占了70%内存,查看日志却无异常。...

2019-06-27 14:29:26 1289

原创 一次压测性能优化

优化点如下:1、后端服务原来提供restful接口进行调用,会将一些请求参数放在url中,后端通过@PathVariable进行获取,但是采用这种方式在springmvc中定位具体handler时会进行遍历、模糊匹配,影响性能。后均优化为非restful方式,参数统一放在url的?符号后,或直接放在requestBody中,处理性能提高20%以上。相关参考:https://tech.imd...

2019-06-25 16:14:45 481

原创 mysql数据库优化

    mysql是一款开源数据库,因其开源免费、可移植、便于使用、高性能等特点被广泛使用。而身为后端程序员,不止需要sql的编写使用技能,更是需要对其实现架构有所了解,以便在具体的业务场景中对其进行有针对性的优化。而本文将记录在日常使用中,对mysql多个维度对一些优化技巧及使用注意项,叙述以innodb引擎为主系统环境层面优化    mysql被设计成一个可移植的数据库,几乎可以在当前...

2019-02-13 11:35:20 242

转载 基于sysctl.conf优化高并发服务器的TCP参数

sysctl.conf工作原理 sysctl命令被用于在内核运行时动态地修改内核的运行参数,可用的内核参数在目录/proc/sys中。它包含一些TCP/IP堆栈和虚拟内存系统的高级选项, 这可以让有经验的管理员提高引人注目的系统性能。用sysctl可以读取设置超过五百个系统变量。limits.conf设置1)暂时生效,适用于通过 ulimit 命令登录 shell 会话期间 ...

2019-01-02 15:10:24 1021

原创 记一次Dubbo导致的内存泄漏过程分析及解决

       近日测试团队反馈版本机测试环境请求经常卡顿,十分缓慢,甚至有超时的情况,但是请求返回、业务逻辑均是正常的,因此进行了一番排查。        首先查看应用日志,及控制台监控,应用均表现无异常,由于版本机为单应用测试坏境,因此也排除负载均衡等问题。于是监控了一下linux环境        1、top命令查询linux环境内存及cpu使用情况,发现应用占用cpu达到了90%多,...

2018-08-14 21:47:53 4998 1

转载 【转】JDK1.8新特性

转自:http://www.jb51.net/article/48304.htm 本教程将Java8的新特新逐一列出,并将使用简单的代码示例来指导你如何使用默认接口方法,lambda表达式,方法引用以及多重Annotation,之后你将会学到最新的API上的改进,比如流,函数式接口,Map以及全新的日期API“Java is still not dead—and people are ...

2018-08-04 19:12:15 148

转载 HTTP详解

【转帖】原文链接:https://www.cnblogs.com/ranyonsue/p/5984001.htmlHTTP简介HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查...

2018-06-17 17:40:43 215

原创 (TCP/IP的特性二)流量控制&阻塞控制

TCP流量控制之滑动窗口协议:    TCP协议中,发送方和接收方均维护了一份窗口,窗口的大小就是TCP可以发送的数据帧数,在发送端,只有在发送窗口内的数据才允许被发送到接收端,而在接收端,也只有落到接收窗口的数据才允许被接收。这样通过不断滑动窗口实现数据的不断发送,也通过控制窗口的大小实现了流量控制。    滑动窗口的大小是由接收方数据缓冲区大小决定的,在连接建立时接收端便会将这些信息传送给发送...

2018-06-17 17:34:12 1191

原创 (TCP/IP的特性一)三次握手&四次挥手

    TCP与UDP的对比:     TCP/IP中有两个具有代表性的传输协议,他们分别是TCP和UDP。TCP提供可靠的通信传输,而UDP则常被用于广播和细节控制交给应用的通信传输。那他们有何异同呢?    1、TCP是面向连接的、可靠的流协议,为了提供可靠性传输,TCP实现了“三次握手,四次挥手”、“顺序控制(序号标识)”、“重发控制”、“滑动窗口机制(流控制)”、“阻塞窗口(拥堵控制)”等...

2018-06-17 15:53:34 280

原创 【redis学习之七】基于Redis的分布式缓存常见问题

在使用redis做全局缓存的时候,基本的流程大概是这样的:    大概流程即为:①判断缓存是否存在②若存在则直接返回调用端③若不存在则从数据库加载数据④将加载的数据写入缓存⑤返回调用端    但是现实使用过程中还是有一些问题值得讨论一番1、redis和数据库双写一致性问题:      当发生写数据库操作的时候,若是insert情况,那我们在插入数据库后,是否也需将新写入的数据更新到缓存里呢?若是u...

2018-06-12 23:03:07 271

原创 【redis学习之六】基于Redis的分布式session实现

    在web应用中,我们经常会用session来保存已登录用户的相关信息,在单机应用中,由于所有的用户都访问同一个应用,而session都保存在此单机应用中所以并无不妥。但是随着用户并发量的上升,分布式系统势在必行,这就导致一个用户的访问请求可能会分发到不同的集群部署应用上处理,此时在某个应用上创建session存储信息可能换一个应用就找不到了。    那么如何解决这种问题呢?有三种思路:1、...

2018-06-12 21:41:33 554

原创 【redis学习之四】Redis的过期键处理及键淘汰策略

    在redis中可以通过如下命令设置键的生存时间或生命周期:EXPIRE KEY TTL 命令用于将key的生存时间设置为ttl秒PEXPIRE KEY TTL 命令用于将key的生存时间设置为ttl毫秒EXPIREAT KEY TIMESTAMP 命令用于将key的过期时间设置为timestamp所指定的秒数时间戳PEXPIREAT KEY TIMESTAMP ...

2018-06-07 23:47:44 1148

原创 【redis学习之三】Redis数据持久化

RDB    RDB持久化功能会将redis内存快照保存到磁盘中,避免数据意外丢失,所生成的RDB文件是一个经过压缩的二进制文件,通过该文件可以还原生成RDB文件时的数据库状态。    RDB文件会在服务器启动时自动载入,而我们可以用SAVE和BGSAVE两个命令来手动触发RDB持久化操作,但是SAVE命令会阻塞服务器,此时redis将不能处理客户端请求。用户可以在redis.conf设置RDB自...

2018-06-07 21:47:47 194

原创 【redis学习之二】Redis数据结构&&常用命令&&使用场景

String    在redis内部实现为SDS(simple dynamic string),为键值对类型,通过set key value 可以实现memcached的键值对缓存功能。亦可将对象序列化或转化为json后通过key-value形式存储。但是注意由于redis的单线程模型,若是value太大,单个string的读取将会缓慢,影响redis服务器效率,value的网络传输及在程序中反序...

2018-06-06 23:34:26 168

原创 【redis学习之一】redis安装与运行

在linux下安装redis服务:1、首先下载tar包,解压,进入相应目录:wget http://download.redis.io/releases/redis-3.2.8.tar.gztar zxvf redis-3.2.8.tar.gzcd redis-3.2.8make因为redis是基于C写的,若是linux系统未安装C相关插件,make过程中可能报错:/bin/sh: cc: ...

2018-06-05 21:50:30 159

原创 Java实现多线程的方法

java实现多线程的方式有三种:1、继承Thread类,重写该类的run方法(Thread类实现了Runnable接口)public class TestThread extends Thread{ /** * @param args */ public static void main(String[] args) { TestThread thread = new Test...

2018-06-04 22:15:20 135

原创 java关键字

static:1、修饰成员变量,通过修饰类的属性,将成员变量所属由对象变为类,从而实现所有对象对该变量的共享;2、修饰成员方法,将其变为类方法,可以直接使用“类.方法”的方式调用,而不用new一个新对象,通常用于工具类;3、静态方法块,将多个类成员放在一起初始化,被static修饰的方法将在类加载过程中优先初始化;4、静态导包用法,将类方法直接导入当前类,从而直接使用方法名即可以使用方法final...

2018-05-08 22:09:10 171

原创 mysql数据库索引使用注意事项

    为了提高数据库查询速度,我们一般都会给数据库建立索引。所谓索引就是通过索引值快速找到数据所在位置,从而实现快速访问。而索引还有另一个作用就是不用真正查看数据而做一些判断,例如查看是否存在所寻数据。    mysql的索引一般为B+树,以InnoDB为例,有两种类型的B+树索引,一种称为聚簇索引,一种称为二级索引。聚簇索引的叶子节点就是数据节点,往往是主键作为聚簇索引,二级索引的叶子节点存放...

2018-05-06 21:53:53 246

原创 【redis学习之五】基于redis的分布式锁实现

    在单个JVM中,我们可以很方便的用sychronized或者reentrantLock在资源竞争时进行加锁,保证高并发下数据线程安全。但是若是分布式环境下,多个JVM同时对一个资源进行竞争时,我们该如何保证线程安全呢?分布式锁便能实现我们的要求。    在设计思路上,分布式锁和java自带的锁采用的方法是一样的。reentrantLock是基于AQS的,在AQS基类中维护了一个int类型的...

2018-05-06 16:51:16 182

原创 java排序算法

1、冒泡排序 int a[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51}; int tmp = 0; // 遍历数组 for(int i=0;i<a.length-1;i++){ // 每执行完此循环一次便把一个下标(0,a.length-1-i)范...

2018-04-21 15:59:22 138

原创 ThreadPoolExecutor源码解析

    ThreadPoolExecutor框架是java concurrent包下一种线程池实现框架,而通常我们所用的通过Executors创建线程池的方法,便是对此框架进行封装,通过创建TreadPoolExecutor时上送不同的参数而获取到不同类型的线程池。下面我们来分析一下它的源码具体实现。    首先我们来了解下线程池的状态有哪些:        // 运行中,正在处理任务且可以接受新...

2018-04-18 22:35:01 126

原创 SpringMVC中servlet处理http请求源码解析

    Spring MVC的核心控制器为Servlet,所有访问服务端的请求都将由servlet拦截接受,并进行相应处理最终进行返回。下面我们来看看它究竟是怎么做的。    SpringMVC中的Servlet一共有三个层次,分别是HttpServletBean、FrameworkServlet和 DispatcherServlet。      HttpServletBean直接继承自java的...

2018-04-16 23:00:04 377

原创 一份基于quartz的任务多线程处理模板

本任务处理模板使用maven管理具体jar包依赖,使用quartz2.2.2搭建的一个定时任务处理模板,模板提供了一个CommonJob类用于quartz调用,此类的作用是处理任务模板类,规定了处理任务的步骤为:①获取待处理任务列表;②遍历待处理任务列表,逐一进行处理。然后只需要注入一个具体的任务类,此任务类可注入相应的业务处理service,service需实现CommonJobService中...

2018-04-15 22:58:35 496

原创 高并发系统优化思路

硬件、操作系统层面的优化:1、提升硬件性能,采用多核CPU、增加内存、固态硬盘,注意32位系统内存限制为2G,64位则无此限制,2、为应用服务增加集群负载均衡,硬件负载F5,软负载LVS、Nginx,进行限流3、请求数据进行动静分离,若访问静态资源如静态页面、图片可通过Nginx进行路由至固定路径获取,无需访问后台服务器,降低服务器压力应用系统架构优化:1、系统设计初期要考虑好拓展性,采用分布式,...

2018-04-15 14:14:23 1976

原创 JVM及垃圾回收

JVM虚拟机在运行过程中包括以下几个运行区域:1、线程私有区域:①程序计数器:当前线程所执行字节码指示器,通过计数器数值的改变来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、程序回复等基础功能均需依赖此计数器完成;②java虚拟机栈+本地方法栈:每个方法在执行时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口信息等2、线程共有区域:①java堆:所有的对象实例以及数组...

2018-04-14 23:17:01 102

原创 Java集合类

 Java集合类可分两种,Collection与Map,Collection用于存放多个单对象,Map用于存放key-value键值对类型对象。Collection又可分为List和Set两类,List可存放重复对象,Set中对象不可重复。List常用实现类如:ArrayList,LinkedList,Vector及Stack;Set接口常用有:HashSet、TreeSet.Collection...

2018-02-06 16:41:53 102

原创 SpringFramwork备忘

IOC与控制反转依赖控制反转:依赖的对象获得被反转,在Spring中,IOC容器是实现这个模式的载体,它可以在生成对象初始化时直接将依赖注入到对象中,且这种依赖注入是可以递归的,对象被逐层注入。把依赖控制权从具体业务逻辑转交给了框架;依赖注入一般发生在应用第一次通过getBean向容器索取bean的时候BeanFactory:定义了IOC容器最基本的形式,主要方法:getBean,contains...

2018-02-05 23:48:11 178

空空如也

空空如也

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

TA关注的人

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