自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(199)
  • 资源 (2)
  • 收藏
  • 关注

原创 【Head First 设计模式】-- 观察者模式

观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变时,他的所有依赖者都会收到通知并自动更新。类图主题与观察者之间松耦合当两个对象之间松耦合,它们依然可以交互,但是不太清楚彼此的细节。观察者模式提供了一种对象设计,让主题和观察者之间松耦合。关于观察者的一切,主题只知道观察者实现了某个接口(也就是Observer接口)。主题不需要知道观察者的具体类是谁、做了些什么或其他任何细节。任何时候我们都可以增加新的观察者。

2023-11-05 16:42:27 6064 73

原创 【Head First 设计模式】-- 策略模式

Head First设计模式》使用鸭子举例,从一开始简单的封装实现鸭子游泳、叫的行为,到后来行为的添加之后导致现有设计的弹性不足(可复用、可扩展、可维护能力大大折扣),作者将OO基础&原则结合起来,设计一个应对鸭子行为添加时弹性较大的系统,这种模式称之为策略模式。首先考虑利用接口定义行为,特殊的鸭子实现特定的接口,来达到具备某种能力的目的。而最终的这个系统运用的就是策略模式,它将算法族与使用算法的客户独立开来,可以相互替换(我可以在运行时让鸭子会叫,也可以让它不会叫)如果产品要求有的鸭子是会飞的。

2023-11-05 14:56:10 453 3

原创 【每天一道算法题】day2-选择排序

【代码】【每天一道算法题】day2-选择排序。

2023-09-10 15:38:14 92

原创 【每天一道算法题】day2-认识时间复杂度

一个操作如果和样本的数据量没有关系,每次都是固定时间内完成的操作,叫做常数操作。时间复杂度为一个算法流程中,常数操作数量的一个指标。常用O(读作big O)来表示。具体来说,先要对一个算法流程非常熟悉,然后去写出这个算法流程中,发生了多少常数操作,进而总结出常数操作数量的表达式。评价一个算法流程的好坏,先看时间复杂度的指标,然后再分析不同数据样本下的实际运行时间,也就是“常数项时间”。,剩下的部分如果为f(N),那么时间复杂度为O(f(N))。

2023-09-10 15:29:01 347

原创 【每天一道算法题】day1-数组,给定一个数组,表示连续n天的股价,数组下标表示第几天

【代码】每天一道算法题code1-数组,给定一个数组,表示连续n天的股价,数组下标表示第几天。

2023-09-05 21:57:55 102

原创 Java程序死锁问题定位与解决

一、概述死锁是指两个或两个以上的进程在执行过程中,因争抢资源而造成的一种互相等待的现象,若无外力干涉它们将无法推进,如果系统资源充足,进程的资源请求能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。死锁产生的原因:【1】系统资源不足;【2】资源分配不当;【3】进程运行推进的顺序不合适;形成死锁的四个必要条件:**【1】互斥条件:**一个资源每次只能被一个进程使用。**【2】请求与保持条件:**一个进程因请求资源而阻塞时,对已获得的资源保持不放。**【3】不剥夺条件:*

2021-05-12 00:13:30 281 1

转载 RabbitMQ存储和队列结构

了解一些 RabbitMQ 的实现原理也是很有必要的,它可以让你在遇到问题时能透过现象看本质。比如一个队列的内部存储其实是由5个子队列来流转运作的,队列中的消息可以有4种不同的状态等,通过这些可以明白在使用 RabbitMQ 时尽量不要有过多的消息堆积,不然会影响整体服务的性能。存储机制RabbitMQ存储层包含两个部分:队列索引和消息存储。RabbitMQ消息有两种类型:持久化消息和非持久化消息,这两种消息都会被写入磁盘。持久化消息在到达队列时写入磁盘,同时会内存中保存一份备份,当内存吃紧时.

2021-05-06 23:38:40 466

原创 SpringCloud Ribbon 负载均衡

Spring Cloud Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡工具。可以将面向服务的 REST 模板请求自动转化成客户端负载均衡的服务调用。Spring Cloud Ribbon 虽然是一个工具类框架,但它不像服务注册中心、配置中心、API网关那样需要独立部署。但是它几乎存在于每一个 Spring Cloud 构建的微服务和基础设置中。因为微服务间的调用,API 网关的请求转发等内容,实际上都是通过 Ribbon 来实现的,包括 Feign 它也是基于 Ribbon 实现的工具。

2021-05-05 15:09:09 197

转载 聊聊IO多路复用之select、poll、epoll详解

IO多路复用之select、poll、epoll详解IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。IO多路复用适用如下场合:当客户处理多个描述符时(一般是交互式输入和网络套接口),必须使用I/O复用。当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现。如果一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般也要用到I/O复用。如果一个服务器即要处理TCP,又要处理UDP,一般要使用I/O复用。如果一个服务器要处理多个服务或多个协议,

2021-05-03 22:17:50 189

原创 Redis 线程模型

一、概述【1】Redis 是基于 Reactor模式开发的网络事件处理器:这个处理器被称为文件事件处理器(file event handler),这个文件事件处理器是单线程的,所以 Redis 才叫做单线程的模型:■ 文件事件处理器使用 I/O 多路复用(multiplexing)机制监听多个套接字 Socket,根据 Socket 上的事件来选择对应的事件处理器进行处理。■ 当被监听的套接字准备好执行连接应答(accept)、读取(read)、写入(write)、关闭(close)等操作时。与操作

2021-05-03 20:56:01 178

原创 AQS 锁核心类详解

AQS(AbstractQuenedSynchronizer 抽象队列同步器) 是一个用来构建锁和同步器的框架,使用 AQS能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的ReentrantLock,Semaphore,其他的诸如 ReentrantReadWriteLock,SynchronousQueue,FutureTask等等皆是基于 AQS的。AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架。当然,我们自己也能利用 AQS非常轻松容易地构造出符合我们自己需求

2021-04-27 23:38:02 296

原创 ReentrantLock 锁详解

ReentrantLock 支持公平锁和非公平锁,可重入锁 ReentrantLock的底层是通过 **AQS[链接]**实现。一、BAT 大厂的面试题**【1】**什么是可重入,什么是可重入锁? 它用来解决什么问题?【2】ReentrantLock 的核心是 AQS,那么它怎么来实现的,继承吗? 说说其类内部结构关系。【3】ReentrantLock 是如何实现公平锁的?【4】ReentrantLock 是如何实现非公平锁的?【5】ReentrantLock 默认实现的是公平还是非公平锁.

2021-04-27 23:13:55 3043 7

原创 Synchronized原理分析

Synchronized原理分析加锁和释放锁的原理深入JVM看字节码,创建如下的代码:1 public class SynchronizedDemo2 {2 Object object = new Object();3 public void method1() {4 synchronized (object) {5 6 }7 }8 }使用 javac命令进行编译生成 .class文件>javac Synchronize

2021-04-25 20:17:54 247

原创 Redis 基础数据结构

Reids 所有的数据结构都以唯一的 key 字符串作为名称,然后通过这个唯一的 key 值来获取相应的 value 数据。不同的数据结构差异就在于 value 的结构不一样。*一、*Redis 五大数据类型【1】String(字符串):String 是 Redis 最基本的类型,一个 key 对应一个 value。String 类型是二进制安全的。意思是 Redis 的 String 可以包含任何数据。一个键最大能存储 512MB。【2】Hash(哈希):Hash 是一个键值对集合,类似 Ja.

2021-04-22 23:24:09 640 8

原创 用 Java 自己实现一个 LRU

LRU(Least Recently Used:最近最少使用):简单的说,就是保证基本的 Cache容量,如果超过容量则必须丢掉最不常用的缓存数据,再添加最新的缓存。每次读取缓存都会改变缓存的使用时间,将缓存的存在时间重新刷新。其实,就是清理缓冲的一种策略。我们可以通过双向链表的数据结构实现 LRU Cache,链表头(head)保存最新获取和存储的数据值,链表尾(tail)既为最不常使用的值,当需要清理时,清理链表的 tail 即可,并将前一个元素设置为tail。结构图如下:[外链图片转存失败,源站可

2021-04-20 19:24:11 200

原创 MySQL 查询执行的过程

查询的生命周期大致可以按照顺序来看:从客户端到服务端,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端。其中 “执行” 可以认为是整个生命周期中最重要的阶段,其中包括了大量为了检索数据到存储引擎的调用以及调用后的数据处理,包括排序分组等。当希望 MySQL 能够以高性能的方式运行查询时,最好的办法就是弄清楚 MySQL 是如何优化和执行查询的。MySQL 执行一个查询的过程,如下:【1】首先我们会连接到这个数据库上,这时候接待你的就是连接器。连接器负责跟客户端建立连接、获取权限、维持和管理

2021-04-19 23:16:49 207

原创 MyBatis缓存机制

前言MyBatis是常见的Java数据库访问层框架。在日常工作中,开发人员多数情况下是使用MyBatis的默认缓存配置,但是MyBatis缓存机制有一些不足之处,在使用中容易引起脏数据,形成一些潜在的隐患。个人在业务开发中也处理过一些由于MyBatis缓存引发的开发问题,带着个人的兴趣,希望从应用及源码的角度为读者梳理MyBatis缓存机制。本次分析中涉及到的代码和数据库表均放在GitHub上,地址: mybatis-cache-demo 。目录本文按照以下顺序展开。一级缓存介绍及相关配置。一

2021-04-19 23:16:05 176

原创 MyBatis 整体架构【包含 SQL执行流程】

Mybatis 的整体架构分为三层,分别是基础支持层、核心处理层和接口层。基础支持层为核心处理层的功能提供了良好的支撑。一、接口层在不与 Spring 集成的情况下,使用 MyBatis 执行数据库的操作主要如下:InputStream is = Resources.getResourceAsStream("myBatis-config.xml");SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();SqlSess

2021-04-19 23:14:44 149

原创 Java NIO浅析

NIO(Non-blocking I/O,在Java领域,也称为New I/O),是一种同步非阻塞的I/O模型,也是 I/O多路复用的基础,已经被越来越多地应用到大型应用服务器,成为解决高并发与大量连接、I/O处理问题的有效方式。那么NIO的本质是什么样的呢?它是怎样与事件模型结合来解放线程、提高系统吞吐的呢?本文会从传统的阻塞I/O和线程池模型面临的问题讲起,然后对比几种常见 I/O模型,一步步分析NIO怎么利用事件模型处理I/O,解决线程池瓶颈处理海量连接,包括利用面向事件的方式编写服务端/客户

2021-04-19 22:46:05 110

原创 ThreadLocal 类

ThreadLocal 并不是一个Thread,而是 ThreadLocalVariable(线程局部变量)。也许把它命名为 ThreadLocalVar更加合适。线程局部变量就是为每一个使用该变量的线程都提供一个变量值的副本,是 Java中一种较为特殊的线程绑定机制,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。ThreadLocal是除了加锁这种同步方式之外的另一种保证多线程访问出现线程不安全的方式。从线程的角度看,每个线程都保持一个对其线程局部变量副本的隐式引用,只要线程是活动

2021-04-19 22:41:55 211

原创 订单付款倒计时实现方案

当使用 12306 抢票成功后,就会进入付款界面,这个时候就会出现一个订单倒计时,下面我们就对付款倒计时的功能实现,进行深入学习和介绍,界面展示如下:[外链图片转存失败,源站可能如何实现付款及时呢,首先用户下单后,存储用户的下单时间。下面介绍四种系统自动取消订单的方案:一、DelayQueue 延时无界阻塞队列我们的第一反应是用 数据库轮序+任务调度 来实现此功能。但这种高效率的延迟任务用任务调度(定时器)实现就得不偿失。而且对系统也是一种压力且数据库消耗极大。因此我们使用 Java 延迟队列.

2021-04-19 19:52:49 1474 1

原创 Nacos 配置中心的实现及原理

什么是 NacosNacos 是阿里发起的开源项目,地址:https://github.com/alibaba/nacos。Nacos 主要提供两种服务,一是配置中心,支持配置注册、变更下发、层级管理等,意义是不停机就可以动态刷新服务内部的配置项;二是作为命名服务,提供服务的注册和发现功能,通常用于在 RPC 框架的 Client 和 Server 中间充当媒介,还附带有健康监测、负载均衡等功能。本文聚焦于 Nacos 的第一块功能,即配置中心的实现。先叙述一个配置中心通常需要哪些组成部分,再结合 Na

2021-04-18 14:56:58 1874

原创 MySQL 中 explain关键字

explain关键字可以模拟优化器执行 SQL 查询语句,从而知道 MySQL 是如何处理 SQL 语句的。分析查询语句或表结构的性能瓶颈。执行语句:explain + SQL语句。表头信息如下:|一、ID 参数select 查询的序列号,包含一组数字,表示查询中执行 select 子句或操作表的顺序。三种情况:【1】**id 相同:**执行顺序由上而下;explain select t2.* from t1,t2,t3 where t1.id = t2.id and t1.id = t3..

2021-04-17 19:42:22 245 1

原创 MySQL 主从复制的问题及解决方案

复制功能是构建 MySQL 的大规模、高性能的基础,也就是所谓的 “水平扩展” 架构。我们可以通过为服务器配置一个或多个备库。同时,复制也是高可用性、可扩展性、灾难恢复、备份以及数据仓库等工作的基础。MySQL主从基本原理,主要形式以及主从同步延迟原理 (读写分离)导致主库从库数据不一致问题的及解决方案。一、复制概述复制解决的基本问题是让一台服务器的数据与其他服务器保持同步。一台主库的数据可以同步到多台备库上,备库本身也可以被配置成另外一台服务器的主库。通过复制可以将读操作指向备库来获得更好的读扩展,

2021-04-17 16:23:13 454 1

原创 Java 注解机制

注解是 JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。它主要的作用有以下四方面:**【1】生成文档:**通过代码里标识的元数据生成 javadoc文档。**【2】编译检查:**通过代码里标识的元数据让编译器在编译期间进行检查验证。**【3】编译时动态处理:**编译时通过代码里标识的元数据动态处理,例如动态生成代码。**【4】运行时动态处理:**运行时通过代码里标识的元数据动态处理,例如使用反射注入实例。这么来说是比较抽象的,我们具体

2021-04-13 20:59:41 180

原创 Java 反射机制

反射(Reflection)被视为动态语言的关键,反射机制允许程序在执行期间借助于 Reflection API 取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。反射是一种功能强大且复杂的机制。使用它的主要人员是工具构造者,而不是应用程序员。如果仅对设计应用程序感兴趣,而对构造工具不感兴趣,就没有学习的必要。一、反射机制提供的功能(什么时候会用到反射)【1】在运行时判断任意一个对象所属的类。【2】在运行时构造任意一个类的对象。【3】在运行时判断任意一个类所具有的成员变量和方法。【.

2021-04-13 20:47:54 61

原创 Java开发人员犯的10大错误

一、将数组转换为ArrayList要将数组转换为ArrayList,开发人员通常会这样做:List<String> list = Arrays.asList(arr);Arrays.asList()将返回 ArrayList私有静态类的Arrays,而不是java.util.ArrayList类。该java.util.Arrays.ArrayList有set(),get(),contains()方法,但没有添加元素的任何方法,所以它的大小是固定的。要创建一个real ArrayList

2021-04-13 20:42:47 62

原创 Redlock(redis分布式锁)原理分析

Redlock(redis分布式锁)原理分析Redlock:全名叫做 Redis Distributed Lock;即使用redis实现的分布式锁;使用场景:多个服务间保证同一时刻同一时间段内同一用户只能有一个请求(防止关键业务出现并发攻击);官网文档地址如下:https://redis.io/topics/distlock这个锁的算法实现了多redis实例的情况,相对于单redis节点来说,优点在于 防止了 单节点故障造成整个服务停止运行的情况;并且在多节点中锁的设计,及多节点同时崩溃等各种意外情

2021-04-13 11:15:47 232

转载 Spring事务失效的8种原因

Spring事务失效的 8种原因1、数据库引擎不支持事务这里以 MySQL 为例,其 MyISAM 引擎是不支持事务操作的,InnoDB 才是支持事务的引擎,一般要支持事务都会使用 InnoDB。根据 MySQL 的官方文档:https://dev.mysql.com/doc/refman/5.5/en/storage-engine-setting.html从 MySQL 5.5.5 开始的默认存储引擎是:InnoDB,之前默认的都是:MyISAM,所以这点要值得注意,底层引擎不支持事务再怎么

2021-04-12 23:58:06 132

原创 2PC(两阶段提交)【XA 与 Seata方案】

一、概述2PC(two phase commit protocol,2PC)即两阶段提交协议,是将整个事务流程分为两个阶段,准备阶段(Prepare phase)、提交阶段(Commit phase),2指两个阶段,P指准备阶段,C指提交阶段。整个事务过程由事务管理器和参与者组成,事务管理器负责决策整个分布式事务的提交和回滚,事务参与者负责自己本地事务的提交和回滚。在计算机中部分关系数据库如 Oracle、MySQL 都支持两阶段提交协议。下面是计算机数据库进行两阶段提交的说明:【1】准备阶段(Pre

2021-04-11 23:29:25 631

原创 线程池核心线程数参数配置

线程池参数配置1.根据list大小创建核心线程数 最大不超过5个int poolSize = Math.min(model.getXProductInfoList().size(), 5);2.写死new ThreadPoolExecutor(2, 3, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(10));CompletableFuture.runAsync(() -> asynProcessXProductRe

2021-04-01 23:17:48 994

原创 java字符串反转的几种方式

方法一 调用StringBuffer中的reverse方法public static String reverse(String s) { return new StringBuffer(s).reverse().toString();}方法二:双指针class Solution { public void reverseString(char[] s) { int n = s.length; for (int left = 0, right =

2021-04-01 20:34:53 99

转载 Spring Cloud-Feign设计原理

Spring Cloud-Feign设计原理2019-05-25阅读 1.4K0​ 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://louluan.blog.csdn.net/article/details/82821294什么是Feign?Feign 的英文表意为“假装,伪装,变形”, 是一个http请求调用的轻量级框架,可以以Java接口注解的方式调用Http请求,而不用像Java中通过封装HTTP请求报文的

2021-03-25 23:43:18 186

转载 基于redis实现分布式锁(SETNX和Redisson)(以扣减库存来当作案例)

一:实现原理:利用redis中的set命令来实现分布式锁。从Redis 2.6.12版本开始,set可以使用下列参数:SET KEY VALUE [EX seconds] [PX milliseconds] [NX|XX]EX second :设置键的过期时间为second秒。 SET key value EX second效果等同于SETEX key second value 。PX millisecond :设置键的过期时间为millisecond毫秒。 SET key value PX mi

2021-03-22 23:23:50 1456

转载 apollo 与 nacos 功能对比

apollo与nacos 都为目前比较流行且维护活跃的2个配置中心,笔者对nacos(1.1.4版本)与 apollo(2020.1月更新源码部署)版本从几个方面进行了详细的对比。一:界面对比在界面上对2个对比,个人感觉2者都差不多,nacos可能看起来比较简洁,直接把所有项目和配置都直接展示出来了,但是apollo再项目划分概念上就比较清晰,进入后首先需要选择项目,选择项目后跳转才可以看到里面的配置,在配置上与nacos不同,apollo将每个配置项都分开解析出来了,每个配置项都有单独的发布和未发

2021-03-22 22:50:24 8055

原创 Sentinel 流量控制

一、Sentinel 介绍Sentinel 是阿里巴巴出品的面向分布式服务架构的轻量级流量控制组件,主要以流量为切入点,从限流,流量整形、熔断降级、系统负载保护等多个维度来保障微服务的稳定性。主页地址SentinelHystrixresilience4j隔离策略信号量隔离(并发线程隔离)链接线程池隔离/信号量隔离信号量隔离熔断降级策略基于响应时间、异常比率、异常数基于异常比率基于异常比率、响应时间实时统计实现滑动窗口滑动窗口Ring Bit Buf

2021-03-21 15:36:57 451

转载 hashMap和ConcurrenHashMap底层实现

简介Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap,类继承关系如下图所示:下面针对各个实现类的特点做一些说明:(1) HashMap:它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。 HashMap最多只允许一条记录的键为null,允许多条记录的值为null。HashMap非线程安全,即任一时刻

2021-03-21 13:25:19 421

原创 Gateway 网关

Spring Cloud Gateway 作为 Spring Cloud框架的第二代网关,在功能上要比 Zuul更加的强大,性能也更好。随着 Spring Cloud的版本迭代,Spring Cloud官方有打算弃用 Zuul的意思。在笔者调用了 Spring Cloud Gateway的使用和功能上,Spring Cloud Gateway替换掉 Zuul的成本上是非常低的,几乎可以无缝切换。Spring Cloud Gateway几乎包含了 Zuul的所有功能。一、网关定义API 网关是一个.

2021-03-20 23:38:54 580

原创 SpringCloud Fegin 负载均衡

Spring Cloud Ribbon 和 Spring Cloud Hystrix 在微服务中实现了客户端负载均衡的服务调用以及通过断路器来保护微服务应用。这两者作为基础工具类框架广泛地应用在各个微服务的实现中,不仅包括我们自身的业务类微服务,也包括一些基础设置类微服务(比如网关)。在实践中,这两个框架的使用几乎是同时出现的。那么是否有更高层次的封装来整合这两个基础工具,有就是Spring Cloud Fegin。基于 Netflix Feign 实现,除了整合上面两个强大的功能之外,还提供了一种声明式.

2021-03-20 23:24:49 212

原创 Nacos 服务发现

一、Nacos 简介Nacos 是阿里的一个开源产品,它是针对微服务架构中的服务发现、配置管理、服务治理的综合型解决方案。Nacos 使服务更容易注册,并通过 DNS或 HTTP接口发现其他服务,Nacos还提供服务的实时健康检查,以防止向不健康的主机或服务实例发送请求;官网**为什么需要注册中心:**微服务可能是部署在云环境的,服务实例的网络位置或许是动态分配的。另外,每一个服务一般会有多个实例来做负载均衡,由于宕机或升级,服务实例网络地址会经常发生变动改变。再者,每一个服务也可能应对临时访问压力增

2021-03-20 22:55:38 1501

数据库代码生成器

根据数据库表生产相应代码,包括service,controller等前台等

2019-04-06

redis-3.0.0.tar

自己用了,可以用是3.0.0,这个是linux环境的。里面是tar包在linux环境解压。

2018-09-08

空空如也

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

TA关注的人

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