- 博客(118)
- 资源 (1)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 一文搞懂 MySQL 中的索引
1. 什么是索引MySQL 官方对索引的定义为:索引(Index)是帮助 MySQL 高效获取数据的数据结构。可以得到索引的本质:索引是数据结构。举一个例子,平时看任何一本书,首先看到的都是目录,通过目录去查询书籍里面的内容会非常的迅速,如下:书籍的目录是按顺序放置的,有第一章,第二章…,它本身就是一种顺序存放的数据结构,是一种顺序结构。但是如果我们要去图书馆找一本书怎么办?最好的方式就是有如下的的指引:从上面可见,整个索引结构是一棵倒挂着的树,其实它就是一种数据结构,这种数据结构比前面讲到的
2021-12-01 10:10:58
7117
16
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 十大排序算法
冒泡排序从数组头开始,比较相邻的元素。如果第一个比第二个大(小),就交换它们两个对每一对相邻元素作同样的工作,从开始第一对到尾部的最后一对,这样在最后的元素应该会是最大(小)的数重复步骤1~2,重复次数等于数组的长度,直到排序完成代码实现对下面数组实现排序:{24, 7, 43, 78, 62, 98, 82, 18, 54, 37, 73, 9}代码实现public class BubbleSort { public static final int[] ARRAY = {2
2021-08-20 13:39:26
20859
354
原创 Java8 函数式编程
Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来对 Java 集合运算和表达的高阶抽象。Stream API 可以极大提高 Java 程序员的生产力,让程序员写出高效率、干净、简洁的代码。这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 变换,聚合等。
2022-10-08 18:27:16
6263
原创 超级详细的 Maven 教程(基础+高级)
Maven 是 Apache 软件基金会组织维护的一款专门为 Java 项目提供构建和依赖管理支持的工具。一个 Maven 工程有约定的目录结构,约定的目录结构对于 Maven 实现自动化构建而言是必不可少的一环,就拿自动编译来说,Maven 必须 能找到 Java 源文件,下一步才能编译,而编译之后也必须有一个准确的位置保持编译得到的字节码文件。 我们在开发中如果需要让第三方工具或框架知道我们自己创建的资源在哪,那么基本上就是两种方式:Java 项目开发过程中,构建指的是使用『原材料生产产品』的过程。构建
2022-06-07 14:32:22
67683
34
原创 Future & CompletionService 的使用(性能优化实战)
创建线程的方式创建线程的方式一般有如下 4 种:继承 Thread 类实现 Runable 接口实现 Callable 接口利用线程池其中,直接继承 Thread 或者实现 Runnable 接口都可以创建线程,但是这两种方法都有一个问题就是:没有返回值,也就是不能获取执行完的结果。因此 java1.5 就提供了 Callable 接口来实现这一场景,配合 Future 和 FutureTask 使用。为什么需要 Callable?Runnable 的缺陷如下:不能返回一个返回值不能
2022-04-08 01:13:12
1184
1
原创 CountDownLatch、CyclicBarrier、Semaphore的用法和区别
CountDownLatchCountDownLatch(也叫闭锁)是一个同步协助类,允许一个或多个线程等待,直到其他线程完成操作集。CountDownLatch 使用给定的计数值(count)初始化。await 方法会阻塞直到当前的计数值(count)由于 countDown 方法的调用达到 0,count 为 0 之后所有等待的线程都会被释放,并且随后对await方法的调用都会立即返回。构造方法//参数count为计数值public CountDownLatch(int count) {};
2022-04-04 14:32:36
1258
1
原创 LRU 原理与算法实现(由浅入深)
什么是 LRULRU(Least Recently Used,最近最少使用)算法是一种内存数据淘汰策略,当内存不足时,需要淘汰最近最少使用的数据。其核心思想是长期不被使用的数据,在未来被使用到的几率也不大。因此,当数据所占内存达到一定阈值的时候需要淘汰掉这些数据。LRU 原理按照 LRU 的核心思想,不被使用的数据,在未来被使用到的几率也不大,那么当数据在最近一段时间经常被访问,那么它在以后也会经常被访问。这就意味着,如果经常访问的数据,我们需要然其能够快速命中,而不常访问的数据,我们在容量超出限制
2022-03-29 23:14:51
1735
原创 记一次 JVM 线上调优实战
问题描述很多时候我们的系统在使用过程中经常出现卡顿的情况,或者请求变慢等等情况,然后运维人员跑来给你说写的什么垃圾代码,CPU 飙升,经常 100%,内存飙升。如果你不知道怎么定位问题,觉得自己代码也找不出什么问题,那就说重启试试咯!!!当然了,这种处理方式可以解决,但并不能从根本上解决问题,试想一下如果对于高并发的系统,你重启项目肯定是不行的,所以我们要找到问题的源头,因为我们程序都是跑在 JVM 里面的,所以上面的 2 种情况很可能是我们的代码出现了问题,比如常见的死循环,递归等等,当然这种就是比
2022-03-23 00:27:11
2377
2
原创 缓存穿透利器之「布隆过滤器」
BitMap现代计算机用二进制(bit,位)作为信息的基础单位,1 个字节等于 8 位,例如big字符串是由 3 个字节组成,但实际在计算机存储时将其用二进制表示,big分别对应的 ASCII 码分别是 98、105、103,对应的二进制分别是 01100010、01101001 和 01100111。许多开发语言都提供了操作位的功能,合理地使用位能够有效地提高内存使用率和开发效率。Bit-map 的基本思想就是用一个 bit 位来标记某个元素对应的 value,而 key 即是该元素。由于采用了 b
2022-03-16 14:32:26
2024
原创 如何用 Redis 实现一个分布式锁
场景模拟一般电子商务网站都会遇到如团购、秒杀、特价之类的活动,而这样的活动有一个共同的特点就是访问量激增、上千甚至上万人抢购一个商品。然而,作为活动商品,库存肯定是很有限的,如何控制库存不让出现超买,以防止造成不必要的损失是众多电子商务网站程序员头疼的问题,这同时也是最基本的问题。在秒杀系统设计中,超卖是一个经典、常见的问题,任何商品都会有数量上限,如何避免成功下订单买到商品的人数不超过商品数量的上限,这是每个抢购活动都要面临的难点。针对大量的并发请求,我们可以通过 Redis 来抗,也就是说对于库存
2022-03-10 10:06:42
2632
6
原创 JVM 常见面试题汇总
1. JVM 的内存结构1.1 JVM 的主要组成部分及其作用JVM包含两个子系统和两个组件,两个子系统为 Class loader(类装载)、Execution engine(执行引擎);两个组件为Runtime data area(运行时数据区)、Native Interface(本地接口)。Class loader(类装载):根据给定的全限定名类名(如:java.lang.Object)来装载class文件到Runtime data area中的method area。Execution e
2022-02-28 10:37:47
1482
原创 G1 垃圾回收器(三色标记和跨代引用)
设计思想随着 JVM 中内存的增大,STW 的时间成为 JVM 急迫解决的问题,但是如果按照传统的分代模型,总跳不出 STW 时间不可预测这点。为了实现 STW 的时间可预测,首先要有一个思想上的改变。G1 将堆内存化整为零,将堆内存划分成多个大小相等独立区域(Region),每一个 Region 都可以根据需要,扮演新生代的 Eden 空间、Survivor 空间,或者老年代空间。回收器能够对扮演不同角色的 Region 采用不同的策略去处理,这样无论是新创建的对象还是已经存活了一段时间、熬过多次收集的
2022-02-26 16:42:06
2135
原创 CMS 垃圾回收器
什么是 CMSCMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的老年代收集器。目前很大一部分的 Java 应用集中在互联网站或者 B/S 系统的服务端上,这类应用尤其重视服务的响应速度,希望系统停顿时间最短,以给用户带来较好的体验。CMS 收集器就非常符合这类应用的需求。运行过程从名字(Mark Sweep)上就可以看出,CMS 收集器是基于标记—清除算法实现的,它的运作过程相对于前面几种收集器来说更复杂一些,整个过程分为 4 个步骤,如下:初始标记,时
2022-02-26 15:18:20
590
原创 一文搞懂 RabbitMQ 延时队列(订单定时取消为例)
1. 死信及死信队列1.1 什么是死信一般来说,生产者将消息投递到队列中,消费者从队列取出消息进行消费,但某些时候由于特定的原因导致队列中的某些消息无法被消费,这样的消息如果没有后续的处理,就变成了死信(Dead Letter),所有的死信都会放到死信队列中。为什么为有死信?消息变成死信一般是以下三种情况:消息被拒绝,即basicReject/basicNack,并且设置 requeue 参数为 false,这种情况一般消息丢失 。消息过期(TTL),TTL全称为Time-To-Live,表示的
2022-02-24 23:20:26
6046
1
原创 RabbitMQ 消息确认机制、补偿机制、消息幂等性实践
1. 场景先看这么几个面试题:如何保证消息的可靠性投递?即如何确定消息是否发送成功?如果失败如何处理(补偿机制)?如何保证消息不被重复消费?或者说,如何保证消息消费时的幂等性?2. 消息的可靠性投递消息确认消息确认包括主要生产者发送确认和消费者接收确认,因为发送消息的过程中我们是无法确认消息是否能路由等,一旦消息丢失我们就无法处理,所以需要确认消息,避免消息丢失。2.1 生产者确认我们知道生产者与消费者完全隔离的,不做任何配置的情况下,生产者是不知道消息是否真正到达 RabbitMQ,
2022-02-23 21:41:10
2710
2
原创 【二分查找】+ leetcode_04:寻找两个正序数组的中位数
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
2022-01-26 19:33:36
789
原创 Java 集合高频面试题汇总
更多:Java 集合面试题汇总Java 中的集合类存放于 java.util 包中,主要有 3 种:set(集)、list(列表包含 Queue)和 map(映射)。Iterator:迭代器,可以通过迭代器遍历集合中的数据,主要方法为hasNext() 和 next();Collection:Collection 是集合 List、Set、Queue 的最基本的接口;Map:是映射表的基础接口。1. 常用的集合类有哪些,有什么区别Java 中常用的集合有 List,Set,Map,区别如下
2022-01-24 09:56:48
884
1
原创 简单了解 ConcurrentHashMap 在 JDK7 和 JDK8 中的区别
在了解 HashMap 的的原理时,对于 jdk7 和 8 的实现是不同的,同样,对于支持并发的 ConcurrentHashMap 来说其实现也不相同。其主要区别在于两者保证线程安全的机制不同,jdk7 采用的是分段锁的概念,每一个分段都有一把锁,锁内存储的着数据,锁的个数在初始化之后不能扩容。而 jdk8 的 ConcurrentHashMap 数据结构同 HashMap,通过 Synchronized+CAS 来保证其线程安全。jdk7在 jdk7 中,有一个非常重要的概念就是 Segment
2022-01-20 20:08:07
1256
原创 Redis 做缓存常见的几个问题总结
1. 数据一致性我们知道,Redis 主要是用来做缓存使用,只要使用到缓存,无论是本地内存做缓存还是使用 Redis 做缓存,那么就会存在数据同步的问题。一般情况下,我们都是先读缓存数据,缓存数据有,则立即返回结果;如果没有数据,则从数据库读数据,并且把读到的数据同步到缓存里,提供下次读请求返回数据。这样能有效减轻数据库压力,但是如果修改删除数据库中的数据,而内存是无法感知到数据在数据库的修改。这样就会造成数据库中的数据与缓存中数据不一致的问题,那该如何解决呢?通常的方案有以下几种:先更新缓.
2022-01-13 23:08:31
975
原创 了解 Redis 缓存穿透、缓存击穿、缓存雪崩
1. 缓存穿透是指查询一个根本不存在的数据,缓存层和存储层都不会命中,如果从存储层查不到数据则不写入缓存层。缓存穿透将导致不存在的数据每次请求都要到存储层去查询,失去了缓存保护后端存储的意义。缓存穿透问题可能会使后端存储负载加大,由于很多后端存储不具备高并发性,甚至可能造成后端存储宕掉。通常可以在程序中分别统计总调用数、缓存层命中数、存储层命中数,如果发现大量存储层空命中,可能就是出现了缓存穿透问题。1.1 原因分析造成缓存穿透的基本原因有两个:1、自身业务代码或者数据出现问题比如,我们数据库
2022-01-12 11:32:35
628
原创 如何保障 MySQL 和 Redis 之间的数据一致性
1. 数据一致性我们知道,Redis 主要是用来做缓存使用,只要使用到缓存,无论是本地内存做缓存还是使用 Redis 做缓存,那么就会存在数据同步的问题。一般情况下,我们都是先读缓存数据,缓存数据有,则立即返回结果;如果没有数据,则从数据库读数据,并且把读到的数据同步到缓存里,提供下次读请求返回数据。这样能有效减轻数据库压力,但是如果修改删除数据库中的数据,而内存是无法感知到数据在数据库的修改。这样就会造成数据库中的数据与缓存中数据不一致的问题,那该如何解决呢?通常的方案有以下几种:先更新缓存
2022-01-11 10:14:33
676
3
原创 如何保证 Redis 高可用和高并发(主从+哨兵+集群)
1. 概述Redis 作为一种高性能的内存数据库,普遍用于目前主流的分布式架构系统中。为了提高系统的容错率,使用多实例的 Redis 也是必不可免的,但同样复杂度也相比单实例高出很多。那么如何保证 Redis 的高并发和高可用?Redis 主要有三种集群方式用来保证高并发和高可用:主从复制,哨兵模式和集群。2. 主从复制在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到其他机器,满足故障恢复和负载均衡等需求。Redis 也是如此,它为我们提供了复制功能,实现了相同数据的多个 Redis
2022-01-03 10:53:04
5175
11
原创 一文理解 Redis 持久化:RDB和AOF
1. 概述我们知道 Redis 是一个内存数据库,也就意味着如果我们的电脑异常重启或者服务器宕机的情况下,存储在 Redis 中的数据会丢失。Redis 虽然是个内存数据库,但是 Redis 支持 RDB 和 AOF 两种持久化机制,将数据写往磁盘,可以有效地避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据恢复。2. RDBRDB(Redis DataBase) 持久化是把当前进程数据生成快照保存到硬盘的过程。什么是快照?你可以理解成把当前时刻的数据拍成一张照片保存下来
2021-12-29 21:23:04
1372
5
原创 Redis高级特性【事务】
什么是事务对事务的说法已经说得不能再多了,简单来说就是示一组动作,要么全部执行,要么全部不执行。如在社交网站上用户 A 关注了用户 B,那么需要在用户 A 的关注表中加入用户 B,并且在用户 B 的粉丝表中添加用户 A,这两个行为要么全部执行,要么全部不执行,否则会出现数据不一致的情况。Redis 中的事务Redis 事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序
2021-12-27 23:25:08
694
原创 Redis高级特性【慢查询】
什么是慢查询许多存储系统(例如 MySQL)提供慢查询日志帮助开发和运维人员定位系统存在的慢操作。所谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阀值,就将这条命令的相关信息(例如:发生时间,耗时,命令的详细信息)记录下来,Redis 也提供了类似的功能。Redis 客户端执行一条命令分为如下 4 个部分:需要注意的是,慢查询只统计步骤 3 的时间,所以没有慢查询并不代表客户端没有超时问题。慢查询配置对于任何慢查询功能,需要明确两件事:多慢算慢,也就是预设阀值怎么设置?慢
2021-12-23 23:25:14
614
原创 Redis常用数据结构及应用场景
1. 概述Redis 一个开源的基于键值对(Key-Value)NoSQL 数据库。使用 ANSIC 语言编写、支持网络、基于内存但支持持久化。性能优秀,并提供多种语言的 API。我们要首先理解一点,我们把 Redis 称为 KV 数据库,键值对数据库,那就可以把 Redis 内部的存储视为存在着一个巨大的 Map,对 Map 的操作无非就是get 和 put,然后通过 key 操作这个 key 所对应的 value,而这个 value 的类型可以多种多样,也就是 Redis 为我们提供的那些数据结构,
2021-12-22 09:43:23
1010
原创 递归和迭代的区别
递归递归(recursion):递归常被用来描述以自相似方法重复事物的过程,在数学和计算机科学中,指的是在函数定义中使用函数自身的方法。(如A调用A)小时候听过这样一个故事:从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事;从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事;从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事…这个故事没完没了,这就是递归的一种表现形式,只是由于故事没有结束条件,也就是递归无法结束,除非老和尚挂了。还有个浅显易懂的例子:假如你在电影院
2021-12-20 22:11:01
537
原创 一文搞懂MySQL的MVCC原理及如何解决幻读
在之前的文章中详细的介绍了 MySQL 中的事务和隔离级别,在并发访问数据库造成的问题(脏读、不可重复读、幻读),而 MVCC 就是在尽量减少锁使用的情况下高效避免这些问题。
2021-12-15 23:06:14
5352
4
原创 一文了解 MySQL 中的锁
1. 数据库并发场景在高并发场景下,不考虑其他中间件的情况下,数据库会存在以下场景:读读:不存在任何问题,也不需要并发控制。读写:有线程安全问题,可能会造成事务隔离性问题,可能遇到脏读,幻读,不可重复读。写写:有线程安全问题,可能会存在更新丢失问题,比如第一类更新丢失,第二类更新丢失。针对以上问题,SQL 标准规定不同隔离级别下可能发生的问题不一样:MySQL 四大隔离级别:隔离级别脏读不可重复读幻读READ UNCOMMITTED:未提交读可能发生可能发生可
2021-12-14 21:15:43
2514
原创 InnoDB 存储引擎介绍
1. MySQL 基础架构前面写过几篇 MySQL 的文章,大多是对一些基础概念的讲解,当我想去了解存储引擎的时候发现不知从何下手,或者说不知道如何开头,回头想想好像对 MySQL 的基础架构还不是特别熟悉,所以本文尽管是介绍 InnoDB 存储引擎,但也会大致讲解一下 MySQL 的基础架构。先看这样一张图(网上找的):可以看出 MySQL 最上层是连接组件。下面服务器是由连接池、管理工具和服务、SQL 接口、解析器、优化器、缓存、存储引擎、文件系统组成。看的懂吗?看不懂。没事,咱翻译一下:
2021-12-09 14:34:56
1963
原创 MySQL性能优化:SQL慢查询优化,索引优化,表优化
1. MySQL优化概述MySQL 优化是一个综合性的技术,在优化上存在着一个调优金字塔的说法,如下:很明显从图上可以看出,越往上走,难度越来越高,收益却是越来越小的。比如硬件和 OS 调优,需要对硬件和 OS 有着非常深刻的了解,仅仅就磁盘一项来说,一般非 DBA 能想到的调整就是 SSD 盘比用机械硬盘更好,但其实它至少包括 了,使用什么样的磁盘阵列(RAID)级别、是否可以分散磁盘 IO、是否使用裸设备存放数据,使用哪种文件系统(目前比较推荐的是 XFS),操作系统的磁盘调度算法(目前比较推荐
2021-12-07 10:02:42
1409
6
原创 MySQL建立合理的数据类型
1. 概述MySQL 支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要。不管存储哪种类型的数据,下面几个简单的原则都有助于做出更好的选择。2. 基本原则2.1 越小越好一般情况下,应该尽量使用可以正确存储数据的最小数据类型。更小的数据类型通常更快,因为它们占用更少的磁盘、内存和 CPU 缓存,并且处理时需要的 CPU 周期也更少。但是要确保没有低估需要存储的值的范围,因为在的多个地方增加数据类型的范围是一个非常耗时和痛苦的操作。如果无法确定哪个数据类型是最好的,就选择你认为不会超过范
2021-11-29 20:35:42
1098
原创 使用BeanUtils.copyProperties引发的问题
概述对象之间的转换在开发中是最常见的,实体对象和数据显示层(VO,DTO等)的转换,通常有 2 种做法:set 方法赋值,这种方式一般使得代码冗余,而且极不美观;对象拷贝工具类,如 Spring 的 BeanUtils.copyProperties 。而我最近在使用 Spring 的拷贝工具类的时候碰到了属性值丢失的情况,先看这样一个栗子。订单实体类到 VO 层的转换:转换后的结果如下:从上面可以看到 2 个问题:对象 copy 后没有 id 并没有赋值;VO 对象的改变影响了原
2021-11-25 09:51:16
4848
7
原创 MySQL的事务和隔离级别
什么是事务事务是数据库管理系统(DBMS)执行过程中的一个逻辑单位(不可再进行分割),由一个有限的数据库操作序列构成(多个DML语句,select语句不包含事务),要不全部成功,要不全部不成功。如 A 给 B 要划钱,A 的账户-1000 元, B 的账户就要+1000 元,这两个 update 语句必须作为一个整体来执行,不然 A 扣钱了,B 没有加钱这种情况就是错误的。那么事务就可以保证 A 、B 账户的变动要么全部一起发生,要么全部一起不发生。事务特性事务具有 4 个属性:原子性(atomic
2021-11-24 11:03:30
1696
6
原创 数据库三大范式
概述良好的表结构设计是高性能的基石,应该根据系统将要执行的业务查询来设计,这往往需要权衡各种因素。糟糕的表结构设计,会浪费大量的开发时间,严 重延误项目开发周期,让人痛苦万分,而且直接影响到数据库的性能,并需要花费大量不必要的优化时间,效果往往还不怎么样。在数据库表设计上有个很重要的设计准则,称为范式设计。三范式范式来自英文 Normal Form,简称 NF。要想设计—个好的关系,必须使关系满足一定的约束条件,此约束已经形成了规范,分成几个等级,一级比一级要求 得严格。满足这些规范的数据库是简洁的
2021-11-23 11:43:35
1880
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人