自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

让~学习~成为一种习惯(橡 皮 人の技术博客)

未来的你,一定会感谢现在努力拼搏的自己!

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

原创 23种设计模式学习导航(Java完整版)

本篇文章是作者对23种设计模式学习的一个总结,包含设计模式的三大分类(创建型5种,结构型7种,行为型11种)和七个面向对象设计原则,为了方便大家学习,现将23种设计模式的连接进行了整理,希望对大家有所帮助。ps:后续会带来设计模式的组合使用,敬请期待。

2023-06-04 23:02:08 4255 3

原创 Redis第14讲——Redis实现分布式锁(Redission源码解析)

在多线程环境下,为了保证数据的线程安全,我们通常用加锁的方式,使同一时刻只有一个线程可以对这个共享资源进行操作,在单服务系统我们常用JVM锁——Synchronized、ReentrantLock等。然而在多台服务系统的情况下,JVM锁就无法在多个服务器之间生效了,这时候我们就需要用分布式锁来解决线程安全的问题。分布式锁的实现方式有很多,主流的就是基于数据库、zookeeper以及redis,当然使用redis的居多,由于篇幅原因,本节就详细介绍一下使用redis实现分布式锁的几种方式。

2024-04-25 07:30:00 821

原创 Redis第13讲——缓存不一致问题四种解决方案

​上篇文章介绍了缓存常用的三种设计模式,并且对使用最广泛的Cache Aside Pattern进行了深入的探讨,在比较先操作数据库or先操作缓存、删除缓存or更新缓存之后发现,先操作数据库再删除缓存是最优的选择,但是依然存在数据一致性问题,那么,本章在“先操作数据库再删除缓存”这种方案的基础上,给出3个更加完备的方案来解决缓存于数据库一致性问题。

2024-04-18 07:30:00 647

原创 Redis第12讲——缓存的三种设计模式

缓存的使用在项目中是极其常见的,如果使用得当,缓存可谓时提升系统性能的最简单方法之一,反之则会出现一些莫名其妙的问题,在不同场景下,所使用的缓存策略也是有所变化的,下面我们就介绍一下三种常见的缓存设计模式——Cache Aside Pattern(重点)、Read/Write Through Pattern、Write Behind Caching Pattern。

2024-04-11 07:30:00 683

原创 Redis第11讲——Redis集群脑裂问题

在Redis集群中,每个节点的部署方式一般都是【一主多从】,主节点提供写操作,从节点提供读操作。如果主节点此时发生网络故障,与从节点断开连接了,但主节点与客户端是正常的,客户端依旧向主节点写入数据。这时哨兵节点发现主节点有故障失联了,于是哨兵节点就会从 从节点选出一个leader作为新主节点,这时脑裂就出现了。

2024-04-04 07:30:00 1039

原创 Redis第10讲——Redis数据分片的三种算法

一致性哈希环顺时针映射优先考虑的是:如何实现最少的节点数据发生数据迁移,当增加或移除节点,只有离新节点最近的节点会涉及到数据迁移。redis cluster哈希槽是静态映射,优先考虑的是如何实现数据均匀分布,当增加或移除节点时,所有的节点都会参与进来平摊压力。(我们搞集群的目的是啥?还不是单机容量不足,需要扩容多机组成集群,然后将数据尽可能的均匀分布吗)。同时,redis cluster哈希槽静态映射还有一个优点,就是可以手动调整slots槽的分配。redis cluster集群分为16384个

2024-03-28 07:30:00 792

原创 inputStream.avaliable()方法网络操作读取不全BUG

用InputStream.available()方法,这个方法可以在读写操作前先得知数据流里有多少个字节可以读取。需要注意的是,如果这个方法用在从本地文件读取数据时,一般不会遇到问题,但如果是用于网络操作,就经常会遇到一些麻烦。这是因为网络通讯往往是间断性的,一串字节往往分几批进行发送。例如对方发来字节长度100的数据,本地程序调用available()方法有时得到0,有时得到50,有时能得到100,大多数情况下是100。这可能是对方还没有响应,也可能是对方已经响应了,但是数据还没有送达本地。也

2024-03-21 19:40:56 509

原创 Redis第9讲——Redis 3.0之前各大厂商的集群方案

​上篇文章介绍了Redis 3.0版本开始支持的Cluster集群,但在Redis 3.0版本之前,Redis主要是以单实例模式运行,无法很好地应对大规模和高负载的需求。虽然Redis的开发者Antirez早在博客上就提出Redis 3.0版本中加入集群功能,但是要等到2015年才发布正式版。在3.0版本还没发布之前为了解决这个存储瓶颈问题,纷纷推出自己的Redis集群方案。这些方案的核心是把数据分片(sharding)存储在多个Redis实例中,每一片就是一个Redis实例。

2024-03-21 07:30:00 711

原创 Redis第8讲——Cluster集群模式详解

前面两篇文章介绍了Redis主从和哨兵模式,不难发现,它们都有一些共同的缺点,首先在主从切换的过程中会丢失数据;另一个就是只有一个master,只能单点写,并没有水平扩容能力。而且每个节点都保存了所有的数据,这使得内存占用率变高,另一个就是如果进行数据恢复也比较慢。为了解决这些问题,集群模式应运而生,下面我们来一起看看。

2024-03-14 07:45:00 918 1

原创 Redis第7讲——哨兵模式详解

为了解决主从模式的无法自动容错及恢复的问题,Redis在主从复制的基础上加入了哨兵节点,也就是我们熟悉的哨兵模式。但现在基本不会用到哨兵模式,也就是这种模式只存在于面试中。Redis的哨兵模式(Sentinel)是一种高可用的部署方式,由一个或多个Sentinel实例组成的Sentinel系统可以监控和管理多个Redis实例。在哨兵模式下,有一个或多个哨兵进程监控Redis主服务器和备份服务器的状态,并在主服务器下线时自动切换到备份服务器,继续处理命令请求。

2024-03-07 07:45:00 807

原创 Redis第6讲——主从复制模式详解

Redis 2.8之前复制采用SYNC命令,无论是第一次还是断线重连,都采用完整重同步方式,效率很低。Redis 2.8~Redis 4.0版本之间采用PSYNC命令,主要优化了断线重连后可以通过runid和offset使用部分重同步,效率提高,但存在slave重启和master故障切换问题导致执行完整重同步的问题。Redis 4.0版本之后对PSYNC命令进行了优化——PSYNC2,主要优化了PSYNC在slave重启和master故障切换后执行完整重同步的问题。

2024-02-29 07:30:00 1109

原创 Redis第5讲——RDB、AOF和混合持久化机制

我们知道Redis是内存数据库,它把数据都存储在了内存中,如果Redis服务器出现了意外,比如宕机、断电等情况,那么内存中的数据就会全部丢失。所以必须有一种机制可以把内存中的数据保存到磁盘里面,为了解决这个问题,Redis提供了RDB和AOF两种持久化机制,这也是Redis的重要特性之一。在开启混合持久化的情况下,AOF重写时会把Redis的持久化数据,以RDB的格式写入到AOF文件的开头,之后的数据再以AOF的格式追加到文件的末尾。

2024-01-19 07:30:00 1780

原创 Redis第4讲——Redis的数据库结构、删除策略及淘汰策略

redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中。db数组的每项都是一个redis.h/redisDb结构,而每个redisDb结构就代表一个数据库。在初始化服务器时,程序会根据服务器状态的dbnum属性来决定应该创建多少个数据库。过期字典的键是一个指针,这个指针指向键空间中的某个键对象。过期字典的值是一个longlong类型的整数,这个整数保存了键所指向的数据库键的过期时间——一个毫秒精度的UNIX时间戳。

2024-01-05 07:30:00 1081

原创 Redis第3讲——跳跃表详解

在Redis中,跳跃表是有序集合(zSet)数据类型的实现之一,也在集群节点中用作内部数据结构,除此之外,跳跃表在Redis里面没有其它用途。跳跃表支持O(logN)、最坏O(N)复杂度的节点查找,还可以通过顺序性操作来批量处理节点,在大部分情况下,跳跃表的效率可以和红黑树、AVL树不相上下,但跳表原理更加简单、实现起来也更简单直观。

2023-12-28 08:00:01 1295

原创 Redis第2讲——Java三种客户端(Jedis、Lettuce和Redisson)

上篇文章介绍了Redis的9种数据类型和常命令、7种数据结构和9种编码方式。但是如果想要把它应用到项目中,我们还需要一个redis的客户端。redis的Java客户端种类还是很多的,其中使用最广泛的有三种——Jedis、lettuce和redisson,下面我们一起来学习下。基于redis开放的通信协议,大神们纷纷开发出了各种语言的redis客户端,包括C、C++、C#、D、java、Python、Ruby等50多种,这些客户端都是基于redis命令做了一层封装,并打包成工具,以便更方便地操作redis。

2023-12-21 07:15:00 1310

原创 Redis第1讲——入门简介

这段时间思来想去,还是决定把Redis再巩固和学习一下。毕竟Redis不论是在面试还是实际应用中都是极其重要的,在面试中诸如Redis的缓存问题、热key、大key、过期策略、持久化机制等;还有在实际应用中的Redis缓存、分布式锁、Reids实现排行榜、分布式限流功能、Redis做延迟队列、消息队列、发布订阅等。相信大家对这并不陌生,而作者想要做的就是在其基础上,把它们进行总结、整理、扩展并深入。

2023-12-13 07:30:00 2446

原创 Java并发编程第12讲——cancelAcquire()流程详解及acquire方法总结

上篇文章介绍了AQS的设计思想以及独占式获取和释放同步状态的源码分析,但是还不够,一是感觉有点零零散散,二是里面还有很多细节没介绍到——比如cancelAcquire()方法(重点),迫于篇幅原因,今天就把它放到这篇文章里,继续深入AQS!

2023-11-22 07:30:00 392 1

原创 Java并发编程第11讲——AQS设计思想及核心源码分析

AQS全称AbstractQueuedSynchronizer。JDK 1.5之前只有synchronized同步锁,并且效率并不高,因此并发大神Doug Lea在JDK 1.5的时候自己写了一套框架,希望能够成为高效率地实现大部分同步需求的基础,也就是我们现在熟知的AQS(队列同步器)。AQS提供了一个同步器的框架,JUC包下大多数同步器都是围绕着AQS 使用的一组共同的基础行为(如等待队列、条件队列、独占或共享获取等)实现的,比如前边提到的ReentrantLock、CountDownLatch、S

2023-11-08 07:15:00 443

原创 Java并发编程第10讲——CAS相关知识点详解

前面介绍锁的时候顺便也提到了CAS,但作为JUC的“基石”和面试中的高频考点,还是不够。所以,本篇文章将从CAS的概念入手,逐步深入介绍12个Atomic原子操作类、CAS的实现原理(源码解析)、Unsafe类、CAS存在的问题以及LongAddr。

2023-10-24 17:02:28 260

原创 Java并发编程第9讲——CountDownLatch、CyclicBarrier和Semaphore(万字详解)

在JDK的并发包(JUC)里提供了几个非常有用的并发工具类。CountDownLatch、CyclicBarrier和Samaphore工具类提供了一种并发流程控制的手段,这同样也是面试和工作中的一个重要知识点,本文将从它们的定义、常用方法、代码示例及核心源码的分析等几个要点详细介绍一下。

2023-10-13 08:00:00 698

原创 Java并发编程第8讲——ThreadLocal详解

ThreadLocal无论是在项目开发还是面试中都会经常碰到,它的重要性可见一斑,本篇文章就从ThreadLocal的使用、实现原理、核心方法的源码、内存泄漏问题等展开介绍一下。

2023-09-21 07:30:00 489 2

原创 Java并发编程第7讲——CompletableFuture、Future和ForkJoinPool(万字详解)

CompletableFuture是Java 8中引入的一个类,用于异步编程和并发操作,它大约提供了50个不同的方法,用于组合、合并和执行异步计算步骤以及处理错误。CompletableFuture类实现了Future和CompletionStage接口,这两个接口分别代表了异步任务的结果和完成状态,以及异步任务之间的依赖关系。

2023-09-07 07:15:00 618

原创 Java并发编程第6讲——线程池(万字详解)

Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池,本篇文章就详细介绍一下。首先有关线程的使用会出现两个问题:线程是宝贵的内存资源、单个线程约占1MB空间,过多分配易造成内存溢出。频繁的创建及销毁线程会增加虚拟机回收频率、资源开销,造成性能下降。基于如上问题,出现了线程池:线程容器,可设定线程分配的数量。将预先创建的线程对象存入池中,并重用线程池中的线程对象。避免频繁的创建和销毁。

2023-08-29 07:00:00 712

原创 Java并发编程第5讲——volatile关键字(万字详解)

本篇文章从volatile的定义谈起,由于volatile与Java内存模型有较多的关联,所以接着介绍Java内存模型的相关概念、线程、主内存和工作内存之间的关系以及内存间的交互规则;随后详细介绍了volatile和synchronized在Java并发编程的三大特性——原子性、可见性和有序性中的表现(重点介绍volatile)。最后介绍了一下“重排序”、“内存屏障”和“先行发生原则(happens-before)”等重要概念。

2023-08-22 07:30:00 369

原创 Java并发编程第4讲——Java中的锁(万字详解)

本篇文章介绍了Java中的6种锁。从锁的相关概念开始,逐一详细介绍synchronized关键字、ReentrantLock、Condition接口、读写锁ReentrantReadWriteLock、读写性能之王StampedLock以及CAS乐观锁。内容涉及各个的概念、实现原理、特性、常用方法、代码示例以及相互之间的比较。

2023-08-11 07:30:00 525 1

原创 Java并发编程第3讲——线程安全

简单来说,就是多个线程同时访问共享变量时,得到的结果和我们预期的结果一样,就是线程安全。1 线程安全 1.1 谈谈你对线程安全的理解 1.2 Java中操作共享数据分类1.2.1 不可变(Immutable)1.2.2 绝对线程安全(Thread-safe)1.2.3相对线程安全(Thread-compatible)1.2.4线程兼容(Thread-adaptive)1.2.5线程对立(Thread-hostile)二、线程安全问题产生的原因及解决方式2.1 原因

2023-07-31 07:01:18 316 3

原创 Java并发编程第2讲——线程基础

本篇文章首先介绍了线程的基本概念、组成和特点,又使用JMX看了一下main方法的启动包含了几个线程。接着介绍了4种创建线程的方式,所以又介绍了run()和start()的区别(因为面试中有被问到过)。第三部分介绍了线程的6个状态以及它们之间的转换,并画了示意图。第四部分介绍了线程的sleep()、yield()、join()、setPriority()、setDaemon()等方法。怎么感觉面试的时候或多或少都被面试官问到过,死去的记忆又开始攻击我了。😅

2023-07-27 07:45:00 253

原创 Java并发编程第1讲——相关基础概念

本篇文章以“外卖小哥送外卖”为例...一、并发与并发编程的含义 1.1 并发 1.2 并发编程 二、为什么需要并发编程 三、线程与进程 3.1 什么是线程和进程 3.2 两者之间的区别与联系 3.2.1 区别 3.2.2 联系 四、并发编程的优势和挑战 4.1 优势 4.2 挑战 4.2.1 线程上下文切换 4.2.2 死锁 4.2.3资源限制 五、总结

2023-07-24 07:45:00 296

原创 设计模式结合场景(1)——支付场景(策略+工厂+模板)

面试官:你们项目的支付场景用了哪些设计模式,为什么要这么做?一、背景 二、方案三、UML类图 四、代码实现 4.1 Payment——支付接口 4.2 Alipay、WeChatPay——支付具体策略 4.3 PaymentFactory——支付工厂4.4 PaymentTemplate——抽象模板4.5 WeChat、AlipayTemplate——具体模板4.6 test 五、总结

2023-07-19 07:45:00 710

原创 设计模式第22讲——访问者模式(Visitor)

访问者模式是一种行为型设计模式,它可以用于在不修改已有对象结构的情况下,定义新的操作方式。一、什么是访问者模式 二、角色组成 三、优缺点 四、 应用场景 4.1 生活场景4.2 Java场景 五、代码实现 5.0 UML类图5.1抽象访问者——Visitor5.2 具体访问者——Tourist5.3 抽象元素——Spot5.4 具体元素——View、Relic5.5 对象结构——SpotCollection5.6 testVisitor六、总结

2023-07-05 20:22:54 1122 2

原创 java.net.UnknownHostException: [hostName]: [hostName]: Name or service not known

最近一个新项目需要做功能和性能测试,公司给我分配了两台机器,于是我就把项目分别部署在了两台机器上,用postman测试一下,返回结果如下:然后本能地去查看日志,才明白错误的原因:原来是服务器hosts文件中没有配置当前主机名对应的ip,那么知道原因那就好解决了。

2023-07-04 22:05:26 2922

原创 设计模式第21讲——状态模式(State)

状态模式是一种行为型设计模式。简单地讲就是,一个拥有状态的context对象,在不同状态下,其行为会发生改变。一、什么是状态模式 二、角色组成 三、 优缺点 四、应用场景4.1 生活场景4.2 java场景 五、代码实现5.0 UML类图5.1 State——抽象状态5.2 具体状态5.3 Machine——上下文5.4 testState 六、总结

2023-07-04 07:53:30 3405 1

原创 设计模式第20讲——备忘录模式(Memento)

备忘录模式又称快照模式,是一种行为型设计模式。一、什么是备忘录模式 二、角色组成三、优缺点 四、应用场景五、代码实现 5.0 UML类图 5.1 EditorMemento——备忘录(Memento)5.2 Editor——源发器(Originator)5.3 History——管理者(Caretaker)5.4 testMemento 六、总结

2023-07-02 23:49:09 2700 1

原创 设计模式第19讲——命令模式(Command)

命令模式(Command Pattern)是一种行为型设计模式,又叫动作模式或事务模式。一、什么是命令模式 二、角色组成 三、优缺点 四、应用场景 4.1 生活场景4.2 java场景五、代码实现5.0 UML类图 5.1 抽象命令(Command)——Command5.2接收者(Receiver)——Chef5.3具体命令(Concrete Command)——OrderCommand六、总结

2023-06-30 08:50:22 6564 1

原创 设计模式第18讲——中介者模式(Mediator)

中介者模式是一种行为型设计模式,它主要用于减少对象之间互相通信的复杂性。一、什么是中介者模式 二、角色组成 三、优缺点 四、应用场景 4.1 生活场景 4.2 java场景五、代码实现 5.0 UML类图 5.1抽象中介者(Mediator)——LogisticsCenter5.2抽象同事类(Colleague)——Participant5.3具体同事类(Concrete Colleague)TransportCompany&Merchant5.4具体中介者(Con

2023-06-29 09:09:59 1497

原创 设计模式第17讲——解释器模式(Interpreter)

一、什么是解释器模式 二、角色组成 三、优缺点 四、应用场景 4.1 生活场景 4.2 java场景 五、代码实现 5.0 UML类图 5.1 Expression——抽象表达式(Abstract Expression)5.2 终结符表达式(Terminal Expression)5.3 非终结符表达式(Nonterminal Expression)5.4 InterpreterVariables——上下文(Context)5.5 testInterpreter 六、总结

2023-06-27 08:15:00 747

原创 设计模式第16讲——迭代器模式(Iterator)

迭代器模式是一种行为型设计模式。一、什么是迭代器模式 二、角色组成 三、 优缺点 四、应用场景 4.1 生活场景 4.2 java场景 五、代码实现5.0 UML类图 5.1 Student——学生实体类5.2 StudentIterator——抽象迭代器(Iterator)5.3 StudentListIterator——具体迭代器(Concrete iterator)5.4 StudentAggregate——抽象聚合器(Aggregate)5.5 ClassList

2023-06-25 22:14:32 5184

原创 设计模式第15讲——模板模式(Template)

模板模式是一种基于继承实现的设计模式,它是行为型的模式。一、什么是模板模式 二、角色组成 三、优缺点 四、应用场景 4.1 生活场景 4.2 java场景 五、代码实现 5.0 UML类图5.1 OrderFood——抽象类(Abstract)5.2 具体类(Concrete Class)5.3 testTemplate六、总结

2023-06-25 00:47:02 4851 1

原创 设计模式第14讲——享元模式(Flyweight)

享元模式是一种结构型的设计模式。一、什么是享元模式 二、 角色组成 三、优缺点 四、应用场景 4.1 生活场景 4.2 java场景 五、代码实现 5.0 代码结构5.1 Bike——抽象享元类(FlyWeight)5.2 具体享元类(ConcreteFlyWeight)5.3 BikeFactory——享元工厂(FlyWeightFactory)5.4 testFlyWeight 六、总结

2023-06-21 23:53:02 4647 4

原创 设计模式第13讲——组合模式(Composite)

组合模式也成为整体部分模式,是一种结构型设计模式。一、什么是组合模式 二、角色组成 三、优缺点 四、应用场景 4.1 生活场景 4.2 java场景 五、代码实现 5.0 UML类图 5.1 Expression-组件(Component)5.2 Number-叶子节点(Leaf)5.3 Operation-组合节点(Composite)5.4 testComposite六、总结

2023-06-20 07:45:00 2353

空空如也

空空如也

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

TA关注的人

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