- 博客(51)
- 收藏
- 关注
原创 06.Redis缓存设计与优化
缓存穿透缓存穿透是指缓存和数据库都没有数据,导致请求落在数据库上,造成数据库短时间内承受大量请求而崩溃。造成缓存穿透的原因:系统业务代码或数据出现问题恶意攻击、爬虫等造成大量空命中解决方案:缓存空对象,并设置过期时间布隆过滤器(见后文)缓存雪崩缓存同一时间大面积的失效、缓存层支撑不住或宕机后,后面的所有请求都落在数据库上,造成数据库短时间压力巨大而崩掉。解决方案:针对缓存大面积失效:缓存数据设置随机过期时间,业务时间 + 随机时间缓存预热互斥锁针对缓存扛不住压力、宕
2022-02-21 23:52:53
488
原创 05.Redis 数据结构与BitMap的使用
Redis 基本特性非关系型的键值对数据库,可以根据键以O(1) 的时间复杂度取出或插入关联值Redis 的数据是存在内存中的键值对中键的类型可以是字符串,整型,浮点型等,且键是唯一的键值对中的值类型可以是string,hash,list,set,sorted set 等Redis 内置了复制,磁盘持久化,LUA脚本,事务,SSL, ACLs,客户端缓存,客户端代理(6.0新特性)等功能可以搭建 Redis 哨兵架构和 Redis Cluster 模式提供高可用性Redis的数据结构R
2022-02-21 23:51:18
736
原创 04.分布式锁及其原理
一、管道 与 Lua 脚本管道(Pipeline)客户端一次性发送多个请求,不用等待服务器响应,待所有脚本执行完成后一起响应。客户端用 pipeline 方式打包命令发送,redis必须在处理完所有命令前先缓存起所有命令的处理结果。打包的命令越多,缓存消耗内存也越多。pipeline 中发送的每个命令都会被 server 立即执行,如果执行失败,将会在此后的响应中得到信息,不会影响管道里面后续其他命令的执行。注意: 管道不是原子的,但 Redis 提供的批量操作命令(例如 MSET)是原子的Lua
2022-02-21 23:49:11
568
原创 03.Redis 集群架构
Redis 集群架构前面已经了解了哨兵架构,哨兵架构已经能满足许多一般会互联网情况下的需求,但是它也存在一下缺点:主节点宕机后,重新选举期间的几秒甚至几十秒是不可用的,而且只有一个节点作为写节点,撑死最大并发也就 10W作用。并且Redis最大内存不宜过大(10G)否则影响性能。那么什么是 Redis 集群呢?redis 集群是一个由多个主从节点群组成的分布式服务器群,它具有复制、高可用和分片特性。Redis 集群不需要 sentinel 哨兵,也能完成节点移除和故障转移的功能。需要将每个节点设置成集
2022-02-21 23:47:40
1686
原创 02.Redis持久化、主从复制与哨兵模式
一、Redis持久化RDB快照(snapshot)默认情况下, Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中。可以对 Redis 进行设置(save N M),让它在“ N 秒内数据集至少有 M 个改动 ”这一条件被满足时, 自动保存一次数据集(当前时刻的整个内存)为 RDB 文件。也可以进入 Redis 客户端,手动执行命令 save 或 bgsave 立即生成 dump.rdb 快照文件(默认存放路径为 dump.rdb)。如果需要关闭 RDB 快照,只需要将 redi
2022-02-21 23:38:59
662
原创 01.Redis数据类型及高性能原理
Redis 的五种数据结构及其应用场景Redis官方文档链接:https://redis.io/commands 中文文档:http://redisdoc.com/一、字符串命令解释SET key value存入字符串键值对MSET key value [key value …]批量存储字符串键值对SETNX key value存入一个不存在的字符串键值对GET key获取一个字符串键值MGET key [key …]批量
2022-02-21 23:35:14
1141
原创 并发编程-11.CompletableFuture 异步编排使用
CompletableFuture 异步编排Future 是 Java 5 添加的类,用来描述一个异步计算的结果。使用isDone方法检查计算是否完成,或者使用get阻塞住调用线程,直到计算完成返回结果,你也可以使用cancel 方法停止任务的执行。在 Java 8 中, 新增加了一个类: CompletableFuture,它实现了 Fucture 接口,提供了非常强大的 Future 的扩展功能,简化异步编程的复杂性,提供了函数式编程的能力,可以 通过回调的方式处理计算结果,并且提供了转换和组合 C
2021-12-30 22:58:24
396
原创 Elasticsearch入门
安装elasticsearch 与可视化工具 kibana 版本必须对应,配置好Xms和Xmx,大小要合适,elasticsearch 是将会将数据放置在内存中,所以一般都是集群搭建基本命令GET /_cat/nodes:查看所有节点 __GET /_cat/health:查看 es 健康状况GET /_cat/master:查看主节点 __GET /_cat/indices:查看所有索引基本概念索引 Index:相当于数据库中的 database类型 Type:在 Index(索
2021-12-25 17:27:28
1768
原创 05.SpringAOP使用与源码解析
Spring思维导图SpringAOP切面解析流程图SpringAOP创建代理流程图AOP (Aspect Oriented Programming)AOP 面向切面编程,要实现的是在我们原来写的代码的基础上,进行一定的包装,如在方法执行前、方法返回后、方法抛出异常后等地方进行一定的拦截处理或者叫增强处理。AOP 的实现并不是因为 Java 提供了神奇的钩子,可以把方法的几个生命周期告诉我们,而是我们要实现一个代理,实际运行的实例其实是生成的代理类的实例。AOP 术语解释切面(Aspect):
2021-12-12 23:54:41
496
原创 04.Spring监听器
Spring思维导图Spring事件Spring事件体系包括三个组件:事件,事件监听器,事件广播器首先需要了解什么是:观察者模式事件Spring 内置事件Event说明ContextRefreshedEvent当容器被实例化或refreshed时发布.如调用refresh()方法, 此处的实例化是指所有的bean都已被加载,后置处理器都被激活,所有单例bean都已被实例化, 所有的容器对象都已准备好可使用. 如果容器支持热重载,则refresh可以被触发多次(XmlWeb
2021-12-12 23:43:32
473
原创 责任链模式
责任链模式避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。值得注意的是:责任链可能是一条直线、一个环链或者一个树结构的一部分。职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递。从而避免请求发送者与接收者的耦合。角色抽象处理者角色:定义出一个处理请求的接口或抽象类。如果有需要,接口可以定义出一个方法以设定和返回对下家的引用具体处理者角色: 具体处理者接到请求后,可
2021-12-07 20:04:24
366
原创 观察者模式
观察者模式定义: 多个对象间存在一对多关系,当一个对象发生改变时,把这种改变通知给其他多个对象, 从而影响其他对象的行为优点:观察者和被观察者是抽象耦合的设置了一套触发机制缺点:如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知是比较耗时的观察者和被观察者如果存在循环依赖,会触发它们之间进行循环调用,可能导致系统崩溃无法知道目标是如何发生变化的,仅仅只能了解到其发生了变化使用场景:一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发
2021-12-07 20:02:40
339
原创 观察者模式
监听器定义: 多个对象间存在一对多关系,当一个对象发生改变时,把这种改变通知给其他多个对象, 从而影响其他对象的行为优点:观察者和被观察者是抽象耦合的设置了一套触发机制缺点:如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知是比较耗时的观察者和被观察者如果存在循环依赖,会触发它们之间进行循环调用,可能导致系统崩溃无法知道目标是如何发生变化的,仅仅只能了解到其发生了变化使用场景:一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改
2021-11-23 22:53:28
326
原创 装饰者模式详解
装饰者模式动态的给对象增加一些职责,即增加其额外的功能。就功能而言更加灵活,可以作为继承的替代。优点: 装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能缺点: 多层装饰比较复杂使用场景:扩展一个类的功能动态增加功能,动态撤销使用实例:Java I/O Streams 、实现现在有一幢大房子,只是毛坯房,开始给他进行装修被装饰者public interface House { /** * 装修墙
2021-11-18 22:29:03
380
原创 适配器模式详解
适配器模式将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作分类: 类适配器、对象适配器优点:可以让任何两个没有关联的类一起运行提高了类的复用增加了类的透明度灵活性好缺点:过多地使用适配器,会让系统非常零乱,不易整体进行把握。(例如我调用的命名是A接口,其内部却被适配成了B接口的实现)使用场景:系统需要使用现有的类,而此类的接口不符合系统的需要通过接口转换,将一个类插入另一个类系中有动机地修改一个正常运行的系统的接口使用第
2021-11-18 22:27:38
371
原创 代理模式详解
代理模式为某个对象提供一个代理,从而控制这个代理的访问。代理类和委托类具有共同的父类或父接口。在任何使用委托类对象的地方都可以使用代理类对象替代。代理类负责请求的预处理、过滤等,将请求分配给委托类处理、以及委托类处理完请求的后续处理。代理模式角色:Subject 抽象主题角色抽象主题类可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求。RealSubject 具体主题角色也叫做被委托角色、被代理角色。它才是冤大头,是业务逻辑的具体执行者。Proxy 代理主题角色也叫
2021-11-18 22:25:13
573
原创 原型模式详解
原型模式定义: 用于创建重复的对象,同时又能保证性能。用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。使用场景:资源优化性能和安全要求的场景通过 new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用原型模式很少单独出现,一般和工厂方法模式配合使用,原型模式 clone 对象,工厂方法提供调用使用条件:必须实现 Cloneable 接口。在
2021-11-06 16:57:03
202
原创 建造者模式
建造者模式定义: 将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成不同复杂对象优点:建造者独立,易扩展。便于控制细节风险。缺点:产品必须有共同点,范围有限制内部变化复杂,就会有很多的建造类使用场景:对象具有复杂的内部结构对象内部属性本身相互依赖角色Builder:为创建一个产品对象的各个部件指定抽象接口ConcreteBuilder:实现了 Builder 接口,实现各个部件的具体构造和装配方法,定义并明确它所创建的
2021-11-06 16:54:05
169
原创 并发编程-10.Fuctur,Callable,Thread,ForkJoin,Disruptor
一、任务性质类型CPU密集型(CPU-bound)CPU 密集型也叫计算密集型,指的是系统的硬盘、内存性能相对 CPU 要好很多,此时,系统运作大部分的状况是 CPU Loading 100%,CPU 要读/写 I/O(硬盘/内存),I/O 在很短的时间就可以完成,而 CPU 还有许多运算要处理,CPU Loading 很高。特点:要进行大量的计算,消耗CPU资源,比如计算圆周率、对视频进行高清解码等等,全靠CPU的运算能力。线程数一般设置为: 线程数 = CPU核数+1 (现代CPU支持超线程)
2021-10-25 23:26:52
276
原创 并发编程-09.Executor线程池原理与源码解析
一、线程调度CPU资源的最小单位,线程模型分为KLT模型与ULT模型,JVM使用的KLT模 型,Java线程与OS线程保持1:1的映射关系,也就是说有一个java线程也会在操作系统里有 一个对应的线程。详见前面的文章。Java线程的生命状态 :NEW,新建RUNNABLE,运行BLOCKED,阻塞WAITING,等待TIMED_WAITING,超时等待TERMINATED,终结线程状态转换图二、协程协程 (纤程,用户级线程),目的是为了追求最大力度的发挥硬件性能和提升软件的速度,
2021-10-17 15:21:14
197
原创 并发编程-08.HashMap等集合
HashMap数据结构JDK 1.6 数组 + 链表JDK 1.8 开始 数组 + 链表 + 红黑树引入链表结构解决hash冲突,JDK1.8开始采用尾插法(1.8以前头插法),链表时间复杂度O(n)hash 并不是采用取模(%)运算,而是采用位&运算,从效率上来讲,位运算效率远高于%取模运算,位运算是最接近机器能识别的语言虽然引入了红黑树,解决了链表成环问题,但效率并未得到大的提升,在数据量较小的时候效率甚至会更低,在数据量较大的时候效率大概有 5-10% 的提升HashMap容
2021-09-29 22:18:12
205
原创 抽象工厂模式
定义: 围绕一个超级工厂创建其他工厂。该超级工厂能创建其他工厂。接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。优点: 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。抽象工厂提供了一个接口,用于从产品系列的每个类创建对象。只要你的代码通过此接口创建对象,你就不必担心创建与你的应用程序已创建的产品不匹配的错误产品变体。缺点: 产品族扩展非常困难,要添加某一产品族的产品时,需要修改和添加的地方较多。使用场景:
2021-09-25 20:20:46
115
原创 并发编程-07.Atominc 原子包及 Unsafe 魔法类
一、Atominc 原子包在 Atomic 包中有12个类,四种原子更新方式,分别是原子更新基本类型、数组、引用和字段。Atomic 包里的类基本都是使用 Unsafe 实现的包装类。基本类: AtomicInteger、AtomicLong、AtomicBoolean引用类型: AtomicReference、AtomicReference的ABA实例、AtomicStampedRerence、AtomicMarkableReference数组类型: AtomicIntegerArray、Atom
2021-09-24 00:36:58
222
原创 并发编程-06.并发工具类
SemaphoreSemaphore 字面意思是信号量的意思,它的作用是控制访问特定资源的线程数目,通过协调各个线程,以保证合理的使用资源。底层依赖 AQS 的状态 State,是在生产当中比较常用的一个工具类。使用场景常用于资源有明确访问数量限制的场景,常用于限流,可实现熔断、降级等处理 。例如:数据库连接池,连接不能超过限制数量,当连接达到了限制数量后,后面的线程只能排队等前面的线程释放了数据库连接才能获得数据库连接。例如:某些排队场景,能够容纳同时在线人数有限,超过后只能排队等待。例如:资
2021-09-17 21:15:43
145
原创 并发编程-05.阻塞队列BlockingQueue详解
队列的类型无限队列(unbounded queue) 无容量限定,只随存储变化有限队列(bounded queue) 定义了最大容量向无限队列添加元素的所有操作都将永远不会阻塞(也是线程安全的),,因此它可以增长到非常大的容量。 使用无限阻塞队列BlockingQueue 设计生产者 - 消费者模型时最重要的是消费者应该能够像生产者向队列添加消息一样快地消费消息 。否则可能内存不足而抛出OutOfMemory 异常。数据结构1.通常使用链表或数组实现2.一般具有 FIFO(先进先出) 特性,
2021-09-14 23:14:28
527
原创 简单(静态)工厂模式
定义: 定义了一个创建对象的类,由这个类来封装实例化对象的行为。优点:①产品的创建交给了工厂类,客户端无需自己创建产品,只需要提供对应的参数。工厂和产品的职责区分明确。②客户端无需知道所创建具体产品的类名,只需知道参数即可。③也可以引入配置文件(比如解析XML等),在不修改客户端代码的情况下更换和添加新的具体产品类。缺点:①工厂类单一,负责所有产品的创建,职责过重,一旦异常,整个系统将受影响。且工厂类代码会非常臃肿,违背高内聚责任分配原则。②使用简单工厂模式会增加系统中类的个数(引入新
2021-09-12 16:51:37
305
原创 Java经典排序方法图解及代码实现
常见的排序算法有:冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序等。冒泡排序 O(n2 )它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成排序过程比较相邻的元素。如果第一个比第二个大,就交换它们两个对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在 最后的元素应该会是最大的数针对所有的元素重复以上的步骤,除了最后一个重复步骤1~3,直到排序完成
2021-09-11 17:19:18
171
原创 单例模式详解
单例模式详解定义: 一个类最多只有一个实例,并提供一个全局访问点。就好像我们的Windows 系统的任务管理器,你只能开一个,不能开多个。单例模式的种类: 懒汉式 和 饿汉式实现的必要条件: 私有化构造、静态全局访问暴力破解: 反射1.饿汉式单例public class SingletonHungry { private SingletonHungry(){}; private static final SingletonHungry INSTANCE = new Singlet
2021-09-11 00:55:04
319
原创 23 种设计模式-持续更新中
总原则-开闭原则对扩展开放,对修改封闭。在程序需要进行拓展的时候,不能去修改原有的代码,而是要扩展原有代码,实现一个热插拔的效果。想要达到这样的效果,接口,抽象类等都是必不可少的。1、单一职责原则每个类应该实现单一的职责,不要存在多于一个导致类变更的原因,否则就应该把类拆分。2、里氏替换原则(Liskov Substitution Principle)任何基类可以出现的地方,子类一定可以出现。里氏替换原则是继承复用的基石,只有当衍生类可以替换基类,软件单位的功能不受到影响时,基类才能真正被复用
2021-09-09 23:15:58
169
原创 并发编程-04. AQS 与 Lock 源码详解
1.什么是 AQS? AQS(AbstractQueuedSynchronizer) 定义了一套多线程访问共享资源 的同步器框架,是一个依赖状态(state)的同步器。Java 并发编程的核心包 java.concurrent.util 下的大多数同步器都是基于 AQS 实现的,例如:Latch,Barrier,BlockingQueue等。1.1.AQS 具备的特性阻塞等待队列共享/独占公平/非公平可重入允许
2021-09-08 00:11:06
358
原创 并发编程-03.synchronized详解
1.设计同步器的意义 临界资源: 多线程中的共享、可变资源。这种资源可能是: 对象、变量、文件等。所以需要采用同步机制来协同对对象可变状态的访问。共享:资源可以由多个线程同时访问可变:资源可以在其生命周期内被修改1.1.如何解决线程并发安全问题?解决方案: 序列化访问临界资源,即:同一时刻只能有一个线程访问临界资源(同步互斥访问)。Java 提供的两种方式:synchronized 和 Locksynchro
2021-09-06 00:09:54
169
原创 MySQL-04.MySQL的MVCC机制与BufferPool缓存机制
1.MVCC(多版本并发控制)机制 MySQL在默认的可重复读保证了事务较高的隔离性,同样的一条查询SQL,在一个事务中,多次执行查询即使其他事务已提交的修改也不会影响当前事务SQL的查询结果。这种隔离性就是依靠MVCC(Multi-Version Concurrency Control)机制来实现的(可串行化是加互斥锁)。MySQL在读已提交和可重复读隔离级别下都实现了MVCC机制。通过MVCC机制避免了频繁加
2021-08-28 20:03:49
187
原创 MySQL-02.索引优化实例
1.数据准备#1.建立员工表,并创建name,age,position索引,id为自增主键CREATE TABLE `employees` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(24) NOT NULL DEFAULT '' COMMENT '姓名', `age` int(11) NOT NULL DEFAULT '0' COMMENT '年龄', `position` varchar(20) NOT NULL DE
2021-08-22 23:45:54
448
原创 MySQL-01.深入理解MySQL底层数据结构
一.索引 什么是索引?索引的本质就是一种排好序数据结构。 数据库中的列存在磁盘上,存储不是连续的,索引记录着这些列在磁盘上的位置(地址)。同时,索引也存储在磁盘上。1.索引的数据结构 二叉树 红黑树 Hash B-Tree B+Tree推荐一个数据结构在线演示网https://www.cs.usfca.edu/~galle
2021-08-14 21:31:47
618
原创 JVM-05.JVM调优工具及调优方法
1.jps工具作用: 查看当前系统中有哪些JAVA进程2.jmap工具来查看内存信息,实例个数以及占用内存大小文件较长,可以输出为对应的文件,也可以直接查看num:序号instances:实例数量bytes:占用空间大小class name:类名称,[C is a char[],[S is a short[],[I is a int[],[B is a byte[],[[I is a int[][]查看堆内存占用情况(jmap -heap +进程id)堆内存dump生成堆du
2021-08-05 00:05:17
723
原创 JVM-03.对象创建与内存分配
1.对象创建的流程#mermaid-svg-mHg9UcWC9IwBJKoN .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-mHg9UcWC9IwBJKoN .label text{fill:#333}#mermaid-svg-mHg9UcWC9IwBJKoN .node rect,#mermaid-svg-
2021-07-25 23:16:09
354
原创 JVM-01.JVM类加载机制
验证:验证格式是否正确、是否符合Java语言规范等准备:给类的静态变量分配内存,并赋默认值(非指定的值)解析:将符号引用替换为直接引用(内存地址),该阶段会把一些静态方法(符号引用)替换为数据锁住内存的指针或句柄等(直接引用)。–静态链接过程(类加载期间完成),动态链接程序运行期间将符号引用替换为直接引用初始化:对类的静态变量初始化为指定的值,执行静态代码块调用销毁类加载器(实质是类)引导类加载器BootStrapClassLoader:加载支撑JVM运行的位于JRE的lib目录下的核心类库(
2021-07-20 21:50:23
337
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人