摘要:
SpringMVC 工作原理 Spring MVC 的核心组件有哪些? 记住了下面这些组件,也就记住了 SpringMVC 的工作原理。 DispatcherServlet:核心的中央处理器,负责接收请求、分发,并给予客户端响应。 HandlerMapping:处理器映射器,根据 URL 去匹配查找
阅读全文
posted @ 2024-08-02 17:41
Duancf
阅读(6)
推荐(0)
摘要:
参考资料 谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)! 类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLo
阅读全文
posted @ 2024-08-02 17:03
Duancf
阅读(19)
推荐(0)
摘要:
分布式系统设计中的并发访问解决方案 | 得物技术 随着互联网信息技术的飞速发展,数据量不断增大,业务逻辑也日趋复杂,对系统的高并发访问、海量数据处理的场景也越来越多。如何用较低成本实现系统的高可用、易伸缩、可扩展等目标就显得越发重要。 为了解决这一系列问题,系统架构也在不断演进。传统的集中式系统已经
阅读全文
posted @ 2024-08-02 16:15
Duancf
阅读(38)
推荐(0)
摘要:
如何设计一个秒杀系统? 设计秒杀系统之前,我们首先需要对秒杀系统有一个清晰的认识。 秒杀系统主要为商品(往往是爆款商品)秒杀活动提供支持,这个秒杀活动会限制商品的个数以及秒杀持续时间。 为什么秒杀系统的设计是一个难点呢? 是因为它的业务复杂么? 当然不是! 秒杀系统的业务逻辑非常简单,一般就是下订单
阅读全文
posted @ 2024-08-02 15:59
Duancf
阅读(114)
推荐(0)
摘要:
在Java中,Integer 类会对一些数值进行缓存,这样可以节省内存并提高性能。当你使用 Integer.valueOf(int) 方法来创建 Integer 对象时,对于数值在 -128 到 127 之间的整数,Java 会返回缓存中的对象实例。因此,对于这些范围内的整数,用 Integer.v
阅读全文
posted @ 2024-08-01 23:35
Duancf
阅读(40)
推荐(0)
摘要:
count COUNT()函数 COUNT()函数进行计数。可利用COUNT()确定表中行的数目或符合特定条件的行的数目。 COUNT()函数有两种使用方式: 使用COUNT(*)对表中行的数目进行计数,不管表列中包含的是空值(NULL)还是非空值。 使用COUNT(column)对特定列中具有值的
阅读全文
posted @ 2024-08-01 23:19
Duancf
阅读(9)
推荐(0)
摘要:
182. 查找重复的电子邮箱 select email from person group by email having count(email)>1 196. 删除重复的电子邮箱 delete a from Person a left join Person b on a.email = b.e
阅读全文
posted @ 2024-08-01 23:19
Duancf
阅读(11)
推荐(0)
摘要:
Java 值传递详解 开始之前,我们先来搞懂下面这两个概念: 形参&实参 值传递&引用传递 形参&实参 方法的定义可能会用到 参数(有参的方法),参数在程序语言中分为: 实参(实际参数,Arguments):用于传递给函数/方法的参数,必须有确定的值。 形参(形式参数,Parameters):用于定
阅读全文
posted @ 2024-07-30 20:50
Duancf
阅读(7)
推荐(0)
摘要:
这次聊聊,Redis 的哨兵机制。 为什么要有哨兵机制? 在 Redis 的主从架构中,由于主从模式是读写分离的,如果主节点(master)挂了,那么将没有主节点来服务客户端的写操作请求,也没有主节点给从节点(slave)进行数据同步了。 这时如果要恢复服务的话,需要人工介入,选择一个「从节点」切换
阅读全文
posted @ 2024-07-30 19:31
Duancf
阅读(66)
推荐(0)
摘要:
默认情况下hashcode是根据对象的地址计算的,但是请注意,对象的地址在GC的时候会发生变化,但是hashcode不能因为地址的变化而发生变化,所以要缓存hash值 另外,如果重写了hashcode方法,根据对象的属性值计算hashcode,那么每次修改对象的属性后都需要重新计算hashcode,
阅读全文
posted @ 2024-07-30 17:24
Duancf
阅读(20)
推荐(0)
摘要:
为什么String要设计成不可变的 线程安全:不可变对象天生就是线程安全的:因为不可变对象不能被改变,所以他们可以自由地在多个线程之间共享。不需要任何同步处理。 hashmap需要: 加快字符串处理速度由于String是不可变的,保证了hashcode的唯一性,于是在创建对象时其hashcode就可
阅读全文
posted @ 2024-07-29 22:40
Duancf
阅读(51)
推荐(0)
摘要:
RabbitMQ 是什么? RabbitMQ 是一个在 AMQP(Advanced Message Queuing Protocol )基础上实现的,可复用的企业消息系统。它可以用于大型软件系统各个模块之间的高效通信,支持高并发,支持可扩展。它支持多种客户端如:Python、Ruby、.NET、Ja
阅读全文
posted @ 2024-07-29 20:33
Duancf
阅读(68)
推荐(0)
摘要:
在并发编程中,锁是一种常用的保证线程安全的方法。Java 中常用的锁主要有两类,一种是 Synchronized 修饰的锁,被称为 Java 内置锁或监视器锁。另一种就是在 J2SE 1.5版本之后的 java.util.concurrent包(下称j.u.c包)中的各类同步器,包括 Reentra
阅读全文
posted @ 2024-07-29 15:55
Duancf
阅读(45)
推荐(0)
摘要:
事务 为了确保连续多个操作的原子性,一个成熟的数据库通常都会有事务支持,Redis也不例外。 Redis的事务使用方法非常简单 不同于关系数据库我们无须理解那么多复杂的事务模型就可以直接使用。不过也正是因为这种简单性它的事务模型很不严格这要求我们不能像使用关系数据库的事务一样来使用 Redis 事务
阅读全文
posted @ 2024-07-28 18:55
Duancf
阅读(168)
推荐(0)
摘要:
Leaf这个名字是来自德国哲学家、数学家莱布尼茨的一句话: There are no two identical leaves in the world > “世界上没有两片相同的树叶” 综合对比上述几种方案,每种方案都不完全符合我们的要求。所以Leaf分别在上述第二种和第三种方案上做了相应的优化,
阅读全文
posted @ 2024-07-28 10:49
Duancf
阅读(28)
推荐(0)
摘要:
参考资料 前言 从 CPU 到内存、到磁盘、到操作系统、到网络,计算机系统处处存在不可靠因素。工程师和科学家努力使用各种软硬件方法对抗这种不可靠因素,保证数据和指令被正确地处理。在网络领域有 TCP 可靠传输协议、在存储领域有 Raid5 和 Raid6 算法、在数据库领域有 基于 ARIES 算法
阅读全文
posted @ 2024-07-27 23:59
Duancf
阅读(16)
推荐(0)
摘要:
什么是 ID? 日常开发中,我们需要对系统中的各种数据使用 ID 唯一表示,比如用户 ID 对应且仅对应一个人,商品 ID 对应且仅对应一件商品,订单 ID 对应且仅对应一个订单。我们现实生活中也有各种 ID,比如身份证 ID 对应且仅对应一个人、地址 ID 对应且仅对应一个地址。简单来说,ID 就
阅读全文
posted @ 2024-07-27 23:53
Duancf
阅读(32)
推荐(0)
摘要:
CyclicBarrier 循环栅栏 CyclicBarrier 字面意思回环栅栏(循环屏障),通过它可以实现让一组线程等待至某个状态(屏障点)之后再全部同时执行。叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用。 CyclicBarrier的使用 构造方法 // pa
阅读全文
posted @ 2024-07-26 21:07
Duancf
阅读(116)
推荐(0)
摘要:
CountDownLatch CountDownLatch一般用作多线程倒计时计数器,强制它们等待其他一组(CountDownLatch的初始化决定)任务执行完成。 有一点要说明的是CountDownLatch初始化后计数器值递减到0的时候,不能再复原的,这一点区别于Semaphore,Semaph
阅读全文
posted @ 2024-07-26 21:01
Duancf
阅读(17)
推荐(0)
摘要:
finally中的代码一定会执行吗? 通常在面试中,只要是疑问句一般答案都是"否定"的,因为如果是"确定"和"正常"的,那面试官就没有必要再问了。 典型回答 正常运行的情况下,finally 中的代码是一定会执行的,但是,如果遇到以下异常情况,那么 finally 中的代码就不会继续执行了: 程序在
阅读全文
posted @ 2024-07-26 20:42
Duancf
阅读(22)
推荐(0)
posted @ 2024-07-26 20:39
Duancf
阅读(7)
推荐(0)
摘要:
final 简介 final关键字可用于多个场景,且在不同场景具有不同的作用。首先,final是一个非访问修饰符,仅适用于变量,方法或类。下面是使用final的不同场景: 当final修饰变量时,被修饰的变量必须被初始化(赋值),且后续不能修改其值,实质上是常量; 当final修饰方法时,被修饰的方
阅读全文
posted @ 2024-07-26 20:27
Duancf
阅读(25)
推荐(0)
摘要:
多线程的价值 (这里展示的是网上的答案,我觉得真正重要的是减少进程切换的代价) 发挥多核CPU的优势 多线程,可以真正发挥出多核CPU的优势来,达到充分利用CPU的目的,采用多线程的方式去同时完成几件事而不互相干扰。 防止阻塞 从程序运行效率的角度来看,单核CPU不但不会发挥出多线程的优势,反而会因
阅读全文
posted @ 2024-07-26 20:02
Duancf
阅读(4)
推荐(0)
摘要:
Java中的大部分同步类(Lock、Semaphore、ReentrantLock等)都是基于AbstractQueuedSynchronizer(简称为AQS)实现的。AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架。本文会从应用层逐渐深入到原理层,并通过Reentr
阅读全文
posted @ 2024-07-26 17:18
Duancf
阅读(58)
推荐(0)
摘要:
原子性、可见性与有序性 Java内存模型是围绕着在并发过程中如何处理原子性、可见性和有序性这三个特征来建立的,我们逐个来看一下哪些操作实现了这三个特性。 原子性(Atomicity) 由Java内存模型来直接保证的原子性变量操作包括read、load、assign、use、store和write这六
阅读全文
posted @ 2024-07-26 12:32
Duancf
阅读(47)
推荐(0)
摘要:
接口 接口中方法抛出异常 在 Java 中,如果接口中的方法声明了抛出异常,那么实现这个接口的类必须处理这些异常。处理方式有两种:要么在实现方法中继续抛出异常,要么捕获并处理异常。 假设接口定义如下: public interface MyInterface { void myMethod() th
阅读全文
posted @ 2024-07-25 20:12
Duancf
阅读(9)
推荐(0)
摘要:
InnoDB和MyISAM InnoDB和MyISAM是MySQL数据库系统中最常用的两种存储引擎。它们各自拥有不同的特性和优化点,适用于不同的应用场景。以下是它们之间的一些主要区别: 事务支持 InnoDB:支持事务(ACID兼容)。它提供了提交、回滚和崩溃恢复功能,非常适合处理大量的短期事务。I
阅读全文
posted @ 2024-07-24 10:36
Duancf
阅读(20)
推荐(0)
摘要:
Collection 和 Collections 有什么区别 Collection接口 是Java集合框架的核心接口,它提供了一组标准的方法来操作各种类型的集合元素。它被一些集合类实现,比如ArrayList、LinkedList和HashSet等。这些实现提供了集合的基本操作,例如添加、删除、清空
阅读全文
posted @ 2024-07-23 23:45
Duancf
阅读(3)
推荐(0)
摘要:
常见的限流算法有四种: ● 令牌桶算法(Token Bucket) · 原理:令牌桶算法是一种基于令牌的限流算法,它维护一个固定容量的令牌桶,按照固定速率往桶中添加令牌,每当有请求到来时,消耗一个令牌,如果桶中没有足够的令牌,则拒绝该请求。 · 优点:平滑限流,可以应对突发流量;灵活控制流量速率。
阅读全文
posted @ 2024-07-23 16:59
Duancf
阅读(22)
推荐(0)
摘要:
分库分表 读写分离主要应对的是数据库读并发,没有解决数据库存储问题。试想一下:如果 MySQL 一张表的数据量过大怎么办? 换言之,我们该如何解决 MySQL 的存储压力呢?答案之一就是 分库分表。 什么是分库? 分库 就是将数据库中的数据分散到不同的数据库上,可以垂直分库,也可以水平分库。 垂直分
阅读全文
posted @ 2024-07-23 16:09
Duancf
阅读(57)
推荐(0)
摘要:
如何避免主从延迟? 读写分离对于提升数据库的并发非常有效,但是,同时也会引来一个问题:主库和从库的数据存在延迟,比如你写完主库之后,主库的数据同步到从库是需要时间的,这个时间差就导致了主库和从库的数据不一致性问题。这也就是我们经常说的主从同步延迟。 如果我们的业务场景无法容忍主从同步延迟的话,应该如
阅读全文
posted @ 2024-07-23 16:02
Duancf
阅读(79)
推荐(0)
摘要:
类加载器 Java虚拟机设计团队有意把类加载阶段中的通过一个类的全限定名来获取描述该类的二进制字节流这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需的类。实现这个动 作的代码被称为类加载器(Class Loader)。 类加载器可以说是Java语言的一项创新,它是早期Jav
阅读全文
posted @ 2024-07-23 12:38
Duancf
阅读(44)
推荐(0)
摘要:
Redis 的持久化方式有两种:AOF 日志和 RDB 快照。所以接下来,针对这两种持久化方式具体分析分析。 大 Key 对 AOF 日志的影响 先说说 AOF 日志三种写回磁盘的策略 Redis 提供了 3 种 AOF 日志写回硬盘的策略,分别是: Always,这个单词的意思是「总是」,所以它的
阅读全文
posted @ 2024-07-22 19:48
Duancf
阅读(33)
推荐(0)
摘要:
redis为什么这么快 基于内存实现 redis将数据存储在内存中,内存的读写速度很快,所以redis速度很快 高效的数据结构 哈希表 跳表 压缩表 快表 双向链表 简单动态字符串 整数数组 单线程模型 使用IO多路复用 合理的数据编码 Redis为什么会比MySQL快? 1.(内存和磁盘的区别)R
阅读全文
posted @ 2024-07-22 19:40
Duancf
阅读(6)
推荐(0)
摘要:
数据类型 Java的数据类型包括基本数据类型和引用数据类型: 基本数据类型: 整形:byte, short, int, long 浮点型:float, double 字符型:char 布尔型:boolean 引用数据类型:class, interface, array。
阅读全文
posted @ 2024-07-22 16:33
Duancf
阅读(11)
推荐(0)
摘要:
过期删除 Redis 提供了四个命令来设置过期时间(生存时间): EXPIRE :表示将键 key 的生存时间设置为 ttl 秒; PEXPIRE :表示将键 key 的生存时间设置为 ttl 毫秒; EXPIREAT :表示将键 key 的生存时间设置为 timestamp 所指定的秒数时间戳;
阅读全文
posted @ 2024-07-22 11:52
Duancf
阅读(51)
推荐(0)
摘要:
Class Object java.lang.Object public class Object Class Object is the root of the class hierarchy. Every class has Object as a superclass. All objects
阅读全文
posted @ 2024-07-21 23:27
Duancf
阅读(6)
推荐(0)
posted @ 2024-07-21 22:55
Duancf
阅读(3)
推荐(0)
摘要:
ArrayList ArrayList是List接口的实现类,它是支持根据需要而动态增长的数组。java中标准数组是定长的,在数组被创建之后,它们不能被加长或缩短。这就意味着在创建数组时需要知道数组的所需长度,但有时我们需要动态程序中获取数组长度。ArrayList就是为此而生的,但是它不是线程安全
阅读全文
posted @ 2024-07-21 22:33
Duancf
阅读(22)
推荐(0)
摘要:
李代桃僵--Sentinel 目前我们还只是讲 Redis 的主从最终一致性。大家可曾思考过,如果主节点凌晨3 点突发宕机怎么办?只能坐等运维人员从床上爬起来,然后手工进行主从切换,再通知所有的程序把地址统统改一遍重新上线吗?毫无疑问,这样的人工运维效率太低,事故发生后估计至少要花费1个小时才能缓过
阅读全文
posted @ 2024-07-20 21:15
Duancf
阅读(19)
推荐(0)