自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(127)
  • 收藏
  • 关注

原创 三种加密方式

但是,由于输出的密文是提取原数据经过处理的定长值,所以它已经不能还原为原数据,即消息摘要算法是不可逆的,理论上无法通过反向运算取得原数据内容,因此它通常只能被用来做数据完整性验证。有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,同时解密密钥也可以从加密密钥中推算出来。而在大多数的对称算法中,加密密钥和解密密钥是相同的,所以也称这种加密算法为秘密密钥算法或单密钥算法。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信的安全性至关重要。

2024-05-30 17:45:06 295

原创 git生成密钥(免密)

当系统提示你“Enter a file in which to save the key”,直接按回车键接受默认位置。将生成的密钥放到github/gitee/gitlab,以后git push代码的时候不再需要每次都输入密码了。在提示你输入密码的时候,直接按回车键,生成没有密码的SSH密钥。参数后面跟的是你的邮箱地址,通常用于标识这个密钥。打开Git Bash。

2024-05-29 16:55:53 307

原创 Redis指令汇总(二)

第一行可以看到redis版本信息,后面还有操作系统(我这里用的是windows,所以是os:Windows),进程id,执行程序的位置,配置文件的位置。当 key 存在但没有设置剩余生存时间时,返回 -1。否则,以秒为单位,返回 key 的剩余生存时间。在 Redis 2.8 以前,当 key 不存在,或者 key 没有设置剩余生存时间时,命令都返回 -1。在本例中,我们移除了key的过期时间,使其永久有效(ttl返回-1代表这个key永久有效)7.randomkey随机返回key空间的一个key。

2024-05-19 10:37:29 145

原创 一条sql语句在mysql中是怎么执行的

连接器主要和身份认证和权限相关的功能相关,就好比一个级别很高的门卫一样。主要负责用户登录数据库,进行用户的身份认证,包括校验账户密码,权限等操作,如果用户账户密码已通过,连接器会到权限表中查询该用户的所有权限,之后在这个连接里的权限逻辑判断都是会依赖此时读取到的权限数据,也就是说,后续只要这个连接不断开,即时管理员修改了该用户的权限,该用户也是不受影响的。

2024-05-17 14:10:29 686

原创 BM11 链表相加(二)

例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。数据范围:0≤𝑛,𝑚≤10000000≤n,m≤1000000,链表任意值 0≤𝑣𝑎𝑙≤90≤val≤9。假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。要求:空间复杂度 𝑂(𝑛)O(n),时间复杂度 𝑂(𝑛)O(n)给定两个这种链表,请生成代表两个整数相加值的结果链表。输入:[9,3,7],[6,3]返回值:{1,0,0,0}输入:[0],[6,3]

2024-05-14 14:53:53 374

原创 BM10 两个链表的第一个公共结点

输入分为是3段,第一段是第一个链表的非公共部分,第二段是第二个链表的非公共部分,第三段是第一个链表和第二个链表的公共部分。后台会将这3个参数组装为两个链表,并将这两个链表对应的头节点传入到函数FindFirstCommonNode里面,用户得到的输入只有pHead1和pHead2。第一个参数{1,2,3}代表是第一个链表非公共部分,第二个参数{4,5}代表是第二个链表非公共部分,最后的{6,7}表示的是2个链表的公共部分。输入:{1,2,3},{4,5},{6,7}输入:{1},{2,3},{}

2024-05-14 14:21:39 447

原创 BM8 链表中倒数最后k个结点

过于简单,不再赘述。

2024-05-12 22:59:18 250

原创 BM7 链表中环的入口结点(快慢指针模板题)

输入分为2段,第一段是入环前的链表部分,第二段是链表环的部分,后台会根据第二段是否为空将这两段组装成一个无环或者有环单链表。思路:建立在上一道基础上,如果已知成环,慢指针移动到链表头部,快慢指针以1的步长去移动,直到两者相遇,有环必相遇。数据范围: 𝑛≤10000n≤10000,1<=结点值<=100001<=结点值<=10000。给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。可以看到环的入口结点的结点值为3,所以返回结点值为3的结点。

2024-05-12 22:20:34 314

原创 BM6 判断链表中是否有环(快慢指针模板题)

输入分为两部分,第一部分为链表,第二部分代表是否有环,然后将组成的head头结点传入到函数里面。-1代表无环,其它的数字代表有环,这些参数解释仅仅是为了方便读者自测调试。实际在编程时读入的是链表的头节点。数据范围:链表长度 0≤𝑛≤100000≤n≤10000,链表中任意节点的值满足 ∣𝑣𝑎𝑙∣<=100000∣val∣<=100000。可以看出环的入口结点为从头结点开始的第1个结点(注:头结点为第0个结点),所以输出true。要求:空间复杂度 𝑂(1)O(1),时间复杂度 𝑂(𝑛)O(n)

2024-05-12 21:10:25 147

原创 BM5 合并k个已排序的链表

数据范围:节点总数 0≤𝑛≤50000≤n≤5000,每个节点的val满足 ∣𝑣𝑎𝑙∣<=1000∣val∣<=1000。需要借助BM4写的代码,看我上一篇博客。然后从左向右每两个链表之间一一合并,得到最终结果。合并 k 个升序的链表并将结果作为一个升序的链表返回其头节点。要求:时间复杂度 𝑂(𝑛𝑙𝑜𝑔𝑛)O(nlogn)

2024-05-12 20:39:31 172

原创 BM4 合并两个排序的链表

【代码】BM4 合并两个排序的链表。

2024-05-12 17:12:55 189

原创 手写阻塞队列(Condition)

自己实现阻塞队列的话可以采用Object下的wait和notify方法,也可以使用Lock锁提供的Condition来实现,本文就是自己手撸的一个简单的阻塞队列,部分借鉴了JDK的源码ArrayBlockingQueue类。1.BlockingQueue接口。2.数组方式实现阻塞队列。

2024-05-12 12:05:46 723

原创 责任链模式案例

请你设计一个员工休假审批流程,当员工的休假天数

2024-05-09 17:55:59 265

原创 LCR 062. 实现 Trie (前缀树)

更具体地说,如果我们在前缀树中插入一个字符串 S,我们要从根节点开始。我们将根据 S[0](S中的第一个字符),选择一个子节点或添加一个新的子节点。末端节点将是表示字符串 S 的节点。当我们在二叉搜索树中插入目标值时,在每个节点中,我们都需要根据 节点值 和 目标值 之间的关系,来确定目标值需要去往哪个子节点。同样地,当我们向前缀树中插入一个目标值时,我们也需要根据插入的 目标值 来决定我们的路径。每一个节点会有多个子节点,通往不同子节点的路径上有着不同的字符。子节点代表的字符串是由节点本身的。

2024-05-09 16:07:34 225

原创 Mapper代理逻辑模拟(自己留存)

【代码】Mapper代理逻辑模拟(自己留存)

2024-05-09 12:07:30 259

原创 多线程交替打印ABC(共享变量)

注意如果不满足条件要及时让出CPU,防止陷入死循环。

2024-05-09 09:46:22 215

原创 Countdown控制线程同时开始执行

不是同时启动的,但是线程都会阻塞在latch.await这里,直到最后一层循环,latch.countdown所有的线程被唤醒开始执行。

2024-05-09 09:11:47 112

原创 Future计算某盘符文件夹数量

------------------------------------------手动分割线-------------------------------------------------任务没有执行完,会阻塞到get方法,只有执行完返回结果,才会解除阻塞往下执行。计算前20个文件夹中文件数量。

2024-05-08 23:40:19 201

原创 类加载器aa

自定义类加载器需要继承java.lang.ClassLoader类,这个类有两个核心方法,一个是loadClass,这个是真正意义上双亲委派机制的实现类。是loadClass来层层委派的,而findClass就是去查找管辖范围内有没有这个类,有的话尝试加载,这个方法是一个具体加载的位置。findClass是尝试自己加载这个类,如果说自己的管辖范围内没这个类,我没这个能力加载,那就返回调用者(向下加载)。findLoadedClass当前类加载器是否加载过这个类,当然首次加载肯定没有。为什么根加载器是空?

2024-05-07 23:04:50 307

原创 场景:因异常未正确处理导致OOM内存泄漏

本文模拟一个项目调优的场景,topic如标题所言,异常处理不当导致OOM内存泄漏。

2024-05-05 20:56:46 178

原创 线程池和CountDownLatch搭配使用

在本人所从事的项目中就有类似的情况,因为我们使用的图片服务只提供了获取单个图片的功能,而每次获取图片的时间不等,一般都需要1.5s~2s。场景一:CountDownLatch 非常适合于对任务进行拆分,使其并行执行,比如某个任务执行2s,其对数据的请求可以分为五个部分,那么就可以将这个任务拆分为5个子任务,分别交由五个线程执行,执行完成之后再由主线程进行汇总,此时,总的执行时间将决定于执行最慢的任务,平均来看,还是大大减少了总的执行时间。的计数值,当计数值减到0时,所有等待的线程都会被唤醒。

2024-05-05 20:01:32 511 1

原创 任务调度梳理合集-分布式任务调度解决方案

通常任务调度的程序是集成在应用中的,比如:优惠卷服务中包括了定时发放优惠卷的的调度程序,结算服务中包括了定期生成报表的任务调度程序,由于采用分布式架构,一个服务往往会部署多个冗余实例来运行我们的业务,在这种分布式系统环境下运行任务调度,我们称之为。执行器接收调度请求去执行任务,要有办法去判断该任务是否处理完成,如果处理完则不再处理,即使重复调度处理相同的任务也不能重复处理相同的视频。任务添加成功后,对于要处理的任务会添加到待处理任务表中,现在启动多个执行器实例去查询这些待处理任务,

2024-05-05 19:53:18 885

原创 任务调度梳理合集-解决方案

Java 5 推出了基于线程池设计的 ScheduledExecutor,其设计思想是,每一个被调度的任务都会由线程池中一个线程去执行,因此任务是并发执行的,相互之间不会受到干扰。Timer 的优点在于简单易用,每个Timer对应一个线程,因此可以同时启动多个Timer并行执行多个任务,同一个Timer中的任务是串行执行。任务调度顾名思义,就是对任务的调度,它是指系统为了完成特定业务,基于给定时间点,给定时间间隔或者给定执行次数自动执行任务。每隔1s执行一次,在一分钟之后结束。2.基本定时器Timer。

2024-05-05 16:08:59 178

原创 Java8 Stream API 入门与实践

Stream是Java 8中一个来自Optional的接口,可以在任何对象的集合上进行一系列操作,包括中间操作(例如filter、map等)和终结操作(例如forEach、reduce等)。Stream API不会修改原始的数据集合,而是返回一个新的数据集合。Java 8的Stream API为集合操作提供了一种新的方式,它使得代码更加简洁、易读。通过函数式编程,可以以声明式风格对数据集合进行复杂的操作。理解并熟练使用Stream API,对于Java开发者来说是一项重要的技能。

2024-05-04 19:07:23 351

原创 深入理解Java泛型

max = e;return max;泛型为Java语言提供了强大的类型安全支持,使得集合操作更加安全和灵活。理解泛型的使用和原理,对于编写高质量的Java代码至关重要。这篇文章深入探讨了Java泛型的使用、类型推断、通配符、类型擦除、局限性和高级应用,适合那些希望提高自己泛型使用技巧的Java开发者。

2024-05-04 17:51:18 702

原创 Java中的异常处理机制详解

在Java中,异常是Throwable类的子类,表示程序运行时发生的不正常情况。所有的异常都是从Error:由Java虚拟机抛出,表示严重的错误,如等。通常不会尝试捕获这些异常。Exception:应用程序可以抛出和捕获的异常,又分为:未检查异常(Unchecked Exceptions):继承自,如等。检查异常(Checked Exceptions):继承自Exception类,但不是的子类,如等。异常处理是Java编程中不可或缺的一部分,正确使用异常处理机制可以提高程序的健壮性和可维护性。

2024-05-04 17:49:16 446

原创 线程池(二)

线程池。

2024-05-04 17:43:15 482

原创 Redis-三主三从高可用集群搭建

redis集群需要至少要三个master节点,我们这里搭建三个master节点,并且给每个master再搭建一个slave节点,总共6个redis节点,由于节点数较多,这里采用在一台机器上创建6个redis实例,并将这6个redis实例配置成集群模式,所以这里搭建的是伪集群模式,当然真正的分布式集群的配置方法几乎一样。PS:当出现集群无法启动时,删除临时的数据文件,再次重新启动每一个redis服务,然后重新构造集群环境。在redis3的安装目录下执行 redis-trib.rb命令创建整个redis集群。

2024-05-04 09:53:09 973

原创 Creating Server TCP listening socket xx:xx:xx:xx:8001: bind: Cannot assign requested address

conf文件bind后面是用的我自己服务器IP,但是发现就是起不来,然后查看日志发现报了这个错。我是把IP改成127.0.0.1之后再启动发现好了,应该0.0.0.0也可以。搭建redis集群的时候遇到的错误,还是不太懂为啥写IP报错。

2024-05-03 21:17:12 125 1

原创 Redis-单机安装

网盘自取吧,链接:https://pan.baidu.com/s/1KERBQaH9gCT10AGt9z0_jg?./redis-server /usr/local/redis/etc/redis.conf 使用配置文件方式启动服务端。4.进入到redis-4.0.0/src目录下,可以看到已经生成了redis-server和redis-cli。5.这一步是将常用指令和redis配置文件拎出来单独放到一个目录下面,为了好看,没有特殊含义。1.将安装包放到/usr/local目录下,并解压。

2024-05-03 19:37:50 418

原创 SQL-索引篇整理

聚簇索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页。索引需要额外的磁盘空间,并降低写操作的性能。3.使用短索引,如果对长字符串列进行索引,应该指定一个前缀长度,这样能够节省大量索引空间,如果搜索词超过索引前缀长度,则使用索引排除不匹配的行,然后检查其余行是否可能匹配。红黑树,1.每个节点都是红or黑 2.根节点是黑 3.每个叶子节点都是黑色 4.红色节点的父子节点都必须是黑的 5.从任一个节点到叶子节点的所有路径都包含相同的黑色结点。

2024-05-03 12:26:24 1473

原创 SQL-慢查询的定位及优化

设置慢查询阈值,即查询执行时间超过该阈值的SQL语句将被记录。确保MySQL实例已经启用了慢查询日志功能。

2024-05-03 11:52:37 786

原创 设计模式: 代理模式

代理模式可以在不改变对象的代码的情况下,为该对象添加额外的功能,例如延迟初始化、访问控制、日志记录、缓存等。Spring AOP通过创建目标对象的代理对象,可以在不修改目标对象的情况下,控制横切关注点(如日志、事务管理等)的执行126。通过使用代理模式,可以在不修改真实对象的情况下,控制对象的使用,并可以在代理对象中添加额外的处理逻辑。客户端通过代理对象来访问真实对象的功能,而代理对象可以在内部控制对真实对象的访问。:代理对象可以被视为对真实对象的智能引用,它在访问真实对象之前执行额外的操作。

2024-05-02 21:13:26 1191

原创 设计模式:适配器模式

这种情况下,客户(中国人)的期望接口是有一个220V的电压为电器充电,但实际的接口是仅有一个110V的电压供电器充电,这种情况下就需要采用一根电压转换器(适配器)使得110V的电压能够转换为220V的电压,供客户使用。想要建立一个可以重复使用的适配器类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口,但通过适配器使得它们都具有一致的接口。(比如老虎和飞禽,现在多了一个飞虎,在不增加实体的需求下,增加一个适配器,在里面包容一个虎对象,实现飞的接口。

2024-05-02 20:59:13 1781 1

原创 设计模式: 工厂模式

定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。主要解决接口选择的问题。我们明确地计划不同条件下创建不同实例时。让其子类实现工厂接口,返回的也是一个抽象的产品。创建过程在其子类执行。1、您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。2、在 Hibernate 中,如果需要更换数据库,工厂模式同样发挥了作用。只需简单地更改方言(Dialect)和数据库驱动(Driver),就能够实现对不同数据库的切换。

2024-05-02 19:22:33 811

原创 设计模式:建造者模式

如果使用set方式,这种可以达到灵活组合的目的,但是有两个问题,第一,必须提前设置mode,否则在判断的时候没办法校验。另外,set会让属性处于一个暴露的状态,而Rabbitmq客户端的性质是一个不可变对象,只要new出来之后,没必要set,set会破坏这种规则。假设我们要自己开发一个Rabbitmq的客户端,在不同的工作模式下,对参数的传递有相应的要求,每一种模式都有不同的参数和参数的组合。如果使用构造方法的方式,可以重载多种不同的参数组合,但是很难实现多种灵活组合。这个时候,建造者模式来了。

2024-05-02 18:31:40 718 3

原创 设计模式: 模板模式

模板模式(Template Pattern)是一种行为型设计模式,它在超类中定义了一个算法的骨架,将一些步骤延迟到子类中实现。

2024-05-02 16:41:00 683

原创 设计模式:策略模式

策略模式(Strategy Pattern)是一种常用的软件设计模式,属于行为型模式。它的目的是定义一系列算法,并将每个算法封装起来让它们可以互换使用,算法的变化不会影响使用算法的用户。策略模式常用于创建一组可互换的算法,客户端可以根据需要选择不同的算法。

2024-05-02 16:02:48 1112

原创 设计模式: 责任链模式

在这种模式中,一个请求沿着一个由多个处理对象组成的链顺序传递,直到链上的某个处理对象能够处理该请求为止。每个处理对象决定是处理该请求、拒绝它,还是将其传递给链中的下一个处理对象。赋予它们不同的错误级别,并在每个记录器中设置下一个记录器。每个记录器中的下一个记录器代表的是链的一部分。:将请求的发送者和接收者解耦,使得发送者不需要知道谁是请求的处理者,以及链的结构如何。:在运行时,可以动态地改变链的结构,例如增加或删除链中的某些处理对象。:请求发送者只需要知道链的头部,而不需要了解链的其余部分。

2024-05-02 15:22:45 855 1

原创 RabbitMQ入门案例

(1)声明交换机和两个队列,队列绑定交换机,分别设置routing key。QUEUE_INFORM_EMAIL 的routing key为ROUTINGKEY_EMAIL,QUEUE_INFORM_SMS的routing key为ROUTINGKEY_SMS。(2)采用多线程的方式向MQ中发送10w条消息。DEFAULT_CORE_POOL_SIZE 的值在cpu密集型中是处理器的数量-1,保证处理器能够得到充分的利用并且给其他的线程留出一部分处理器资源;

2024-04-28 12:41:07 256 2

空空如也

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

TA关注的人

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