自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

香农三定律的博客

一只通信汪的开发与算法艰难学习之路。。。。。我太难了

  • 博客(219)
  • 资源 (1)
  • 收藏
  • 关注

原创 数学逻辑专题

本题来源于Leetcode中 归属于分治、贪心专题类型题目。同许多在算法道路上不断前行的人一样,不断练习,修炼自己!嘿嘿喜欢本系列博客的可以关注下,以后除了会继续更新面试手撕代码文章外,还会出其他系列的文章!

2024-03-31 20:17:47 193 1

原创 大厂代码面手撕基础题

嘿嘿喜欢本系列博客的可以关注下,以后除了会继续更新面试手撕代码文章外,还会出其他系列的文章!

2024-01-17 22:50:36 491 1

原创 分治、贪心、字符串专题

本题来源于Leetcode中 归属于分治、贪心专题类型题目。同许多在算法道路上不断前行的人一样,不断练习,修炼自己!嘿嘿喜欢本系列博客的可以关注下,以后除了会继续更新面试手撕代码文章外,还会出其他系列的文章!

2023-06-24 15:15:34 745

原创 动态规划专题

本题来源于Leetcode中 归属于动态规划类型题目。同许多在算法道路上不断前行的人一样,不断练习,修炼自己!嘿嘿喜欢本系列博客的可以关注下,以后除了会继续更新面试手撕代码文章外,还会出其他系列的文章!

2023-05-15 23:20:43 637 1

原创 队列、栈专题

本题来源于Leetcode中 归属于队列、栈类型题目。同许多在算法道路上不断前行的人一样,不断练习,修炼自己!嘿嘿喜欢本系列博客的可以关注下,以后除了会继续更新面试手撕代码文章外,还会出其他系列的文章!

2023-05-10 23:50:04 613

原创 数组、链表专题

本题来源于Leetcode中 归属于数组、链表类型题目。同许多在算法道路上不断前行的人一样,不断练习,修炼自己!嘿嘿喜欢本系列博客的可以关注下,以后除了会继续更新面试手撕代码文章外,还会出其他系列的文章!

2023-04-30 14:36:19 1395 1

原创 BFS算法专题

本题来源于Leetcode中 归属于BFS算法类型题目。同许多在算法道路上不断前行的人一样,不断练习,修炼自己!嘿嘿喜欢本系列博客的可以关注下,以后除了会继续更新面试手撕代码文章外,还会出其他系列的文章!

2023-04-27 23:16:19 300

原创 回溯/DFS算法专题

本题来源于Leetcode中 归属于回溯算法类型题目。同许多在算法道路上不断前行的人一样,不断练习,修炼自己!嘿嘿喜欢本系列博客的可以关注下,以后除了会继续更新面试手撕代码文章外,还会出其他系列的文章!

2023-04-22 14:40:40 285

原创 二叉搜索树专题

本题来源于Leetcode中 归属于二叉树类型题目。同许多在算法道路上不断前行的人一样,不断练习,修炼自己!嘿嘿喜欢本系列博客的可以关注下,以后除了会继续更新面试手撕代码文章外,还会出其他系列的文章!

2023-04-18 23:24:30 568

原创 二叉树专题

本题来源于Leetcode中 归属于二叉树类型题目。同许多在算法道路上不断前行的人一样,不断练习,修炼自己!嘿嘿喜欢本系列博客的可以关注下,以后除了会继续更新面试手撕代码文章外,还会出其他系列的文章!

2023-04-14 23:25:44 423

原创 Spring源码(一)-IOC容器BeanDefinition加载

Spring IOC容器的BeanDefinition加载过程重点源码解析

2022-12-09 19:50:38 1054

原创 LeetCode 1115:交替打印FooBar

LeetCode 1115:交替打印FooBar题目描述解题思路代码实现SemaphoreCyclicBarrierReentrantLock + Condition总结题目描述给你一个类:class FooBar { public void foo() { for (int i = 0; i < n; i++) { print("foo"); } } public void bar() { for (int i = 0; i < n; i

2022-04-05 18:39:59 321

原创 LeetCode 1114:按序打印

LeetCode 1114:按序打印题目描述解题思路代码实现SynchronizedReentrantLockCyclicBarrierSemaphore法一Semaphore法二总结题目描述给你一个类:public class Foo { public void first() { print("first"); } public void second() { print("second"); } public void third() { print("third"); }}

2022-04-05 18:18:48 570

原创 LeetCode 1195:交替打印字符串

LeetCode 1195:交替打印字符串题目描述解题思路代码实现CyclicBarrierReentrantLock + ConditionReentrantLock (Synchronized同理)Semaphore总结题目描述编写一个可以从 1 到 n 输出代表这个数字的字符串的程序,但是:如果这个数字可以被 3 整除,输出 “fizz”。如果这个数字可以被 5 整除,输出 “buzz”。如果这个数字可以同时被 3 和 5 整除,输出 “fizzbuzz”。例如,当 n = 15,输出

2022-04-05 18:00:50 525

原创 责任树模式

责任树模式引言模式的定义与特点责任链模式策略模式责任树模式模式的实现引言前面章节我们分别讲了责任链模式与策略模式,没有看的小伙伴可以点击下面传送门查看:责任链模式策略模式通过上面学习,我们知道责任链模式将请求发送者与多个处理者之间进行解耦,不同处理者的handler之间用类似链表的形式进行链接。策略模式则是针对某一个问题,可能有多种解决策略的情况下,并用不同的类来分别封装。那么有没有一种情形,既存在多个处理者,同时每个处理者又有多种解决策略呢? 其实这种 责任链模式+策略模式 的结合,就是今天我们

2022-04-03 20:19:19 1023

原创 策略模式详解

策略模式详解引言模式的定义与特点模式的结构与实现模式的结构模式的实现应用案例应用场景举例策略模式的扩展引言在现实生活中常常遇到实现某种目标存在多种策略可供选择的情况,例如,出行旅游可以乘坐飞机、乘坐火车、骑自行车或自己开私家车等,超市促销可以釆用打折、送商品、送积分等方法。模式的定义与特点策略(Strategy)模式的定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现

2022-04-03 18:51:16 1791

原创 责任链模式

责任链模式引言模式的定义与特点模式的结构与实现模式的结构模式的实现应用案例应用场景举例引言在现实生活中,一个事件需要经过多个对象处理是很常见的场景。例如,采购审批流程、请假流程等。公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数不同,员工必须根据需要请假的天数去找不同的领导签名,也就是说员工必须记住每个领导的姓名、电话和地址等信息,这无疑增加了难度。模式的定义与特点责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者

2022-04-03 11:34:58 180

原创 Java常用属性拷贝工具类使用总结

Java常用属性拷贝工具类使用总结引言字段与属性使用说明原理剖析引言对项目中经常使用的属性拷贝工具类进行总结:org.apache.commons.beanutils.BeanUtilsorg.apache.commons.beanutils.PropertyUtilsorg.springframework.beans.BeanUtils字段与属性public class UserTest{ private String userName; private String p

2022-03-28 09:25:44 1423

原创 刨根问底-Condition

刨根问底-ConditionCondtion的实现等待队列等待通知Condition的应用Condtion的实现Condition提供了一系列的方法来对阻塞和唤醒线程:await() :造成当前线程在接到信号或被中断之前一直处于等待状态。await(long time, TimeUnit unit) :造成当前线程在接到信号、被中断或到达指定等待时间之前一直处于等待状态。awaitNanos(long nanosTimeout) :造成当前线程在接到信号、被中断或到达指定等待时间之前一直处于等待

2022-03-20 18:04:33 432

原创 刨根问底-ReentrantReadWriteLock

刨根问底-ReentrantReadWriteLock引言写锁的获取写锁的释放读锁的获取读锁的释放HoldCounter锁降级引言重入锁ReentrantLock是排他锁,排他锁在同一时刻仅有一个线程可以进行访问,但是在大多数场景下,大部分时间都是提供读服务,而写服务占有的时间较少。然而读服务不存在数据竞争问题,如果一个线程在读时禁止其他线程读势必会导致性能降低。所以就提供了读写锁。 读写锁维护着一对锁,一个读锁和一个写锁。通过分离读锁和写锁,使得并发性比一般的排他锁有了较大的提升:在同一时间可以允许多

2022-03-19 20:23:40 143

原创 刨根问底-ReentrantLock

刨根问底-ReentrantLock引言获取锁释放锁公平锁与非公平锁ReentrantLock与synchronized的区别引言ReentrantLock,可重入锁,是一种递归无阻塞的同步机制。它可以等同于synchronized的使用,但是ReentrantLock提供了比synchronized更强大、灵活的锁机制,可以减少死锁发生的概率。 API介绍如下:一个可重入的互斥锁定 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁定相同的一些基本行为和语义,但功能更强

2022-03-14 23:45:03 133

原创 刨根问底-AQS源码解析

刨根问底-AQS源码解析CLH同步队列入队列出队列同步状态的获取与释放独占式同步状态获取独占式获取响应中断独占式超时获取独占式同步状态释放共享式同步状态获取共享式同步状态释放阻塞和唤醒线程LockSupportAQS使用案例CLH同步队列AQS内部维护着一个FIFO队列,该队列就是CLH同步队列。CLH同步队列是一个FIFO双向队列,AQS依赖它来完成同步状态的管理,当前线程如果获取同步状态失败时,AQS则会将当前线程已经等待状态等信息构造成一个节点(Node)并将其加入到CLH同步队列,同时会阻塞当

2022-03-13 19:54:57 974

原创 刨根问底-JVM类加载死锁

刨根问底-JVM类加载死锁引言类加载中的初始化类加载中的死锁引言单例模式大家都了解,其中懒汉式如下:public class Singleton { private static Singleton singleton; private Singleton(){} public static Singleton getInstance(){ if(singleton == null){ si

2022-03-08 09:11:37 524

原创 刨根问底-Volatile原理&Java内存模型

刨根问底-Volatile原理&Java内存模型引言内存模型相关概念操作系统语义Java内存模型volatile原理volataile的内存语义及其实现Java内存模型happens-beforeas-if-serialvolatile与happens-before引言Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。保证共享变量的可见性可以通过锁也可以通过volatile,今天我们来讲volatile。内存模型相关概念既然要

2022-03-05 22:30:18 458

原创 刨根问底-Synchronized实现原理

刨根问底-Synchronized实现原理引言实现原理Java对象头Monitor锁优化自旋锁适应自旋锁锁消除锁粗化轻量级锁偏向锁重量级锁引言初入Java学习殿堂时,提起并发加锁操作首先都会想到用synchronized,同时我们也知道它是一个重量级锁,相对于Lock,它会显得那么笨重,以至于我们认为它不是那么的高效而慢慢摒弃它。伴随Javs SE 1.6对synchronized进行的各种优化后,synchronized现在并没有我们想象的那么重。今天我们将讲述synchronized的实现机制、J

2022-02-27 01:59:18 245

原创 Redis集群之通信开销:限制Redis Cluster规模的关键因素

Redis集群之通信开销:限制Redis Cluster规模的关键因素引言实例通信方法和对集群规模的影响Gossip 消息大小实例间通信频率如何降低实例间的通信开销引言Redis Cluster 能保存的数据量以及支撑的吞吐量,跟集群的实例规模密切相关。Redis 官方给出了 Redis Cluster 的规模上限,就是一个集群运行 1000 个实例。为什么要限定集群规模呢?其实,这里的一个关键因素就是,实例间的通信开销会随着实例规模增加而增大,在集群超过一定规模时(比如 800 节点),集群吞吐量反

2021-12-15 08:56:45 465 1

原创 Redis集群数据分布优化:如何应对数据倾斜?

Redis集群数据分布优化:如何应对数据倾斜?引言数据量倾斜的成因和应对方法bigkey 导致倾斜Slot 分配不均衡导致倾斜Hash Tag 导致倾斜数据访问倾斜的成因和应对方法引言在切片集群中,数据会按照一定的分布规则分散到不同的实例上保存。比如,在使用Redis Cluster 或 Codis 时,数据都会先按照 CRC 算法的计算值对 Slot(逻辑槽)取模,同时,所有的 Slot 又会由运维管理员分配到不同的实例上。虽然这种方法实现起来比较简单,但是很容易导致一个问题:数据倾斜。数据倾斜有两

2021-12-14 00:02:53 2993

原创 Redis集群之Redis支撑秒杀场景的关键技术和实践都有哪些?

Redis集群之Redis支撑秒杀场景的关键技术和实践都有哪些?引言秒杀场景的负载特征对支撑系统的要求Redis 可以在秒杀场景的哪些环节发挥作用Redis 的哪些方法可以支撑秒杀场景基于原子操作支撑秒杀场景基于分布式锁来支撑秒杀场景引言秒杀场景的业务特点是限时限量,业务系统要处理瞬时的大量高并发请求,而 Redis就经常被用来支撑秒杀活动。秒杀场景包含了多个环节,可以分成秒杀前、秒杀中和秒杀后三个阶段,每个阶段的请求处理需求并不相同,Redis 并不能支撑秒杀场景的每一个环节。秒杀场景的负载特征对支

2021-12-12 22:03:05 850

原创 Redis集群之Codis VS Redis Cluster:我该选择哪一个集群方案?

Redis集群之Codis VS Redis Cluster:我该选择哪一个集群方案?Codis 的整体架构和基本流程Codis 的关键技术原理数据如何在集群里分布集群扩容和数据迁移如何进行集群客户端需要重新开发吗怎么保证集群可靠性切片集群方案选择建议Codis 的整体架构和基本流程Redis Cluster 方案正式发布前,业界已经广泛使用的 Codis。Codis 集群中包含了 4 类关键组件:codis server:这是进行了二次开发的 Redis 实例,其中增加了额外的数据结构,支持数据迁

2021-12-12 20:58:10 351

原创 Redis集群之脑裂:一次奇怪的数据丢失

Redis集群之脑裂:一次奇怪的数据丢失引言为什么会发生脑裂第一步:确认是不是数据同步出现了问题第二步:排查客户端的操作日志,发现脑裂现象第三步:发现是原主库假故障导致的脑裂为什么脑裂会导致数据丢失如何应对脑裂问题引言所谓的脑裂,就是指在主从集群中,同时有两个主节点,它们都能接收写请求。而脑裂最直接的影响,就是客户端不知道应该往哪个主节点写入数据,结果就是不同的客户端会往不同的主节点上写入数据。而且,严重的话,脑裂会进一步导致数据丢失。为什么会发生脑裂第一步:确认是不是数据同步出现了问题在主从集群

2021-12-12 12:06:40 2367

原创 Redis集群之Redis主从同步与故障切换,有哪些坑?

Redis集群之Redis主从同步与故障切换,有哪些坑?主从数据不一致读取过期数据不合理配置项导致的服务挂掉protected-mode 配置项cluster-node-timeout 配置项主从数据不一致主从数据不一致,就是指客户端从从库中读取到的值和主库中的最新值并不一致。那为啥会出现这个坑呢?其实这是因为主从库间的命令复制是异步进行的。具体来说,在主从库命令传播阶段,主库收到新的写命令后,会发送给从库。但是,主库并不会等到从库实际执行完命令后,再把结果返回给客户端,而是主库自己在本地执行完命令后

2021-12-12 11:29:29 1018

原创 Redis锁之事务机制:Redis能实现ACID属性吗?

Redis锁之事务机制:Redis能实现ACID属性吗?引言事务 ACID 属性的要求Redis 如何实现事务Redis 的事务机制能保证哪些属性原子性一致性隔离性持久性引言所谓的事务,就是指对数据进行读写的一系列操作。事务在执行时,会提供专门的属性保证,包括原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),也就是 ACID 属性。事务 ACID 属性的要求原子性,就是一个事务中的多个操作必须都完成,或者都不完成。一致性

2021-12-11 22:43:13 119

原创 Redis锁之如何使用Redis实现分布式锁?

Redis锁之如何使用Redis实现分布式锁?引言单机上的锁和分布式锁的联系与区别基于单个 Redis 节点实现分布式锁基于多个 Redis 节点实现高可靠的分布式锁引言Redis 属于分布式系统,当有多个客户端需要争抢锁时,我们必须要保证,这把锁不能是某个客户端本地的锁。否则的话,其它客户端是无法访问这把锁的,当然也就不能获取这把锁了。所以,在分布式系统中,当有多个客户端需要获取锁时,我们需要分布式锁。此时,锁是保存在一个共享存储系统中的,可以被多个客户端共享访问和获取。Redis 本身可以被多个

2021-12-11 22:02:32 111

原创 Redis锁之无锁的原子操作:Redis如何应对并发访问?

Redis锁之无锁的原子操作:Redis如何应对并发访问?引言并发访问中需要对什么进行控制Redis 的两种原子操作方法引言为了保证并发访问的正确性,Redis 提供了两种方法,分别是加锁和原子操作。加锁是一种常用的方法,但是,其实这里会有两个问题:一个是,如果加锁操作多,会降低系统的并发访问性能;第二个是,Redis 客户端要加锁时,需要用到分布式锁,而分布式锁实现复杂,需要用额外的存储系统来提供加解锁操作。原子操作是另一种提供并发访问控制的方法。原子操作是指执行过程保持原子性的操作,而且原子操

2021-12-11 21:00:14 487

原创 Redis缓存篇之缓存被污染了,该怎么办?

Redis缓存篇之缓存被污染了,该怎么办?引言如何解决缓存污染问题LRU 缓存策略LFU 缓存策略的优化引言那什么是缓存污染呢?在一些场景下,有些数据被访问的次数非常少,甚至只会被访问一次。当这些数据服务完访问请求后,如果还继续留存在缓存中的话,就只会白白占用缓存空间。当缓存污染不严重时,只有少量数据占据缓存空间,此时,对缓存系统的影响不大。但是,缓存污染一旦变得严重后,就会有大量不再访问的数据滞留在缓存中。如果这时数据占满了缓存空间,我们再往缓存中写入新数据时,就需要先把这些数据逐步淘汰出缓存,这就会

2021-12-11 20:24:06 508 1

原创 Redis缓存篇之缓存异常:如何解决缓存雪崩、击穿、穿透难题?

Redis缓存篇之缓存异常:如何解决缓存雪崩、击穿、穿透难题?缓存雪崩原因一:大量缓存过期原因二:Redis缓存实例故障宕机缓存击穿缓存穿透缓存雪崩缓存雪崩是指大量的应用请求无法在 Redis 缓存中进行处理,紧接着,应用将大量请求发送到数据库层,导致数据库层的压力激增。具体可能导致问题原因:原因一:大量缓存过期第一个原因是:缓存中有大量数据同时过期,导致大量请求无法得到处理。当数据保存在缓存中,并且设置了过期时间时,如果在某一个时刻,大量数据同时过期,此时,应用再访问这些数据的话,就会发生缓

2021-12-11 14:43:27 1152 1

原创 Redis缓存篇之缓存异常:如何解决缓存和数据库的数据不一致问题

Redis缓存篇之缓存异常:如何解决缓存和数据库的数据不一致问题缓存和数据库的数据不一致是如何发生的如何解决数据不一致问题情况一:先删除缓存,再更新数据库情况二:先更新数据库值,再删除缓存值缓存和数据库的数据不一致是如何发生的其实,这里的“一致性”包含了两种情况:缓存中有数据,那么,缓存的数据值需要和数据库中的值相同;缓存中本身没有数据,那么,数据库中的值必须是最新值。对于读写缓存来说,如果要对数据进行增删改,就需要在缓存中进行,同时还要根据采取的写回策略,决定是否同步写回到数据库中。同步

2021-12-11 11:40:43 1406

原创 Redis缓存篇之替换策略:缓存满了怎么办?

Redis缓存篇之替换策略:缓存满了怎么办?引言设置多大的缓存容量合适Redis 缓存有哪些淘汰策略如何处理被淘汰的数据引言数据访问都是有局部性的,也就是我们通常所说的“八二原理”,80% 的请求实际只访问了 20% 的数据。所以,用 1TB 的内存做缓存,并没有必要。为了保证较高的性价比,缓存的空间容量必然要小于后端数据库的数据总量。不过,内存大小毕竟有限,随着要缓存的数据量越来越大,有限的缓存空间不可避免地会被写满。即缓存数据的淘汰机制。也把它叫作缓存替换机制,简单来说,数据淘汰机制包括两步:第

2021-12-11 01:22:26 645 1

原创 Redis缓存篇之旁路缓存:Redis是如何工作的?

Redis缓存篇之旁路缓存:Redis是如何工作的?缓存的特征Redis 缓存处理请求的两种情况Redis 作为旁路缓存的使用操作缓存的类型只读缓存读写缓存缓存的特征一个系统中的不同层之间的访问速度不一样,所以我们才需要缓存,这样就可以把一些需要频繁访问的数据放在缓存中,以加快它们的访问速度。想象一下,如果每次 CPU 处理数据时,都要从 ms 级别的慢速磁盘中读取数据,然后再进行处理,那么,CPU 只能等磁盘的数据传输完成。这样一来,高速的 CPU 就被慢速的磁盘拖累了,整个计算机系统的运行速度会

2021-12-10 23:42:18 557

原创 Redis性能篇之缓冲区:一个可能引发“惨案”的地方

Redis性能篇之缓冲区:一个可能引发“惨案”的地方引言客户端输入和输出缓冲区如何应对输入缓冲区溢出如何应对输出缓冲区溢出主从集群中的缓冲区复制缓冲区的溢出问题复制积压缓冲区的溢出问题引言缓冲区的功能其实很简单,主要就是用一块内存空间来暂时存放命令数据,以免出现因为数据和命令的处理速度慢于发送速度而导致的数据丢失和性能问题。但因为缓冲区的内存空间有限,如果往里面写入数据的速度持续地大于从里面读取数据的速度,就会导致缓冲区需要越来越多的内存来暂存数据。当缓冲区占用的内存超出了设定的上限阈值时,就会出现缓冲

2021-12-09 23:58:58 272

Java并发编程实战经验总结-并发编程进阶必读

适合人群: 适合有一定Java基础且想在并发领域有更深入研究的你。同样适合从业2-3年,一直只做业务增删改查想要继续学习有所突破的你! 你能学到什么: 1.Java并发基础与演变过程; 2.Java SDK常用并发工具类使用技巧及原理; 3.并发编程设计模式,助力你在工作中更好的运用并发。

2021-11-21

空空如也

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

TA关注的人

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