自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

逆流而上的博客

但愿此生,逆流而上!

  • 博客(69)
  • 收藏
  • 关注

原创 Netty简介

一、什么是Netty在网络编程领域,Netty是Java的卓越框架。它驾驭了Java高级API的能力,并将其隐藏在一个易于使用的API之后。Netty使你可以专注于自己真正的业务。简单的说,Netty是一个让网络编程变得简洁的框架,实现了真正的异步非阻塞,性能及其优越。二、为什么选择Netty通常,如果用NIO来实现一个服务端需要以下步骤。创建ServerSocketChannel,配置...

2020-02-27 19:04:22 785

原创 Java并发编程系列---Fork/Join框架

一、什么是Fork/Join框架Fork/Join框架是Java 7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。我们再通过Fork和Join这两个单词来理解一下Fork/Join框架。Fork就是把一个大任务 切分为若干子任务并行的执行,Join就是合并这些子任务的执行结果,最后得到这个大任 务的结果。比如计算1+2+…+1...

2020-02-18 20:37:12 252

原创 Java并发编程系列---Java中的并发工具类CountDownLatch、CyclicBarrier、Semaphore、Exchanger

一、Java中的并发工具类在JDK的并发包里提供了几个非常有用的并发工具类。CountDownLatch、 CyclicBarrier和Semaphore工具类提供了一种并发流程控制的手段,Exchanger工具类则提供了在线程间交换数据的一种手段。二、CountDownLatch(等待多线程完成)CountDownLatch允许一个或多个线程等待其他线程完成操作。CountDownLat...

2020-02-18 18:17:49 402

原创 Java并发编程系列---LockSupport工具和Condition接口

一、LockSupport工具LockSupport定义了一组的公共静态方法,这些方法提供了最基本的线程阻塞和唤醒功能,而LockSupport也成为构建同步组件的基础工具。LockSupport定义了一组以park开头的方法用来阻塞当前线程,以及unpark(Thread thread)方法来唤醒一个被阻塞的线程。Park有停车的意思,假设线程为车辆,那么park方法代表着停车,而unpar...

2020-02-15 20:26:21 708

原创 Java并发编程系列---可重入锁和读写锁的实现原理、源码分析

一、重入锁1.1 什么是重入锁重入锁ReentrantLock,就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁。除此之外,该锁的还支持获取锁时的公平和非公平性选择。1.2 重入锁有什么用例子:之前AQS的一个自己实现的锁package com.example.demo.thread;import java.util.concurrent.TimeUnit;impor...

2020-02-11 19:50:57 1013

原创 Java并发编程系列---AQS的实现原理、源码分析

一、同步队列AQS依赖内部的同步队列(一个FIFO双向队列)来完成同步状态的管理,当前线程获取同步状态失败时,同步器会将当前线程以及等待状态等信息构造成为一个节点 (Node)并将其加入同步队列,同时会阻塞当前线程,当同步状态释放时,会把首节点中的线程唤醒,使其再次尝试获取同步状态。同步队列中的节点(Node)用来保存获取同步状态失败的线程引用、等待状态以及前一个节点和后一个节点,节点的属...

2020-02-11 14:07:36 702

原创 Java并发编程系列---Lock接口和AQS初识

一、 java中的锁1.1 什么是锁锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同 时访问共享资源(但是有些锁可以允许多个线程并发的访问共享资源,比如读写锁)。在 Lock接口出现之前,Java程序是靠synchronized关键字实现锁功能的,而Java SE 5之后, 并发包中新增了Lock接口(以及相关实现类)用来实现锁功能,它提供了与synchronized...

2020-02-10 18:14:40 1582

原创 Java并发编程系列---线程池的创建和使用

一、线程池的使用1.1 线程池的创建我们可以通过ThreadPoolExecutor来创建一个线程池。new ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ...

2020-02-06 19:21:12 2609

原创 Java并发编程系列---线程池的实现原理

一、线程池简介1.1 什么是线程池所谓线程池,通俗的理解就是有一个池子,里面存放着已经创建好的线程,当有任务提交给线程池执行时,池子中的某个线程会主动执行该任务。如果池子中的线程数量不够应付数量众多的任务时,则需要自动扩充新的线程到池子中,但是该数量是有限的,就好比池塘的水界线一样。当任务比较少的时候,池子中的线程能够自动回收,释放资源。为了能够异步地提交任务和缓存未被处理的任务,需要有一个任...

2020-02-06 17:38:06 2658

原创 Java并发编程系列---Hook线程

一、Hook 线程介绍JVM进程的退出是由于JVM进程中没有活跃的非守护线程,或者收到了系统中断信号,向JVM程序注人一个Hook线程,在JVM进程退出的时候,Hook线程会启动执行,通过Runtime可以为JVM注人多个Hook线程。二、简单例子/** * @author : pengweiwei * @date : 2020/2/4 7:32 下午 */public class ...

2020-02-04 20:44:45 2984 2

原创 Java并发编程系列---线程间通信

一、线程间通信线程开始运行,拥有自己的栈空间,就如同一个脚本一样,按照既定的代码一步一步地执行,直到终止。但是,每个运行中的线程,如果仅仅是孤立地运行,那么没有一点儿 价值,或者说价值很少,如果多个线程能够相互配合完成工作,这将会带来巨大的价值。二、等待/通知机制等待/通知机制,是指一个线程A调用了对象O的wait()方法进入等待状态,而另一个 线程B调用了对象O的notify()或者not...

2020-02-03 19:46:30 2824

原创 Java并发编程系列---Thread API详解

Thread API详解一、线程sleepsleep方法是一个静态方法。他有两个重载方法。 public static native void sleep(long millis) throws InterruptedException; public static void sleep(long millis, int nanos) throws InterruptedException...

2020-02-02 20:38:05 3649

原创 Java并发编程系列---volatile和synchronized关键字详解

一、简介在多线程并发编程中synchronized和volatile都扮演着重要的角色,volatile是轻量级的 synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个 线程修改一个共享变量时,另外一个线程能读到这个修改的值。如果volatile变量修饰符使 用恰当的话,它比synchronized的使用和执行成本更低,因为它不会引起线程上下文的切 换和调...

2020-02-01 19:15:59 5182

原创 Java并发编程系列---线程的构建、启动和停止

一、构造线程在运行线程之前首先要构造一个线程对象,线程对象在构造的时候需要提供线程所需要的属性,如线程所属的线程组、线程优先级、是否是Daemon线程等信息。下面代码摘自java.lang.Thread中对线程进行初始化的部分。private void init(ThreadGroup g, Runnable target, String name, ...

2020-02-01 18:37:09 5001

原创 Java并发编程系列---线程知识简介

一、什么是线程操作系统在运行一个程序时,会为其创建一个进程(就是windows任务管理器看到的那些运行的进程)。例如,启动一个Java程序, 操作系统就会创建一个Java进程。现代操作系统调度的最小单元是线程,也叫轻量级进程 (Light Weight Process),在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的内存变量。处理器利用程序计数...

2020-02-01 15:55:51 4954

原创 Java并发编程系列---上下文切换和死锁

一、上下文切换即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切换线程执行,让我们感觉多个线程是同时执行的,时间片一般是几十毫秒 (ms)。CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一 个任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这...

2020-01-31 20:51:35 6802

原创 RabbitMQ实现可靠性消息投递---保证消费者接收到消息

一、保证可靠性消息投递首先需要明确,效率与可靠性是无法兼得的,如果要保证每一个环节都成功,势必会对消息的收发效率造成影响。 如果是一些业务实时一致性要求不是特别高的场合,可以牺牲一些可靠性来换取效率。在消息投递过程中,一共有四处需要保证可靠性。如图。①代表消息从生产者发送到Exchange;②代表消息从Exchange路由到Queue;③代表消息在Queue中存储;④代表消费者订阅...

2020-01-31 17:05:09 7355

原创 Springboot整合RabbitMQ实现发送接收消息

一、发送消息的步骤二、项目准备新建两个springboot项目,分别取名为producer 和 consumer。新建项目的时候引入Rabbitmq依赖。或者手动添加。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot...

2020-01-30 19:47:07 9200 1

原创 RabbitMQ入门介绍以及安装使用

一、RabbitMQ初识RabbitMQ是一个实现了高级消息队列协议(AMQP的消息代理(也叫消息中间件),它接受并转发消息。它可以帮你处理一些逻辑的事务,从而进行解耦,比如用户注册落库之后,还需要发送邮件验证、需要发送新人红包等等事情,就可以交给中间件去做。也可以把它当成一个邮局:当你想邮寄信件的时候,你会把信件放在投递箱中,并确信邮递员最终会将信件送到收件人的手里。在这个例子中,Rabbit...

2020-01-29 19:54:25 6739

原创 NIO的网络IO操作

一、网络IO1.1 概述文件IO用到的FileChannel并不支持非阻塞操作,学习NIO主要就是进行网络IO,JavaNIO中的网络通道是非阻塞10的实现,基于事件驱动,非常适用于服务器需要维持大量连接,但是数据交换量不大的情况,例如一些即时通信的服务等…在Java中编写Socket服务器,通常有以下几种模式:一个客户 端连接用一个线程,优点:程序编写简单;缺点:如果连接非常多,分配的...

2020-01-28 19:46:33 6842

原创 NIO详解以及NIO的文件IO操作

一、NIO概述java.nio全称java non-blockingIO,是指JDK1.4开始提供的新API。从JDK1.4开始,Java提供了一系列改进的输入/输出的新特性,被统称为NIO(即NewIO)。新增了许多用于处理输入输出的类,这些类都被放在java.nio包及子包下,并且对原java.io包中的很多类进行改写,新增了满足NIO的功能。NIO和BIO有着相同的目的和作用,但是它们的...

2020-01-27 17:05:20 8697

原创 了解一下Zookeeper的Leader选举

一、Leader选举概述Leader选举是ZooKeeper中最重要的技术之一,也是保证分布式数据一致性的关键所在。在本节中,我们将先从整体上来对ZooKeeper的Leader选举进行介绍。二、Leader选举2.1 服务器启动时期的Leader选举2.1.1 什么时候进行Leader选举需要注意的一点是,隐式条件便是ZooKeeper的集群规模至少是2台机器,这里我们以3台机器组成的...

2020-01-26 21:58:47 7655

原创 Zookeeper的安装与基本使用

一、部署与运行1.1 系统环境对于大部分Java开源产品而言,在部署与运行之前,总是需要搭建一个合适的环境,通常包括操作系统和Java环境两方面。本节将介绍部署与运行ZooKeeper需要的系统环境,同样包括操作系统和Java环境两部分。1.1.1 操作系统首先,你需要选择-一个合适的操作系统。幸运的是,ZooKeeper 对于不同平台的支持都很好,在现在绝大多数主流的操作系统上都能够正常...

2020-01-26 20:20:15 7903

原创 ZooKeeper的系统模型(数据模型、节点特性、版本、Watcher、ACL)

一、数据模型ZooKeeper的视图结构和标准的Unix文件系统非常类似,但没有引入传统文件系统中目录和文件等相关概念,而是使用了其特有的“数据节点”概念,我们称之为ZNode.ZNode是ZooKeeper中数据的最小单元,每个ZNode上都可以保存数据,同时还可以挂载子节点,因此构成了一个层次化的命名空间,我们称之为树。1.1 树ZooKeeper中,每- -个数据节点都被称为-一个ZN...

2020-01-26 19:40:40 8235

原创 ZooKeeper八大典型的应用场景

一、数据发布/订阅(配置中心)什么是配置中心,有什么用?数据发布/订阅( Publish/Subscribe)系统,即所谓的配置中心,顾名思义就是发布者将数据发布到ZooKeeper的一个或一系列节点上,供订阅者进行数据订阅,进而达到动态获取数据的目的,实现配置信息的集中式管理和数据的动态更新。配置中心的设计模式发布/订阅系统一般有两种设计模式,分别是推(Push) 模式和拉(Pull) ...

2020-01-26 17:18:57 9804

原创 ZooKeeper中实现分布式数据一致性的ZAB协议详解

ZAB 协议在深入了解ZooKeeper之前,认为ZooKeeper就是Paxos算法的一个实现。但事实上,ZooKeeper并没有完全采用Paxos算法,而是使用了一种称为ZooKeeperAtomic Broadcast (ZAB, ZooKeeper 原子消息广播协议)的协议作为其数据一致性的核心算法。ZAB协议是为分布式协调服务ZooKeeper专门设计的一种支持崩溃恢复的原子广播协议...

2020-01-25 20:31:21 8500

原创 ZooKeeper的一些概念

ZooKeeper介绍Zookeeper是一个分布式的协调服务,设计目标是将复杂且容易出错的分布式一致性服务封装起来,以一系列的简单易用的接口提供给用户使用。它提供了典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现 数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Leader选举、分布式锁和分布式队列等功能。ZooKeeper的基本概念集群通常在分布式系统中...

2020-01-25 16:46:59 7756

原创 DNS域名解析过程

当用户在浏览器输入一个地址后,DNS解析成ip会有将近10个步骤。第一步:浏览器会检查缓存中有没有这个域名对应的解析过的IP地址,如果有,解析结束。第二步:如果浏览器缓存中没有,则会查找操作系统缓存中是否有这个域名对应的DNS解析结果。就是操作系统里的hosts文件里配置的域名和IP的对应关系。前面两个步骤都是本机完成的,到这里还没有涉及到真正的域名解析服务器,如果在本机中无法完成域名的...

2020-01-22 17:00:01 7767

原创 30分钟利用Typecho搭建一个自己的博客网站

简介Typecho 是国内开发者开发的一款开源免费的动态博客程序,可以运行在基于 PHP 环境的各种平台上。但是却没有详细的安装文档。很是蛋疼。下面是我的安装步骤。首先得有一个服务器和域名。然后在服务器上输入yum install -y wget && wget -O install.sh http://download.bt.cn/install/install.sh ...

2020-01-16 17:30:53 10618 1

原创 当你set一个key-value的时候,redis集群是怎么给你放到相应的节点?

Redis集群介绍Redis 集群是一个提供在多个Redis间节点间共享数据的程序集。Redis集群不能使用mset,mget这样的指令,也就是不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下保证不了原子性。Redis 集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下继续处理命令. Redis ...

2020-01-15 19:31:38 9341 2

原创 redis的哨兵机制

redis哨兵Redis Sentinel,即Redis哨兵。哨兵的核心功能是主节点的自动故障转移。对比主从复制 redis主从复制 来说,哨兵不需要手动修改主从关系以及配置文件端口等信息,一个节点挂掉之后会进行领导者选举和故障转移。哨兵功能的描述:监控(Monitoring):哨兵会不断地检查主节点和从节点是否运作正常。自动故障转移(Automatic failover):当主节点不能正...

2020-01-15 15:55:55 7610

原创 redis主从复制详解

redis主从复制实现方式一、新增一个配置文件端口6380,加入 slaveof 192.168.31.69 6379, 在6379启动完后再启6380,完成配置;方式二、新增一个配置文件端口6380,redis-server --slaveof 192.168.31.69 6379需要注意的几点:配置文件里面的 bind 本来是127.0.0.1 需要修改为服务器ip用redis-...

2020-01-14 23:25:19 7749

原创 redis持久化RDB和AOF原理剖析

一、redis持久化机制redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化,持久化可以避免因进程退出而造成数据丢失。比如断电恢复数据,就是利用了持久化,但是强制杀掉进程是不会被持久化的。二、RDBRDB持久化把当前进程数据生成快照(.rdb)文件保存到硬盘的过程,可以选择手动触发和自动触发。手动触发有save和bgsave两命令save...

2020-01-14 20:20:22 7787

原创 怎么让限制复制的网站能复制

有些网站限制了复制的功能 ,像360doc,必须登录。那么怎么解除呢?右键检查在 console栏 输入javascript:void($={}),回车。好了,可以复制了。

2020-01-11 19:14:43 9183 2

原创 redis数据结构以及常用命令

redis简介Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库。redis存储特别快原因是:1、存在内存中2、单线程3、多路复用4、resp协议5、value简单redis数据结构1、字符串(String)value可以是 XML 、JSON、数字、二进制。最大不能超过512MB。常用命令:设值一个key va...

2020-01-10 17:55:21 7768

原创 mysql性能优化系列(六) --- mysql中常见的SQL优化策略

常见的SQL优化策略1、避免全表扫描对查询进行优化,应尽量避免全表扫描。首先考虑在where以及order by 上添加索引。2、避免判断null值避免在where子句中判断null值,否则会导致引擎放弃使用索引而进行全表扫描。3、避免不等值判断应尽量避免在where子句中使用 !=或者<>操作符,否则会导致引擎放弃使用索引而进行全表扫描。4、避免使用or应当尽量避免在...

2020-01-09 18:28:03 7921

原创 mysql性能优化系列(五) --- mysql数据库设计规范、设计原则

一、 MYSQL数据库设计规范1、 数据库命名规范* 采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成;* 命名简洁明确(长度不能超过30个字符);* 例如:user, stat, log, 也可以wifi_user, wifi_stat, wifi_log给数据库加个前缀; 除非是备份数据库可以加0-9的自然数:user_db_20151210;2...

2020-01-09 15:13:01 7592

原创 mysql性能优化系列(四) ---如何选择合适的列建立索引以及使用索引的注意事项

一、如何选择合适的列建立索引1、在where从句,group by从句,order by从句,on从句中的列添加索引2、索引字段越小越好(因为数据库数据存储单位是以“页”为单位的,数据存储的越多,IO也会越大)3、离散度大的列放到联合索引的前面(离散度:字段中不同的记录的数量,数量越多,则表明离散程度越大)什么是联合索引1、 两个或更多个列上的索引被称作联合索引,又被称为是复合索引。2...

2020-01-08 15:39:18 7900

原创 mysql性能优化系列(三) ---sql及索引优化案例

1、函数Max()的优化SQL:EXPLAIN select max(payment_date) from payment;优化之前:查询大概需要4ms。执行计划是这样的。type为all。是最差的。给字段payment_date 加上索引。查询几乎不耗时。执行计划:红字圈起来的意思是已经不能再进一步优化了。type也为null了。2、函数Count()的优化需求:在一条...

2020-01-08 15:27:02 7681

原创 mysql性能优化系列(二) ---认识一下mysql的索引

B-Tree 索引B-Tree索引是用B-Tree数据结构来存储数据的。大多数mysql引擎都支持这种索引,也是用的比较多的一种它每一个叶子节点都包含指向下一个叶子节点的指针,从而方便叶子节点的范围遍历。为什么B-Tree索引能加快访问的速度?因为存储引擎不再需要进行全表扫描来获取需要的数据,取而代之的是从索引的根节点开始进行搜索。根节点的槽中存放指向子节点的指针,存储引擎根据这些指针向下层...

2020-01-07 19:10:31 7632

空空如也

空空如也

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

TA关注的人

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