自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SpringBoot配置https(SSL证书)

SpringBoot配置https(SSL证书)

2022-06-23 10:05:13 7571

原创 es根据条件删除数据

ES根据条件删除数据

2022-06-15 14:03:25 872

原创 JDK1.8新特性

JDK1.8新特性看到网上有个人总结了这样一句话,感觉比较通俗易懂;速度更快 – 红黑树代码更少 – Lambda强大的Stream API – Stream便于并行 – Parallel最大化减少空指针异常 – Optional1:HashMap有人会在问你HashMap的时候会问你JDK1.7和1.8有什么变化;主要还是HashMap中链长度大于8时采取红黑树的结构存储。(1.7的时候是链表结构)红黑树,除了添加,效率高于链表结构。。2:ConcurrentHashMapJd

2020-10-14 14:45:11 582 2

原创 Java8——Stream流

Java8——Stream流Stream是数据渠道,用于操作集合、数组等生成的元素序列。Stream操作的三个步骤:创建Stream中间操作终止操作一、获取stream的四种方式1.通过collection系列集合的stream()或parallelStream()获取。@Testvoid test11(){ List<String> list = new ArrayList<>(); Stream<String> stringStr

2020-10-13 17:06:07 195

原创 RabbitMQ 如何保证消息的可靠性

RabbitMQ 如何保证消息的可靠性一条消费成功被消费经历了生产者->MQ->消费者,因此在这三个步骤中都有可能造成消息丢失。一 消息生产者没有把消息成功发送到MQ1.1 事务机制AMQP协议提供了事务机制,在投递消息时开启事务支持,如果消息投递失败,则回滚事务。自定义事务管理器@Configurationpublic class RabbitTranscation { @Bean public RabbitTransactionManager rabbitT

2020-10-13 16:52:21 439

原创 常用的加密算法

整理一下常用的加密算法加密算法我们整体可以分为:可逆加密和不可逆加密,可逆加密又可以分为:对称加密和非对称加密。一、不可逆加密常见的不可逆加密算法有MD5,HMAC,SHA1、SHA-224、SHA-256、SHA-384,和SHA-512,其中SHA-224、SHA-256、SHA-384,和SHA-512我们可以统称为SHA2加密算法,SHA加密算法的安全性要比MD5更高,而SHA2加密算法比SHA1的要高。其中SHA后面的数字表示的是加密后的字符串长度,SHA1默认会产生一个160位的信息摘要。

2020-10-12 17:15:42 1403

转载 spring-boot-route整合RabbitMQ

spring-boot-route整合RabbitMQ消息队列简介1. 什么是消息队列MQ(Message Quene):通过典型的生产者和消费者模型,生产者不断向消息队列中产生消息,消费者不断的从队列中获取消息。因为生产者和消费者都是异步的,而且生产者只关心消息的发送,消费者只关心消息的接收,没有业务逻辑的侵入,轻松实现业务解耦。2. 消息队列有什么用异步处理场景描述:某商场具有注册功能,注册的时候需要发送短信验证码。传统的做法是用户提交信息到用户服务,用户服务调用短信服务发送短信,然后

2020-10-12 16:17:58 179

原创 linux 端口问题

Centos7开放及查看端口1、开放端口firewall-cmd --zone=public --add-port=5672/tcp --permanent # 开放5672端口firewall-cmd --zone=public --remove-port=5672/tcp --permanent #关闭5672端口firewall-cmd --reload # 配置立即生效2、查看防火墙所有开放的端口firewall-cmd --zone=public --list-port

2020-06-10 11:12:53 184

原创 设计模式:8适配器模式

适配器模式适配器模式属于结构型模式,又叫包装模式定义:把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法一起工作的两个类能够在一起工作在现有的系统中有新旧两个接口,由于新旧接口不兼容导致客户端调用出现问题,但是现有系统还需要使用旧的接口,所以这个接口不能重构,但是为了能够让客户端正常调用,我们就需要将新的接口转换成旧的接口,这种解决方式就是适配器模式模式类图角色:目标接口:Target,该角色把其他类转换为我们期望的接口被适配类:Adaptee,被期望改变的接口适配

2020-05-29 15:22:08 125

原创 SQL优化之索引

索引是什么?数据库索引,是数据库管理系统(DBMS)中一个排序的数据结构,它可以对数据库表中一列或多列的值进行排序,以协助更加快速的访问数据库表中特定的数据。通俗的说,我们可以把数据库索引比做是一本书前面的目录,它能加快数据库的查询速度。为什么需要索引?思考:如何在一个图书馆中找到一本书?设想一下,假如在图书馆中没有其他辅助手段,只能一条道走到黑,一本书一本书的找,经过3个小时的连续查找,终于找到了你需要看的那本书,但此时天都黑了。为了避免这样的事情,每个图书馆才都配备了一套图书馆管理系统,大家要找

2020-05-29 10:35:56 116

原创 SQL优化 随笔

1 基本概念简述1.1 逻辑架构第一层:客户端通过连接服务,将要执行的sql指令传输过来第二层:服务器解析并优化sql,生成最终的执行计划并执行第三层:存储引擎,负责数据的储存和提取1.2 锁数据库通过锁机制来解决并发场景-共享锁(读锁)和排他锁(写锁)。读锁是不阻塞的,多个客户端可以在同一时刻读取同一个资源。写锁是排他的,并且会阻塞其他的读锁和写锁。简单提下乐观锁和悲观锁。乐观锁,通常用于数据竞争不激烈的场景,多读少写,通过版本号和时间戳实现。悲观锁,通常用于数据竞争激烈的场景,每次

2020-05-29 10:16:17 101

原创 设计模式:7.迭代器模式

迭代器模式迭代器模式属于行为型模式,描述的是类之间的关系定义: 它提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节迭代器模式就是为解决遍历元素而诞生的,java而言,使用java提供的iterator就可以了,不用需要手动去写迭代器模式类图角色:抽象迭代器:Iterator,负责定义访问和遍历元素的接口具体迭代器:ConcreteIterator,实现Iterator接口抽象容器:Aggregate,负责提供创建具体迭代器角色的接口具体容器: ConcreteAgg

2020-05-27 11:24:39 112

原创 设计模式6:建造者模式

建造者模式建造者模式属于创建型设计模式,用来组装复杂的实例定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节模式类图角色抽象建造者:Builder,目的是为了将建造的具体过程交给它的子类来实现。这样更容易扩展。一般至少会有两个抽象方法,一个用来建造产品,一个是用来返回产品具体的建造者: ConcreteBuilder,实现抽象建造者的所

2020-05-27 10:42:05 109

原创 Linux常用命令

cd dir 更改目录到dirtail -f file 从后10行开始查看file的内容shutdown -g0 -y -i5 关机命令(i 是指运行级别,5是指在X86关闭计算机的运行级别 -g 是指在多少分以后关闭电脑 0 就是立刻关闭 -y 就是不进行任何提醒关闭计算机)shutdown -h now 立即关机shutdown -r now 立即重启cp -rf file1 file2将file1复制到file2 (-r 递归处理,指定目录下的文件和子目录一并处理;-f 强行复制,无论目标是

2020-05-27 10:17:21 84

原创 设计模式:5.观察者模式(发布订阅)

观察者模式观察者模式属于行为型模式,又叫发布订阅模式定义:​ 定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新模式类图角色:被观察者:Subject定义一个被观察者必须实现职责,包括动态增加,删除,通知观察者观察者:Observer接受到观察者修改消息,执行自身逻辑具体观察者:ConctreteSubject继承Subject,拥有自己的业务逻辑,具有被观察者基本功能,对某些事件进行通知具体的观察者:ConcreteObserver

2020-05-27 10:09:41 173

原创 设计模式:4.代理模式

代理模式代理模式属于结构型模式定义:为其他对象提供一种代理以控制对这个对象的访问代理模式就是在操作原对象的时候,多出来一个代理类,用来对原对象的访问进行控制和替代原对象进行一些操作模式类图角色抽象接口:able,定义业务接口被代理类:Source代理类:Proxy,用来对原对象的访问进行控制和替代原对象进行一些操作客户端:Client,负责调用代理类优点职责清晰,被代理类只关心实际的业务逻辑,不关心其他事情高扩展性,被代理类可以随意更改,不会影响到代理类对其的访问控制抽象

2020-05-26 17:51:49 99

原创 设计模式:3.抽象工厂

抽象工厂抽象工厂模式属于创建型模式定义:为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类抽象工厂模式是对工厂方法模式的扩展,抽象工厂比工厂模式更为抽象,工厂方法模式针对产品等级结构,而抽象工厂针对产品族。产品族与产品等级结构的概念:​ 产品族,是指位于不同产品等级结构中,功能相关联的产品组成的家族,比如游戏工厂生产射击类和塔防类两种产品,任天堂的射击类游戏和塔防类游戏为一个产品族,腾讯的射击类游戏和塔防类游戏为一个产品族​ 产品等级结构,一个产品族由多个产品等级结构组成,射击

2020-05-26 17:35:30 119

原创 设计模式:2.工厂模式

工厂方法模式工厂模式属于创建型设计模式定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类工厂方法模式是new一个对象的替代品,所以在所有需要生成对象的地方都可以使用,但如果随意增加工厂类会增加代码的复杂度,也不易维护角色抽象产品:Product抽象产品定义具体产品类:ConcreteProduct实现Product接口抽象工厂:Creatot抽象工厂定义具体工厂类:ConcreteCreator实现Creatot接口优点:解耦:调用方不用

2020-05-26 16:31:55 108

原创 设计模式:1.单例模式

什么是单例模式单例模式目的是保证在程序运行期间一个类只有一个实例,并提供一个全局访问点,无论什么情况下,只会生成一个实例,免去繁琐的创建销毁对象的过程。如何设计单例如何设计单例模式其实很简单,只需要考虑一个问题,实例是否可以保证是全局唯一,只要满足这个条件,这个单例设计的肯定就合格了。其中懒汉模式,饿汉模式,双重检查方式实现,静态内部类的实现方式都可以概括为以下两步:构造函数私有化,保证在外部无法new对象提供一个static方法获取当前实例(不同方案,实现不同)当然枚举的实现方式最简单,也最

2020-05-26 16:13:44 81

原创 redis 笔记

1、什么是Redis?它的优缺点?Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像 memcached只能保存1MB的数据,因此Redi

2020-05-26 10:33:43 222

原创 MyCat

Mycat 背后是阿里曾经开源的知名产品——Cobar。Cobar 的核心功能和优势是 MySQL 数据库分片,此产品曾经广为流传,据说最早的发起者对 Mysql 很精通,后来从阿里跳槽了,阿里随后开源的 Cobar,并维持到 2013 年年初,然后,就没有然后了。Cobar 的思路和实现路径的确不错。基于 Java 开发的,实现了 MySQL 公开的二进制传输协议,巧妙地将自己伪装成一个 MySQL Server,目前市面上绝大多数 MySQL 客户端工具和应用都能兼容。比自己实现一个新的数据库协议要明

2020-05-25 17:40:40 111

原创 Nginx

Nginx安装第一步:把 nginx 的源码包nginx-1.8.0.tar.gz上传到 linux 系统Alt+p 启动sftp ,将nginx-1.8.0.tar.gz上传第二步:解压缩tar zxvf nginx-1.8.0.tar.gz第三步:进入nginx-1.8.0目录 使用 configure 命令创建一 makeFile 文件。./configure \--prefix=/usr/local/nginx \--pid-path=/var/run/nginx/ngin

2020-05-25 16:51:02 137

原创 Docker容器部署

1.Docker简介1.1虚拟化1.1.1什么是虚拟化在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,

2020-05-25 16:18:22 521

原创 Java线程同步实现二:Lock锁和Condition

一.同步锁我们还是用同步锁来实现存取款的例子:package com.chanshuyi.thread;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class ThreadDemo93 { public static void main(String[] args) { Account account = new Accoun

2020-05-12 16:05:14 400

原创 Java线程同步实现一:synchronzied和wait()/notify()

1、一个典型的Java线程安全例子package com.chanshuyi.thread;public class ThreadDemo93 { public static void main(String[] args) { Account account = new Account(2300); new DrawMoneyThread(account).start(); new DepositeThread(account).start(

2020-05-12 16:02:15 160

原创 Java并发编程:线程控制

在上一篇文章中(Java并发编程:线程的基本状态)我们介绍了线程状态的 5 种基本状态以及线程的声明周期。这篇文章将深入讲解Java如何对线程进行状态控制,比如:如何将一个线程从一个状态转到另一个状态,如何设置线程的优先级等。一、join() 等待阻塞让一个线程等待另一个线程完成才继续执行。如A线程线程执行体中调用B线程的join()方法,则A线程被阻塞,知道B线程执行完为止,A才能得以继续执行。package com.chanshuyi.thread;public class ThreadDe

2020-05-12 15:58:34 93

原创 Java多线程:线程的几种基本状态

一、线程的基本状态线程基本上有5种状态,分别是:NEW、Runnable、Running、Blocked、Dead。1)新建状态(New)当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread();2)就绪状态(Runnable)当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了t.start()此线程立即就会执行;3)运行状态(Running)

2020-05-12 11:29:06 910

原创 集合总结

2020-05-11 17:34:38 83

原创 集合系列 Map:TreeMap

TreeMap 是 Map 集合的有序实现,其底层是基于红黑树的实现,能够早 log(n) 时间内完成 get、put 和 remove 操作。public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, java.io.SerializableTreeMap 继承自 AbstractMap,还实现了 NavigableMap接口

2020-05-11 17:34:12 237

原创 集合系列 Map:LinkedHashMap

我们之前说过 LinkedHashMap 是在 HashMap 的基础上,增加了对插入元素的链表维护。那么其到底是怎么实现的呢?今天这篇文章就带我们来一探究竟。public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>LinkedHashMap 的声明比较简单,继承了 HashMap 类,实现了 Map 接口。原理我们将从类成员变量、构造方法、核心方法、扩容机制

2020-05-11 17:27:40 148

原创 集合系列 Queue:PriorityQueue

PriorityQueue 是一个优先级队列,其底层原理采用二叉堆实现。我们先来看看它的类声明:public class PriorityQueue<E> extends AbstractQueue<E> implements java.io.SerializablePriorityQueue 继承了 AbstractQueue 抽象类,具有队列的基本特性。二叉堆由于 PriorityQueue 底层采用二叉堆来实现,所以我们有必要先介绍下二叉堆。二叉堆从结构上来

2020-05-11 17:19:15 185

原创 集合系列 Set:TreeSet

TreeSet 是 Set 集合的红黑树实现,但其内部并没有具体的逻辑,而是直接使用 TreeMap 对象实现。我们先来看看 TreeSet 的定义。public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, java.io.Serializable可以看到 TreeSet 实现了 NavigableSet 接口,而 NavigableSet 接口

2020-05-11 09:50:59 358

原创 集合系列 Set:LinkedHashSet

LinkedHashSet 继承了 HashSet,在此基础上维护了元素的插入顺序。public class LinkedHashSet<E> extends HashSet<E> implements Set<E>, Cloneable, java.io.Serializable原理LinkedHashSet 的源码非常简单,只有简单的四4个构造方法。public LinkedHashSet(int initialCapacity, float

2020-05-10 19:32:15 125

原创 集合系列 Set:HashSet

HashSet 是 Set 集合的哈希实现,其继承了 AbstractSet 抽象类,并实现了 Set 接口。public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable原理为了深入理解 HashSet 的原理,我们将从类成员变量、构造方法、核心方法两个方面逐一介绍。类成员变量// HashSet内部使用Hash

2020-05-10 19:30:01 78

原创 集合系列 List:Stack

Stack 是先进后出的栈结构,其并不直接实现具体的逻辑,而是通过继承 Vector 类,调用 Vector 类的方法实现。publicclass Stack<E> extends Vector<E>核心方法Stack 类代码非常简单,其有 3 个核心方法:push、pop、peek。pushpublic E push(E item) { addElement(item); return item;}可以看到 push 方法直接调用 Vector

2020-05-10 19:27:52 132

原创 集合系列 List:Vector

Vector 的底层实现以及结构与 ArrayList 完全相同,只是在某一些细节上会有所不同。这些细节主要有:线程安全扩容大小线程安全我们知道 ArrayList 是线程不安全的,只能在单线程环境下使用。而 Vector 则是线程安全的,那么其实怎么实现的呢?其实 Vector 的实现很简单,就是在每一个可能发生线程安全的方法加上 synchronized 关键字。这样就使得任何时候只有一个线程能够进行读写,这样就保证了线程安全。public synchronized E get(int

2020-05-10 19:26:06 118

原创 集合系列 List:LinkedList

LinkedList 是链表的经典实现,其底层采用链表节点的方式实现。public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable从类继承结构图可以看到,LinkedList 不仅实现了 List 接口,还实现了 Deque 双向队列接口。原理为了深入理

2020-05-10 19:24:14 197

原创 集合系列 List:ArrayList

ArrayList 是 List 集合的列表经典实现,其底层采用定长数组实现,可以根据集合大小进行自动扩容。public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable原理为了深入理解 ArrayList 的原理,我们将从类成员变量、构造方法、核心方法两个方面逐一介绍。类成员变量

2020-05-10 19:19:40 123

原创 集合框架概述

Java 集合是 Java API 用得最频繁的一类,掌握 Java 集合的原理以及继承结构非常有必要。总的来说,Java 容器可以划分为 4 个部分:List 集合Set 集合Queue 集合Map 集合除了上面 4 种集合之外,还有一个专门的工具类:工具类(Iterator 迭代器、Enumeration 枚举类、Arrays 和 Collections)在开始聊具体的集合体系之前,我想先介绍一下 Collection 框架的基本类结构。因为无论是 List 集合、Set 集合还是

2020-05-10 18:12:11 83

原创 为什么要学集合源码?

1.学习集合源码,能够让我们使用得更加准确。当我们深入学习了源码之后,我们就能够了解其特性,从而能够根据我们的使用场景去做出更好的选择,从而让我们的代码运行效率更高。我们举一个最简单的例子 —— ArrayList 和 LinkedList。它们两者底层采用了完全不同的实现方式,ArrayList 使用数组实现,而 LinkedList 则使用链表实现。这使得 ArrayList 的读取效率高,而 LinkedList 的读取效率低。但因为 LinkedList 采用链表实现,所以其增加和删除比较方便,

2020-05-10 18:00:57 245

空空如也

空空如也

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

TA关注的人

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