自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 深入解析Java中的String

String及其字符串常量池String:对String进行了再次学习,发下很多地方掌握的很模糊:(1)String s1=“abc”;(2)String s2=new String (“abc”);(3)String s3=new String (“abc”).intern();String s4=new String (“def”).intern();jdk1.8:(1)类加载...

2020-02-14 11:57:40 173

原创 Java中为不同的线程设置不同的获取随机数的Random

private static final ThreadLocalRandom RANDOM = ThreadLocalRandom.current();使用了 ThreadLocalRandom 生成单独的Random 实例。此类在 JDK7 中引人,它使得每个线程都可以有自己的随机数生成器。我们要避免 Random 实例被多线程使用,虽然共享该实例是线程安全的,但会因竞争同一 seed 而导致性能下降。...

2020-12-26 17:11:44 393

原创 项目结构分层,各层的对异常的处理

开放 API 层:可直接封装 Service 接口暴露成 RPC 接口;通过 Web 封装成 http 接口;网关控制层等。终端显示层:各个端的模板渲染并执行显示的层。当前主要是 velocity 渲染,JS 渲染,JSP 渲染,移动端展示等。Web 层:主要是对访问控制进行转发,各类基本参数校验,或者不复用的业务简单处理等。Service 层:相对具体的业务逻辑服务层。Manager 层:通用业务处理层,它有如下特征:1) 对第三方平台封装的层,预处理返回结果及转化异常信息,适配上层接口。..

2020-12-04 16:43:40 689 1

原创 Java中,集合与数组之间的相互转换

使用集合转数组的方法,必须使用集合的 toArray(T[] array)方法,传入的是类型完全一致、长度为 0 的空数组。反例:直接使用 toArray 无参方法存在问题,此方法返回值只能是 Object[]类,若强转其它类型数组将出现ClassCastException 错误。List<String> list=new ArrayList<>();list.add("aa");list.add("bb");list.add("cc");// 使用无参的toArray

2020-11-26 17:00:22 25362

原创 RocketMQ启动broker,出现的闪退

描述:在阿里云单机下安装RocketMQ,在不使用 -c 指定配置文件时,能够正常启动。但指定配置文件后,就出现了错误,启动时直接闪退。(因为是单机配置,所谓配置文件使用的rocketmq/conf/broker.conf)问题所在:可以肯定是配置文件中的内容出现了问题。最后排查到是因为配置的RocketMQ数据储存目录配置导致的。(原因暂时未知,但注释掉就好了)#存储路径#storePathRootDir=/usr/local/rocketmq/store#commitLog 存储路径#st

2020-11-12 17:59:37 2333 4

原创 Nodepad++连接Linux服务器查看文件

打开插件:进入插件管理:搜索NppFTP,并安装。安装完毕后会进行自动重启。重启后,再点击插件,里面就有NppFTP,然后点击NppFTP右边的 Show NppFTP Window。配置并连接服务器:点击设置图标,选择Profile Settings:进行链接即可:然后就可以通过窗口的形式查看并修改服务器上的文件了:...

2020-11-03 20:21:20 337

原创 在Windows下查看套接字(tcp、udp)连接

2020-10-15 22:01:04 1825

原创 在浏览器输入一个URL到得到页面,所经历的硬件处理

2020-10-14 14:37:05 157

原创 主键为联合主键时,索引B+树结构

根据下面建表语句,分析各个索引的结构组织:CREATE TABLE `geek` ( `a` int(11) NOT NULL, `b` int(11) NOT NULL, `c` int(11) NOT NULL, PRIMARY KEY (`a`,`b`), KEY `c_index` (`c`), KEY `ca_index` (`c`,`a`), KEY `cb_index` (`c`,`b`)) ENGINE=InnoDB;主键(a,b)的索引结构:主键 a

2020-10-01 15:18:01 941

原创 求一个数组中的最小值与次小值

给定一个数组,无重复值,求数组中元素的最小值与次小值public static void main(String[] args) { Scanner in=new Scanner(System.in); int n=in.nextInt(); int [] a=new int[n]; for (int i = 0; i < n; i++) { a[i]=in.nextInt(); }

2020-09-18 11:12:46 2378

原创 给定一字符串,求它的组合结果

给定一个字符串,求出该字符串的所有组合(假设无重复字符)str=“abc”,那么其组合有[a,b,c,ab,ac,bc,abc]思路:以abc为例,它的组合的结果为 2的3次方-1,即7种。那么枚举1——7,则每个值的二进制可代表一种情况:1: 001 str[2] -----> c2: 010 str[1] -----> b3: 011 str[1]+str[2] -----> bc4: 100 str[0] -----> a5: 1

2020-09-06 19:07:16 543

原创 图相关算法

Dijkstra:package path;import java.util.PriorityQueue;import java.util.Scanner;/** * Dijkstra算法:一张图中,选定一个原点,求剩余点中,任意一点到该原点的最短距离。 */public class DijkstraPath { static class DataNode implements Comparable<DataNode>{ int v;

2020-08-29 08:56:09 231

原创 Ribbon支持的负载均衡算法

2020-08-26 23:06:11 258

原创 2数之和、3数之和问题

给定数组a,与target,求2/3 数和为taget的元素。一、排序数组:2数之和:left=0,right=n-1,双指针联动:sum<target时,left++;sum>target时,right–;sum==target时,left++,right–。3数之和:还是双指针联动。比如遍历到a[i],令temp=target-a[i],left=i+1,right=n-1,求和为temp的2数和,转换为2数和问题。二、非排序数组:2数之和:用一个set保存a[i]的值。遍历

2020-08-04 16:56:27 283

原创 MySQL进行连接时的on与where的区别【坑】

SQL 语句中 left join 后用 on 还是 where,区别大了!【避坑】

2020-06-18 18:32:08 163

原创 使用Redis作为异步队列的相关问题

如何使用Redis实现异步队列:rpush + blpop如何实现一次发布,多次消费:使用Pub/Sub机制,可以实现1:N的消费关系。Redis的Pub/Sub机制有什么缺点:新开启的订阅客户端,无法消费之前已经发布的消息;下线后再次上线的订阅客户端,也无法接收下线期间的消息。究其原因是没有对消息进行持久化。Redis如何实现延时队列:使用zset,拿时间戳作为score,消息内容作为key调用zadd来生产消息,消费者用zrangebyscore指令获取N秒之前.

2020-06-12 20:28:41 221

原创 Redis中的Bitmaps、HyperLogLog、GEO

一、Bitmaps:位图:用一个bit位的状态来表示某个数据的是否已经存在。基本操作:// offset:偏移量,从0开始 value:只能为0/1setbit key offset valuegetbit key offset// 获取当前位图数组中,指定下标范围内,值为1的个数bitcount key [start] [end]位运算操作:// 对多个位图做位运算。op取值:and,or,not,xor// 将将位运算的结果放在指定的destkey中bitop

2020-06-12 11:36:14 304

原创 Redis内存淘汰策略

1.volatile-lru:从已经设置过期时间的数据集中,挑选最近最少使用的数据淘汰。2.volatile-ttl:从已经设置过期时间的数据集中,挑选即将要过期的数据淘汰。3.volatile-random:从已经设置过期时间的数据集中,随机挑选数据淘汰。4.allkeys-lru:从所有的数据集中,挑选最近最少使用的数据淘汰。5.allkeys-random:从所有的数据集中,随机挑选数据淘汰。6.no-enviction:禁止淘汰数据。补充:Redis4.0后新增了LFU(l

2020-06-10 17:28:20 235 1

原创 Redis与Memcahed的区别

1. 持久化:Memcached数据完成保存在内存,Redis数据也是放在内存,但是它支持持久化,也就是说断电后,可以通过日志文件恢复数据。2. 数据类型:memcached只支持string,而redis支持数据类型较丰富,如string、list、set、sorted set、hash。3. 底层实现:底层实现不同。Memcached调用系统函数,会消耗比较多的时间去请求,redis自己构建了vm,速度会更快。4.支持的数据大小:Memcached最多只能存储1M大小,而Redis的key

2020-06-10 16:37:36 186

原创 Redis Cluster原理分析

一、数据分布:所谓数据分布就是将数据分散到各个Redis节点中去。Redis进行数据分布采用的是 一致性哈希+虚拟槽 的方式。关于一致性哈希,看程序员小灰:一致性哈希介绍。因为一致性哈希存在存储数据结点分布不均匀,从而导致数据也分布不均与的现象,并且这种现象在结点少的时候更容易出现。另外当数据结点较少时,改变其中的结点,带来的数据迁移量会越大。而一般的情况下,并不会有几百个结点的情况。所以Redis使用了虚拟槽(slot),虚拟槽就是把数据通过哈希函数映射到一个固定的整数范围内,这个范围一般远远大

2020-06-07 19:21:28 311

原创 Redis的Sentinel模式原理

Sentinel模式基本介绍一、Sentinel的三个定时任务:每隔10秒,每个Sentinel节点向每个主节点或者从节点发送 info命令,去获取最新的拓扑结构。这也是在配置Sentinel节点时,只配置了Sentinel监控的主节点,但是却可以获取到主节点的从节点的原因。每隔2秒,每个Sentinel节点向_sentinel_:hello频道发送对主节点的判断以及自身的信息。每个Sentinel节点都会订阅_sentinel_:hello频道,以此来了解其他Sentinel节点,同时交

2020-06-07 11:44:22 253

原创 Redis的Sentinel模式基本介绍

主从模式介绍主从模式存在的问题:一旦主节点宕机,从节点晋升为主节点,同时需要修改应用方的主节点地址,还需要命令所有从节点去复制新的主节点,整个过程需要人工干预。主节点的写能力受到单机的限制。主节点的存储能力受到单机的限制。针对主从模式存在的问题,提供了Sentinel模式:Sentinel的作用:监控:不断检查主服务器和从服务器是否正常运行。通知:当被监控的某个 Redis 服务器出现问题,Sentinel 通过 API 脚本向管理员或者其他应用程序发出通知。自动故障转移:当主节点不

2020-06-07 11:43:36 361

原创 Redis主从模式(二):实现原理(全量复制、部分复制)

Redis结点间的复制由从库主动发起。Redis2.8前由sync命令执行,sync命令只能支持全量复制,Redis2.8及其以后,使用psync命令执行,该命令即支持全量复制,有支持部分复制。对于主从间的复制,当从库第一次复制数据时,使用全量复制,后面过程当主库处理了写数据后,会将数据自动同步给从库(异步执行)。而部分复制的时机是在从库复制主库的数据时发生异常,带恢复后,发起的一次补救复制,由于这时只涉及部分数据,所以数据同步时间会较短。下面的主从复制原则分析,也是基于psync来说明的。一、asy

2020-06-06 19:49:50 576

原创 Redis主从模式(一):基本介绍与搭建

一、主从模式:主从模式主要解决2个问题:Redis单点故障:分布式环境下不允许出现单点,也即当某个结点挂了,得有替补接上。读写分离:Redis虽然是一个高性能的数据库,但单机总有瓶颈,所以增加从库来分担读压力。主库来接收写命令,各个从库分担大量的读请求。二、搭建主从:通过info replication 可以查看当前结点的身份信息,与当前结点的从库信息。建立主从关系是在从库上进行配置的:每个启动的Redis结点,默认是一个主库(master)。可以通过下面方式,让当前从库成为某个结点的从库

2020-06-06 14:44:33 291

原创 Redis三种持久化方式:RDB、AOF、Redis4.0后的混合模式

通俗讲持久化就是将内存中的数据写入非易失介质中,比如机械磁盘和SSD。在服务器发生宕机时,作为内存数据库Redis里的所有数据将会丢失,因此Redis提供了持久化两大利器:RDB和AOFRDB 将数据库快照以二进制的方式保存到磁盘中。AOF 以协议文本方式,将所有对数据库进行过写入的命令和参数记录到 AOF 文件,从而记录数据库状态。查看RDB配置[redis@abc]$ cat /abc/redis/conf/redis.confsave 900 1save 300 10save 60 1

2020-06-06 12:09:13 2108

原创 缓存雪崩、缓存击穿、缓存穿透发生的场景分析及解决

一、简单描述加缓存情形下,数据的读取:读取某个数据时,先看缓存中是否存在;存在则返回数据;不存在则从数据库中读取,然后放入缓存。二、缓存雪崩:缓存雪崩指的是:一大批缓存的数据在同一时间过期,这时去获取数据的话,就会去数据库中进行获取,而此时由于数据量很大,所以可能直接压垮数据库。举个例子: 我们对商品详情页进行缓存,每个商品id对应一个商品详情页的缓存,如果我们把每个商品对应的缓存过期时间设置一样。在高并发下,当缓存在同一时间失效时,都会去数据库查询数据,因为商详页设计的信息很多很多,并且在多个线程

2020-06-05 19:57:18 553 1

原创 对阻塞、非阻塞、同步、异步的理解

阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞式调用,你会一直把自己“挂起”,直到得到这本书有没有的结果,如果是非阻塞式调用,你不管老板有没有告诉你,你自己先一边去玩了, 当然你也要偶尔过几分钟check一下老板有没有返回结果。在这里阻塞与非阻塞与是否同步异步无关。跟老板通过什么方式

2020-06-04 12:32:02 158

原创 HTTPS疑惑点

针对老刘公众号文章做出说明与补充。关于之前对 在数字证书上进行签名后就没法修改的疑惑:描述:a. 为了解决服务端公钥替换的问题。此时首先在CA(认证中心),将原信息(服务器的公钥与服务器的身份信息),使用不可逆算法生成摘要,然后把 原信息与摘要以及CA信息(CA的机构,使用的不可逆算法)生成数字证书发送给浏览器。浏览器收到后使用CA信息中的不可逆算法也对原信息进行处理,将处理的结果与摘要进行比较。此时中间人是没法替换替换原信息中的公钥的,因为替换后,最后浏览处理的结果与摘要会不同。 但是中间人可以在

2020-06-04 12:31:33 172

原创 GC日志分析

可用参数及说明:以常用的 -XX:+PrintGCDetails 打印GC日志进行分析:youngGC:FULL GC:堆空间占用情况日志:使用GC日志分析工具对保存的GC日志进行分析:常见的日志分析工具:GCViewer:本地jar之间运行GCEasy:网站形式,导入文件,会生成报表,界面较为友好...

2020-06-04 12:31:10 111

原创 JVM监控工具

1、JVM 内存分析工具Eclipse Memory AnalyzerJVisual VM2、OOM 异常关键字告警阿里云 APM 产品:https://help.aliyun.com/document_detail/42966.html?spm=a2c4g.11174283.6.685.d69b668cuztvff3、在线诊断工具阿里 Java 在线诊断工具 Arthas(阿尔萨斯):alibaba Arthashttps://github.com/alibaba/arthas4.GC日志

2020-06-04 12:30:32 217

原创 Spring面试题100道

一、基本概念面试题集( Spring 相关概念梳理)谈谈对 Spring IoC 的理解?谈谈对 Spring DI 的理解?BeanFactory 接口和 ApplicationContext 接口不同点是什么?请介绍你熟悉的 Spring 核心类,并说明有什么作用?介绍一下 Spring 的事务的了解?介绍一下 Spring 的事务实现方式?解释 AOP 模块Spring 的通知类型有哪些,请简单介绍一下?Spring 通知类型使用场景分别有哪些?

2020-06-03 20:43:37 348

原创 JUC提供的并发容器

2020-06-01 20:02:52 171

原创 CyclicBarrier实现原理核心逻辑

CyclicBarrier作用:CyclicBarrier用于同步一组线程,创建CyclicBarrier时指定参与循环栅栏的线程数量与一组线程全部就位时,优先执行的动作。 每个线程调用await()方法后,即表示到达栅栏点,然后就会进阻塞,当参与循环栅栏的最后一个线程调用了await()方法后,会唤醒之前阻塞的线程,循环栅栏重置,进入下一次循环。CyclicBarrier字段解释: // 表示本次循环的状态:为true时,表示本次循环被破坏(如,有线程被中断、await超时) private st

2020-06-01 19:08:29 232

原创 总结AQS的实现原理(state状态变量、同步队列、Condition等待队列)

一、 总体思想:通过尝试获取共享变量 state 的结果来对线程的状态作出处理。获取成功的线程CAS修改state的之后直接进行自己的处理。未能成功获取共享变量的线程会被封装成结点放入 一个队列中,然后 自旋的检查自己的状态,看是否能再次去获取state资源,获取成功则退出当前自旋状态,获取失败则找一个安全的点(成功的找到一个状态<0前驱结点,然后将其状态设置为SIGNAL),调用LockSupport.park()方法进入waiting状态。然后等待被前驱结点调用release方法(实际上是调

2020-05-30 21:47:24 4013 1

原创 线程池精选文章汇总,个别点补充

1. 核心线程的创建:当向线程池提交一个任务时,判断是否还能创建新的核心线程来执行该任务,能的话创建一个新的核心线程,不能的话放入任务等待队列。 注意:这里就算有核心线程是空闲状态,当能创建核心线程时,还是会创建,而不是拿一个空闲的核心线程来执行。空闲的核心线程会不断扫描等待任务队列,从队列里拿到任务然后进行执行。2.自定义拒绝策略:希望自定义局决策落时,实现RejectedExecutionHandler接口。3.关闭线程池:调用shutdowm后,关闭线程池,线程池的状态变为 SHUTDOW

2020-05-29 20:56:05 155

原创 偏向锁、轻量级锁

偏向锁:线程执行同步代码块时,首先检查JVM是否开启了偏向锁(1.6后默认是开启的),未开启的执行轻量级锁的流程。**开启的话:**检查对象MarkWord中的偏向线程ID是否是当前线程,是的话,执行同步代码块。**若对象MarkWord的偏向线程ID不是当前线程ID **,则证明已经有线程已经持有了偏向锁。此时使用CAS尝试获取获取,获取成功执行同步代码。未获取到偏向锁的线程会在达到安全点时,暂停已经获取到偏向锁的线程,并将锁升级到 轻量级锁。升级以后,唤醒刚才被停止的持有偏向锁的线程(升级后现在是持

2020-05-28 20:32:04 136

原创 ThreadLocal补充

针对微信收藏的文章进行补充:1.ThreadLocalMap当发生冲突时,采用的是线性勘察法(开放地址法)。2.ThreadLocal的内存泄漏问题:这里的内存泄漏指的是,一个线程的执行时间一般较长,如果外部的ThreadLocal失去了引用,这时只有Thread类中ThreadLocalMap中Entry中的key在引用他,而这个key又是个弱引用,value呢又是个强引用。这样就存在下一...

2020-05-27 20:13:37 252

原创 Java产生OOM的几种类型,解决方案与步骤

说明:发生OOM后,查看程序日志可以获取到发生OOM的类型,也就是下面所列出的打印出的提示信息。然后根据 GC日志(通过 -Xloggc:file:指定文件位置)、OOM日志(-XX:+HeapDumpOnOutOfMemoryError:发生OOM时dump出内存信息)、dump出内存信息、结合代码来定位。1. java heap space:堆发生OOM很常见,一般分为两种情况,内存泄漏与堆内存确实存放不下:1) 内存泄漏:内存泄漏就是不再使用的内存任然保持着强引用,导致无法被GC掉。导致原

2020-05-26 12:01:27 975

原创 JVM中参数分类解读

简介:指定JVM 参数我们就可以指定启动 JVM 进程以哪种模式(server 或 client),运行时分配的堆大小,栈大小,用什么垃圾收集器等等,JVM 参数主要分以下三类:1. 标准参数(-):所有的 JVM 实现都必须实现这些参数的功能,而且向后兼容;例如 -verbose:gc(输出每次GC的相关情况),-server(一服务器模式启动jvm)2. 非标准参数(-X):默认 JVM 实现这些参数的功能,但是并不保证所有 JVM 实现都满足,且不保证向后兼容,栈,堆大小的设置都是通过这个

2020-05-25 12:28:52 388

原创 枚举实现单例如何保证线程安全、反射安全、序列化安全

1. 线程安全:enum是一个语法糖,编译后,声明的枚举实例其实对应一个用 static final修饰的变量,其初始化在静态块中完成。所以本质上线程安全也是通过类加载过程中,类构造器(< clinit >)的调用实现了同步。2. 反射安全:不允许对enum进行反射,否则直接抛异常。具体是现在 Constructor::newInstance()方法中,进行了类型判断,如果是Enum(每个枚举类的父类)类型,直接会抛异常。3. 序列化安全:Enum序列化与反序列化时的特殊性。序列化时

2020-05-23 23:16:48 781

空空如也

空空如也

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

TA关注的人

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