- 博客(114)
- 收藏
- 关注
原创 LeetCode 5.最长回文子串
题目描述给定一个字符串 s,找到 s 中最长的回文子串。你可以假设s 的最大长度为 1000。示例 1:输入: "babad"输出: "bab"注意: "aba" 也是一个有效答案。示例 2:输入: "cbbd"输出: "bb"题解方法一:暴力法思路遍历所有子字符串,判断是否为回文字符串。算法 public String long...
2022-04-05 00:12:30
331
原创 LeetCode 136.只出现一次的数字
题目描述给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 1:输入: [2,2,1]输出: 1示例2:输入: [4,1,2,1,2]输出: 4题解思路利用异或的性质:0 ^ a = a; a ^ a = 0。 ...
2022-04-05 00:12:11
210
原创 LeetCode 4.寻找两个有序数组的中位数
题目描述给定两个大小为 m 和 n 的有序数组nums1 和nums2。请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为O(log(m + n))。你可以假设nums1和nums2不会同时为空。示例 1:nums1 = [1, 3]nums2 = [2]则中位数是 2.0示例 2:nums1 = [1, 2]nums2 = [3, ...
2022-04-05 00:11:51
4296
原创 五、MySQL数据类型
1、数据类型选取的基本原则MySQL支持多种数据类型,为了尽可能提高MySQL性能,需要选取合适的数据类型,通常来说,可以遵循以下原则:选取更小的数据类型:使用可以满足数据存储需求的更小的数据类型,可以节约存储空间,减少对磁盘、内存、CPU缓存资源的占用。尽量避免NULL:除非真的需要存储NULL值,否则应该将列都设置为NOT NULL。对允许为NULL的列,其索引会更加复杂。2、字符串类型varchar与char是MySQL中最基本的字符串类型。它们的具体实现与存储引擎相关,具体如下:
2022-03-30 23:49:52
729
原创 三、MySQL并发控制
当有多个连接对MySQL表中数据进行并发读写时,就会产生并发问题。为了避免并发问题,MySQL中引入了相关的锁。1、MySQL的锁机制1.1、读写锁当多个客户端同时读取表中的数据时,不会产生并发问题。但是当有客户端在写入数据时,其他客户端来读取数据就会产生并发问题。为了提高并发程度,MySQL中使用了读写锁的机制。读锁(共享锁):读锁是共享的,读锁之间是相互不阻塞的。多个客户端在同一时刻可以共同读取同一资源。写锁(排它锁):写锁是互斥的,一个写锁会阻塞其他的写锁和读锁。一个用户加了写
2022-03-27 23:18:30
2893
原创 十一、Redis常见面试题
一、举例Redis每种数据结构的使用场景1.1、String类型使用场景信息缓存:如token、session 计数器:如记录用户的访问次数 分布式锁1.2、Hash的使用场景以购物车为例,用户id为key,hash里面存储添加到购物车的商品id和对应的数量1.3、List的使用场景定时排行榜。每隔一段时间计算出一个排行榜, 可将其存放在list中。不适用于实时排行榜。1.4、Set的使用场景如音乐app中收藏的歌单可以使用set进行存储1.5、Zset的使用场景实时排行
2022-03-13 23:11:33
1479
原创 九、Redis三种集群模式
系统中只有一台redis服务器是不可靠的,容易出现单点故障。为了避免单点故障,可以使用多台redis服务器组成redis集群。redis支持三种集群模式。一、主从模式至少需要两台redis服务器,一台主节点(master)、一台从节点(slave),组成主从模式的Redis集群。通常来说,master主要负责写,slave主要负责读,主从模式实现了读写分离。集群中有多台redis节点,就必须保证每个节点中的数据是一致的。redis中,为了保持数据一致性,数据总是从master复制到slave
2022-03-13 22:28:23
28477
3
原创 八、Redis缓存穿透、击穿、雪崩
一、缓存穿透1.1、问题描述客户端不断访问缓存和数据库中都没有的数据,导致数据库压力增大。2.1、解决方案缓存空对象,缺点(容易浪费大量缓存空间) 在缓存前端加一个布隆过滤器布隆过滤器的特点:布隆过滤器判断没有的元素,则一定没有;判断有的元素,可能也会没有。布隆过滤器的原理:二、缓存击穿2.1、问题描述2.2、解决方案三、缓存雪崩3.1、问题描述3.2、解决方案...
2022-03-13 21:18:44
1703
原创 【剑指offer】连续子数组的最大和
题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序...
2022-03-13 20:53:28
72
原创 七、Redis持久化
1、概述Redis是基于内存的缓存数据库,为了提高性能,所有数据都是存放在内存中的。一旦发生故障,导致Redis服务器宕机,内存中的数据都会丢失。为了在故障发生后能够找回Redis内存中的数据,可以将Redis中内存数据以某种策略持久化到硬盘中,故障恢复时从硬盘中读取数据到内存中,就可以恢复Redis的数据,这就是Redis的持久化。Redis提供了两种方式的持久化,分别如下:RDB(Redis DataBase) AOF(Append Of File)方式 RDB AOF
2022-03-13 20:42:52
1199
原创 六、Redis事务
1、Redis事务的定义Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。(Redis是单线程的)Redis事务的主要作用就是串联多个命令防止别的命令插队。2、Redis事务命令:multi、exec、discard从输入Multi命令开始,输入的命令都会依次进入命令队列中,但不会执行,直到输入Exec后,Redis会将之前的命令队列中的命令依次执行。组队的过程中可以通过discard来放弃组队。
2022-03-13 18:41:13
231
原创 四、MySQL索引
一、索引是什么索引是存储引擎用于快速查找表中记录的一种数据结构,这也是索引的基本功能。可以将索引类比于书籍的目录:如果没有目录,需要查找书中的内容时,就需要从书的第一页开始顺序查找书的每一页,直到查找命中;在有目录的情况下,就可以根据目录,快速定位到要查找的内容位于书中的哪一页,极快提高查询速度。对于存储引擎也是一样的:在没有索引的情况下,就只能逐行遍历表中数据进行查找;在有索引的情况下,就可以根据索引快速查找到相应的索引记录,然后再根据索引记录中的数据快速定位到数据库表中的行记录,完成数据的快
2022-03-13 18:22:49
594
原创 五、Redis的发布与订阅
1、什么是发布和订阅Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。Redis 客户端可以订阅任意数量的频道2、Redis的发布与订阅2.1、客户端可以订阅频道如下图2.2、 当给这个频道发布消息后,消息就会发送给订阅的客户端3、发布与订阅的命令行实现3.1、打开一个客户端订阅channel1SUBSCRIBEchannel13.2、 打开另一个客户端,给channel1发布消息hel.
2022-02-27 13:17:11
701
原创 四、Redis配置文件简介
1、Units单位配置大小单位,开头定义了一些基本的度量单位,只支持bytes,不支持bit。大小写不敏感# Redis configuration file example.## Note that in order to read the configuration file, Redis must be# started with the file path as first argument:## ./redis-server /path/to/redis.conf# Not
2022-02-27 13:11:00
306
原创 三、Redis五种主要数据类型
根据前面介绍,Redis是一个基于key-value的非关系型数据库。Redis中的key是一个字符串,value支持多种数据类型。常见的有如下5中数据类型:String、List、Set、Hash、Zset。在详细介绍Redis的五种value数据类型之前,首先简单介绍一下Redis常用的关于key的命令:keys * 查看当前库所有key (匹配:keys *1)exists key 判断某个key是否存在type key 查看key是什
2022-02-25 22:22:22
797
原创 二、Redis概述
1、NoSQL数据库概述NoSQL(Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库。NoSQL不依赖业务逻辑方式存储,而以简单的key-value模式存储。因此大大的增加了数据库的扩展能力。不遵循SQL标准。 不支持ACID。 远超于SQL的性能。1.1、NoSQL适用场景 对数据高并发的读写 海量数据的读写 对数据高可扩展性的1.2、NoSQL不适用场景需要事务支持 基于sql的结构化查询存储,处理复杂的关系,需要即席查询。 用不着sql的和
2022-02-23 22:27:36
149
原创 一、Redis安装
Redis官网:https://redis.io/一、环境准备Linux环境上需要安装GCCyum install centos-release-scl scl-utils-buildyum install -y devtoolset-8-toolchainscl enable devtoolset-8 bash查看gcc版本二、安装Redis1、下载Redis安装包,上传到Linux环境2、创建/opt/redis目录,并解压redis到该目录3、解压完.
2022-02-23 22:01:40
1029
转载 四、Zookeeper分布式锁
原文链接:Zookeeper 分布式锁 - 图解 - 秒懂_架构师尼恩-优快云博客_zookeeper分布式锁一、Zookeeper分布式锁的原理根据前面介绍,ZooKeeper节点类型中,有一种临时顺序节点(EPHEMERAL_SEQUENTIAL),在创建这种节点时,Zookeeper会自动为新创建的节点加上一个次序编号,而这个生成的次序编号,是上一个的节点的次序编号加一。Zookeeper的分布式锁就是基于这种临时顺序节点实现的。例如,有一个节点“/test/lock”,可以在这个节
2022-02-21 22:22:01
899
原创 三、Zookeeper内部原理
1、选举机制(重点)半数机制:集群中半数以上机器存活,集群可用。所以 Zookeeper 适合安装奇数台服务器。Zookeeper 虽然在配置文件中并没有指定 Master 和 Slave。 但是, Zookeeper 工作时,是有一个节点为 Leader,其他则为 Follower, Leader 是通过内部的选举机制临时产生的。以一个简单的例子来说明整个选举的过程:假设有五台服务器组成的 Zookeeper 集群,它们的 id 从 1-5,同时它们都是最新启动的,也就是没有历史数据,在存放
2022-02-13 22:37:02
254
原创 二、Zookeeper单机模式安装
1、下载地址官网首页:Apache ZooKeeper2、单机模式安装2.1、安装前准备安装JDK 拷贝Zookeeper安装包apache-zookeeper-3.6.3-bin.tar.gz到Linux机器上面 解压到/opt/zookeeper/目录:tar -zxvf apache-zookeeper-3.6.3-bin.tar.gz -C /opt/zookeeper/2.2、修改配置将/opt/zookeeper/apache-zookeeper-3.6.3-bi
2022-02-13 21:03:15
1150
原创 一、Zookeeper入门
1、概述2、特点3、数据结构4、应用场景提供的服务包括:统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等。4.1、统一命名服务4.2、统一配置管理4.3统一集群管理4.4、服务器动态上下线4.5、软负载均衡...
2022-02-13 17:23:33
855
原创 HDFS理论基础
1.存储模型2.架构设计3.角色功能PS:角色对应的就是一个或者多个进程4.元数据持久化5.安全模式HDFS合并EditLog与FsImage的过程:HDFS启动前会进行格式化,生成一个空的FsImage,假设HDFS集群在8:00时进行第一次初始化启动 8:00 - 9:00 期间,对HDFS的操作记录在EditLog中,NameNode内存中存储了相关的元数据,但是此时硬盘中的FsImage还是空的 假设9点到达checkpoint,S
2021-12-19 19:03:25
902
原创 大数据思维引导
1、需求有一个大小为1TB的文件,里面有许多行,其中只有两行一样,这两行的位置未知,需要找出这两行。2、单机处理思路假设如下:单机可用内存500M IO速度为500M/s,读取1TB的文件约2000s,约30分钟。与硬盘IO时间相比,CPU计算以及内存存取时间可以忽略。因此,以下估算中,主要估算的是硬盘IO时间,忽略了CPU计算以及内存存取时间。最简单的思路:读取文件的第一行到内存中 读取文件的第二行,并与第一行内存做比较 如果两行内容相同,则找到结果 如果两行内容不同,.
2021-12-19 17:31:36
1045
原创 Spring源码解析之一:IOC原理概览
Spring两大核心模块:IOC与AOP。IOC即控制反转,其基本原理或者核心场景就是依赖注入。Spring实现依赖注入的前提肯定是Spring里面管理了所有自动注入的实例Bean对象,也即是Spring自动将所有需要的对象都实例化了,并放置在某个地方。当Spring遇到需要自动注入或者其他需要使用对象的场景时,就从它放置对象的地方取出来即可。Spring放置这些实例化Bean对象的地方就是我们常说的IOC容器,其本质就是一个map。在开发应用程序时,有多种方式告诉Spring需要为我们管理哪.
2021-11-25 00:00:54
287
原创 一、Springboot常用注解@Configuration
1、@Configuration注解可以标注在类的上方,标明这是一个配置类。一个配置类类似于spring中的配置文件(beans.xml)。如下MyConfig是一个配置类。springboot启动时,会生成一个MyConfig的实例对象,并将其放到IOC容器中。同时,可以在配置类中的方法上面使用注解@Bean,springboot启动时会调动该方法,并将该方法的返回值对象放入到IOC容器中,在没有指定对象名时,该对象的名称默认就是方法名。// @Configuration 告诉SpringBo.
2021-09-21 16:45:20
753
原创 反射二、Class类常用方法
Class类中,包括如下几个常用的方法,其作用如下表所示:方法名 作用 getField(String name) 获取类中指定名称的public属性,包括继承自父类的public属性 getFields 获取类中所有的public属性,包括继承自父类的public属性 getDeclaredField(String name) 获取类本身定义的指定名称的属性,包括public/protected/default/
2021-09-19 15:33:06
340
原创 三、MySQL并发控制、事务与隔离级别
1、事务的特性数据库的事务可以简单理解为是一组SQL语句。对于事务内的SQL语句,要么全部执行成功,要么全部执行失败。事务具有四大特性(ACID):原子性(Atomicity)一个事务是一个不可分割的最小工作单元,事务包含的所有操作要么全部提交成功,要么全部失败回滚。一致性(Consistency)数据库总是从一个一致性状态转换到另一个一致性状态。拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是
2021-09-08 23:33:15
1045
原创 一、MySql常用命令
本文参考《MySQL必知必会》,对其中的常用命令进行了总结。数据中预置了6张表,并分别预埋了一定的实验数据,表结构分别如下:1、select语句1.1、基本select语句选择一列select prod_name from products;选择多列,每列用逗号“,”隔开select prod_id, prod_name, prod_price from products;选择所有列,使用通配符*,非必要情况最好不用通配符,会降低性能。s...
2021-09-04 18:01:31
149
原创 四、死锁简介
死锁,是指多个线程在竞争锁资源时,由于获取不到锁,导致线程的执行流程无限期卡住的情况。例如以下代码,t1线程首先获取了lockA,t2线程获取了lockB;t1线程需要再获取lockB之后才能释放lockA,而t2线程又需要获取lockA之后才能释放lockB。这就导致两个线程各自持有了一把锁,都在等待获取对方持有的另一把锁,而且在获取到对方持有的锁之前,两个线程都不会释放自己已持有的锁。这就如同进入了一个死胡同,两个线程的执行流程就被无限期阻塞,也就是出现了死锁情况。public class De.
2021-08-30 23:47:44
186
原创 二、volatile关键字
volatile是JVM中最轻量级的同步机制,当一个变量被定义为volatile变量之后,它将具备两个特性,一是保证此变量对所有线程的可见性,而是禁止指令重排序。1、可见性变量对所有线程的可见性指的是,当一个线程修改了这个变量的值,新的值对于其他线程来说是可以立即可见的,也就是其他线程再读取这个变量时,总是能读取到这个变量的最新值。而普通变量由于Java内存模型中线程的工作内存的存在,是做不到这点的。比如一个普通变量,线程A修改了它的值,线程B只有等待线程A将普通变量的值回写到主内存中之后,然后再从
2021-08-29 15:41:39
108
原创 一、Java内存模型
此处讨论的Java内存模型与Java虚拟机中的运行时内存区域不是从同一个角度讨论的,JVM运行区域是根据内存的功能和作用进行划分的,而Java内存模型是从多线程角度抽象出来的一个逻辑模型,不能将两者一一对应。1、物理机的内存模型由于存储设备和和处理器的的运算速度存在几个数量级的差距,因此,现代计算机系统中加入了高速缓存来解决这个问题:将需要用到的数据从内存中复制一份到高速缓存中,处理器从高速缓存中存取数据,再将计算后的数据从高速缓存中写回内存,这样就可以提高处理器存取数据的速度。但是..
2021-08-29 13:36:42
105
原创 四、JVM类加载机制
Java代码编写好之后,需要将其编译成Class文件,才能被JVM虚拟机执行。JVM将Class文件加载到内存,并对其进行校验、转换解析和初始化,最终形成可以直接被JVM使用的Java类型,就是JVM的类加载机制。Java是一门动态语言,也就是在Java里面,类型的加载、连接和初始化过程是在程序的运行期间完成的。例如:如果编写一个面向接口的程序,可以等到在运行时再指定其实际的实现类。(C语言的链接过程是在编译期间完成的,C通过编译链接之后会直接生成一个可执行文件。)1、类加载的时机类从被加载到J
2021-08-22 23:39:03
101
原创 三、JVM常用命令
除了最常使用的javac、java两个命令,JVM中还提供了一些其他的命令,可以用来分析JVM中的各项数据和性能。名称 主要作用 jps JVM Process Status Tool,显示指定系统内正在运行的所有的HotSpot虚拟机进程 jstat JVM Statistics Monitoring Tool, 收集JVM各方面的运行数据 jinfo Configuration for Java, 显示JVM配置信息 jmap Memory Map fo
2021-08-22 11:44:17
155
原创 二、JVM垃圾回收与内存分配策略
Java与C++的一个不同点在于,C++需要手动分配和清理内存,而Java中,内存的分配和回收是由JVM自动进行的。1、对象存活判断算法JVM中,对内存自动回收之前,首先需要做的就是判断一个对象是否仍然存活。判断对象是否存活时有两种算法。引用计数算法:给每一个对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1。当计数器值为0时,这个对象就不可能再被使用,因此判断其不再存活,可以被回收。引用计数算法实现简单,但是主流的JVM里面并未使用这种算法,其中最
2021-08-21 17:23:38
180
原创 一、JVM内存区域
1、运行时数据区域JVM虚拟机在执行Java程序时,会把它所管理的内存划分为若干个不同的内存区域,如下图所示。这些区域有着各自的用途,它们的生命周期也各不相同。其中,方法区和堆的生命周期与JVM虚拟机相同,随着虚拟机进程的启动而存在,因此,它们也是所有Java线程共享的数据区域;而虚拟机栈、本地方法栈和程序计数器,它们的生命周期与用户线程相互依赖,随着用户线程的启动和结束而对应地创建和销毁,因此,它们也是线程私有的数据区域,也就是每个线程都有各自的虚拟机栈、本地方法栈和程序计数器。各个数据区域.
2021-08-20 23:41:12
539
6
原创 常用类一、理解String类
package java.lang;import java.io.ObjectStreamField;import java.io.UnsupportedEncodingException;import java.nio.charset.Charset;import java.util.ArrayList;import java.util.Arrays;import java.ut...
2021-08-18 23:08:29
217
原创 排序算法简介及Java实现
常见的排序算法有冒泡排序,选择排序,插入排序,希尔排序,快速排序,归并排序,堆排序。其中,各算法的时间复杂度和空间复杂度如下表所示算法比较 算法 时间复杂度(平均情况) 空间复杂度 时间复杂度(最坏情况) 算法稳定性 冒泡排序 N*N 1 N*N 稳定 选择排序 N*N 1 N*N 不稳定? 插入排序 ...
2021-08-08 16:34:40
84
原创 【剑指offer】构建乘积数组
题目描述给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。题解import java.util.ArrayList;public class Solution { public int[] multiply(int[] ...
2019-09-16 14:49:11
97
原创 【剑指offer】数组中重复的数字
题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。题解import java.util.*;public class Solution { // Pa...
2019-09-16 12:00:24
90
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人