技术
文章平均质量分 76
技术栈
y我见青山多妩媚
我很懒,还没有添加简介
展开
-
ssh脚本连接远程服务器
使用Mac电脑连接远程服务器,我们主要使用的是shell+expect的方式连接,具体语法可以找资料学习。该方式连接不同的ip时只需要编写不同的ip文件即可。expect文件内的。原创 2023-08-02 15:59:59 · 505 阅读 · 0 评论 -
AQS实现原理分析
AQS(AbstractQueuedSynchronizer)即抽象队列同步器,是一套可以实现同步锁机制的框架,是许多JUC内同步框架的基石。AQS通过一个FIFO的队列维护线程同步状态,实现类只需要继承该类,并重写指定方法既可以实现一套线程同步机制。原创 2023-03-20 22:26:53 · 274 阅读 · 0 评论 -
Head First设计模式---5.单例模式
由于单例类的构造函数是私有的, 而且绝大部分语言无法重写静态方法, 所以你需要想出仔细考虑模拟单例的方法。要么干脆不编写测试代码, 或者不使用单例模式。它的运作方式是这样的: 如果你创建了一个对象, 同时过一会儿后你决定再创建一个新对象, 此时你会获得之前已创建的对象, 而不是一个新对象。该方法可以创建一个新对象, 但如果该对象已经被创建, 则返回已有的对象。单例模式运用的可能比其他几种简单,通俗点理解就是,我这个对象只能存在一个。如果程序中的某个类对于所有客户端只有一个可用的实例, 可以使用单例模式。原创 2023-02-23 17:20:02 · 284 阅读 · 0 评论 -
Head First设计模式---4.工厂方法模式
当我们看到new关键字的时候,总是会想到“具体”,不过确实,当我们使用new的时候,的确是在实例化一个对象,所以用的确实是是实现,而不是接口。让我们看看具体是如何实现的。现在, 为工厂方法中的每种产品编写一个创建者子类, 然后在子类中重写工厂方法, 并将基本方法中的相关创建代码移动到工厂方法中。由于我们披萨店的生意太火爆了,我们需要加盟新的披萨店,制作新的口味的披萨来吸引顾客,这个时候我们该怎么设计呢?工厂方法将创建产品的代码与实际使用产品的代码分离, 从而能在不影响其他代码的情况下扩展产品创建部分代码。原创 2023-02-22 17:15:07 · 348 阅读 · 0 评论 -
Head First设计模式---3.装饰者模式
本店以迅速的扩张优势占领了附近的几条街,但是随着顾客的增多,我们需要一套更完善和流程的架构去应对咖啡的销售,所以我们需要更新我们的订单系统!类,其中不包含任何小料,当需要小料时,只需要将小料加入进来即可。是一种结构型设计模式, 允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。当每上市一种新的调料或者咖啡,我们就陷入了一种麻烦的循环中去。所以当我们是算钱的时候,是不是一层一层的委托给外面,就可以实现了呢?的结构图很相似, 因为两者都依赖递归组合来组织无限数量的对象。原创 2023-02-21 20:34:49 · 610 阅读 · 0 评论 -
Head First设计模式---2.观察者模式
观察者(Observer)模式,是一种行为型设计模式,允许你定义一种订阅机制,可以在对象事件发生时通知更多个“观察”该对象的其他对象,类似于“订阅—通知”原创 2023-02-20 19:36:16 · 228 阅读 · 0 评论 -
Head First设计模式---1.策略模式
换句话说,如果每次新的需求一来,都需要把某处的代码发生变化,那么你就可以确定,这部分的代码需要被抽取出来,和其他代码有稳定的部分。原创 2023-02-19 17:48:59 · 525 阅读 · 0 评论 -
redis主从复制和集群搭建
可以看到,根据redis内置的算法,不同的键值被分到不同的槽位,有的是7004,有的7006有的7002,不过都是从节点的。同理,7002、7003、7004、7005、7006一样的配置,无非改一下ip地址和端口号之类的。准备两台服务器,两台服务器可以互相ping通,可以新建两个虚拟机,然后配置网络,此处不在演示。准备两台虚拟机之后,两台虚拟机安装redis,gcc编译之后我们开始配置redis集群。我们搭建的是三个主节点,三个从节点的集群。该命令会随机分配主节点和从节点。同主从复制,先有两个服务器。原创 2022-11-13 21:05:20 · 760 阅读 · 0 评论 -
Sping高级(源码)--- 1.6Aware接口
Aware接口提供了一种内置的注入手段,可以注入BeanFactory、ApplicationAware 接口用于注入一些与容器相关的信息,比如。原创 2022-11-05 16:52:27 · 491 阅读 · 0 评论 -
Sping高级(源码)--- 1.5BeanFactory后处理器
mapper1和mapper已经被解析到了。原创 2022-10-30 09:24:18 · 352 阅读 · 0 评论 -
Sping高级(源码)--- 1.4Bean后处理器
此时解析的内容挺多的,两个注解都解析了,但是还有一个部分没有解析,我们接着往上添加。可以看到,我们的结果是没问题的,解析了@Autowired的注解。@ConfigurationProperties解析。对Bean1添加toString()方法,添加测试类。另外,我们也可以得到哪些方法和参数上加了对应的注解。我们依次添加后处理器,查看后面解析的内容。我们先启动一次,看看里面都加载了什么。先解析,上面已经提到过,不再赘述。例子:后置处理器解析各个注解。注解全部解析,至于为什么。找到方法或参数上的注解。原创 2022-10-23 17:43:33 · 1055 阅读 · 0 评论 -
Sping高级(源码)--- 1.3Bean的生命周期
本例我们模仿spring的后处理器来设计。bean的生命周期可以分为四个阶段。springbean生命周期的案例。我们将通过下面的例子来说明。原创 2022-10-15 16:26:25 · 92 阅读 · 0 评论 -
Sping高级(源码)--- 1.容器和Bean
beanFactory不会做到的事:不会主动调用BeanFactory后处理器不会主动添加Bean后处理器不会主动初始化单例不会解析beanFactory,还不会解析。原创 2022-10-07 17:38:04 · 848 阅读 · 0 评论 -
微服务基础---1.4Ribbon负载均衡
源代码流程:Ribbon的负载均衡规则是一个叫做IRule的接口定义的,每一个子接口是一个规则配置文件方式:在order-service的application.yaml文件中,添加新的配置也可以修改规则1.4.3懒加载Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面的配置开启饥饿加载重启order-service服务,查看控制台信息可以看到,启动时就加载了服务原创 2022-09-23 16:18:55 · 293 阅读 · 0 评论 -
微服务基础---1.1认识微服务
想要远程调用,实际上就是一个基于http的请求。原创 2022-09-18 15:11:03 · 240 阅读 · 0 评论 -
微服务基础---1.3Eureka注册中心
此时idea的日志会出现两条信息,两个user-service服务轮询操作。EurekaServer:服务端,注册中心。服务该如何获取服务提供者的地址信息?如果有多个提供者,消费者该如何选择?消费者如何得知服务提供者的健康状态?服务该如何获取服务提供者的地址信息?如果有多个提供者,消费者该如何选择?消费者如何得知服务提供者的健康状态?EurekaClient:客户端。可以看到此时就有两条记录。原创 2022-09-18 15:10:19 · 170 阅读 · 0 评论 -
RabbitMQ(九)RabbitMQ其他知识点
举个最简单的例子,那就是支付,用户购买商品后支付,支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额发现多扣钱了,流水记录也变成了两条。 消费者在消费MQ中的消息时,MQ已把消息发送给消费者,消费者在给MQ返回ack时网络中断,故MQ未收到确认信息,该条消息会重新发给其他的消费者,或者在网络重连后再次发送给该消费者,但实际上该消费者已成功消费了该条消息,造成消费者消费了重复的消息。 MQ消费者的幂等性的解决一般使用。原创 2022-09-09 09:31:05 · 148 阅读 · 0 评论 -
RabbitMQ(八)发布确认高级
在生产环境中由于一些不明原因,导致 rabbitmq重启,在RabbitMQ重启期间生产者消息投递失败,导致消息丢失,需要手动处理和恢复。于是,我们开始思考,如何才能进行RabbitMQ.的消息可靠投递呢?特别是在这样比较极端的情况,RabbitMQ集群不可用的时候,无法投递的消息该如何处理呢?原创 2022-09-09 09:30:25 · 329 阅读 · 0 评论 -
RabbitMQ(七)延迟队列
延时队列在需要延时处理的场景下非常有用,使用RabbitMQ.来实现延时队列可以很好的利用RabbitMQ 的特性,如:消息可靠发送、消息可靠投递、死信队列来保障消息至少被消费一次以及未被正确处理的消息不会被丢弃。另外,通过RabbitMQ集群的特性,可以很好的解决单点故障问题,不会因为单个节点挂掉导致延时队列不可用或者消息丢失。原创 2022-09-09 09:29:55 · 821 阅读 · 0 评论 -
RabbitMQ(六)死信队列
先从概念解释上搞清楚这个定义,死信,顾名思义就是无法被消费的消息,字面意思可以这样理解,一般来说,producer将消息投递到broker或者直接到queue里了,consumer 从queue取出消息进行消费, 应用场景:为了保证订单业务的消息数据不丢失,需要使用到RabbitMQ的死信队列机制,当消息消费发生异常时,将消息投入死信队列中.还有比如说:用户在商城下单成功并点击去支付后在指定时间未支付时自动失效。四条消息进入死信队列,剩下的就和上面的一样,开启消费者2消费掉其中的数据。原创 2022-09-09 09:29:22 · 312 阅读 · 0 评论 -
RabbitMQ(五)交换机
Fanout(扇出)这种类型非常简单。正如从名称中猜到的那样,他是将接收到的所有消息广播到它知道的所有队列中。系统默认有些exchange类型系统默认的 上一节中的我们的日志系统将所有消息广播给所有消费者,对此我们想做一些改变,例如我们希望将日志消息写入磁盘的程序仅接收严重错误(errros),而不存储哪些警告(warning)或信息(info)日志消息避免浪费磁盘空间。原创 2022-09-09 09:28:58 · 263 阅读 · 0 评论 -
RabbitMQ(四)发布确认
(从1开始),一旦消息被投递到所有匹配的队列之后,broker就会发送一个确认给生产者(包含消息的唯一ID),这就使得生产者知道消息已经正确到达目的队列了,如果消息和队列是可持久化的,那么确认消息会在将消息写入磁盘之后发出,broker回传给生产者的确认消息中delivery-tag域包含了确认消息的序列号,此外broker 也可以设置basic.ack的multiple域,表示到这个序列号之前的所有消息都已经得到了处理。当然对于某些应用程序来说这可能已经足够了。 这是一种简单的确认方式,它是一种。原创 2022-09-09 09:27:58 · 500 阅读 · 0 评论 -
RabbitMQ (三)WorkQueue
rabbitmq原创 2022-09-09 09:27:09 · 212 阅读 · 0 评论 -
RabbitMQ(二)Hello World
本例。发送单个消息的生产者和接收消息并打印的消费者。生产者发送消息,消费者接收消息,发送的消息进入消息缓存队列中。fill:#333;color:#333;color:#333;fill:none;}发消息接收消息生产者消息队列hello消费者。原创 2022-09-09 09:25:23 · 177 阅读 · 0 评论 -
RabbitMQ(一)消息队列
MQ(message queue),从字面意思来看,本质是个队列,FIFO先进先出原则,只不过队列中存放的内容是message而已,还是一种跨进程的通信机制,用于上下游传递消息(A同学是上游,B同学是下游,A、B之间交流)。在互联网架构中,MQ是一种非常常见的上下游:“逻辑解耦+物理解耦”的消息通信服务。使用MQ之后,消息发送上游只需要依赖MQ,不用依赖其他服务。原创 2022-09-03 16:28:48 · 284 阅读 · 0 评论 -
并发编程(四)---设计模式
同步异步 , 举个例子来说,一家餐厅吧来了5个客人,同步的意思就是说,来第一个点菜,点了个鱼,好, 厨师去捉鱼杀鱼,过了半小时鱼好了给第一位客人,开始下位一位客人,就这样一个一个来,按顺序来相同, 异步呢,异步的意思就是来第一位客人,点什么,点鱼,给它一个牌子,让他去一边等吧,下一位客人接着点菜,点完接着点让厨师做去吧,哪个的菜先好就先端出来,同步的优点是:同步是按照顺序一个一个来,不会乱掉,更不会出现上面代码没有执行完就执行下面的代码, 缺点:是解析的速度没有异步的快;异步的优点是:异步是接取一个任务,直原创 2022-09-02 20:01:38 · 342 阅读 · 0 评论 -
Mysql高级(五)---锁
介绍锁,是计算机协调多个进程或者线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。分类MYSQL中的锁,按照锁的粒度分,分为以下三类全局锁:锁定数据库中的所有表表级锁:每次操作锁住整张表行级锁:每次操作锁住对应的行数据。原创 2022-08-19 10:37:01 · 141 阅读 · 0 评论 -
Mysql高级(四)---视图/存储过程/触发器
介绍存储过程是事先经过编译并存储在数据库的一段SQL语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的存储过程思想上很简单,就是对数据库SQL语言层面的代码封装与重用特点封装复用可以接收参数,也可以返回数据减少网络交互,效率提升。...原创 2022-08-12 09:33:49 · 560 阅读 · 0 评论 -
Mysql高级(三)---SQL优化
读取满足条件的数据行,然后在排序缓冲区sortbuffer中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫FileSort排序。count()是一个聚合函数,对于返回的结果集,一行一行的判断,如果count函数的参数不是null,累计值就+1,否则不加,最后返回累计值。在执行update语句的问题,InnoDB的行锁是针对索引加的锁,不是针对记录加的锁,并且该索引不能失效,否则会从行锁升级为表锁。执行用时20s左右,在大数据量的情况下,数据越往后,时间越长,查询排序的时间非常大。...原创 2022-08-02 11:43:39 · 146 阅读 · 0 评论 -
Mysql高级(一)---存储引擎
存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的,所以存储引擎也可被称为表类型。在创建表时,指定存储引擎CREATETABLE表名(//.....)ENGINE=InnoDB//默认为InnoDB。...原创 2022-07-27 17:49:21 · 175 阅读 · 0 评论 -
MYSQL高级(二)---索引
索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特点查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高效查找算法,这种数据结构就是索引索引优缺点优势劣势提高数据检索的效率,降低数据库的IO成本索引列也是要占用空间的通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗索引大大提高了查询效率,同时却也降低更新表的速度,如对表进行INSERT、UPDATE、DELETE时,效率降低。.........原创 2022-07-27 17:45:28 · 450 阅读 · 0 评论 -
并发编程(五)---共享模型之内存
happens-before规定了对共享变量的写操作对其他线程读操作可见,他是可见性与有序性的一套规则总结,抛开一下happens-before规则,JMM并不能保证一个线程对共享变量的写,对于其他线程对该共享变量的读可见。上面的例子的实际就是可见性,他保证的是在多个线程之间,一个线程对volatile变量的修改对另一个线程可见,不能保证原子性,仅用在一个写线程,多个读线程的情况。所以以上的代码再真正执行时,既可以是。对变量默认值(0、false、null)的写,对其他线程对该变量的读可见。......原创 2022-07-18 09:49:10 · 143 阅读 · 0 评论 -
并发编程(三)---共享模型之管程
例如如下的临界区3.2synchronized解决方案为了避免临界区的竞态条件发生,有多种手段可以达到目的synchronized,俗称【对象锁】本次课使用阻塞式的解决方案: synchronized,来解决上述问题,即俗称的【对象锁】,它采用互斥的方式让同一时刻至多只有一个线程能持有【对象锁】,其它线程再想获取这个【对象锁】时就会阻塞住。这样就能保证拥有锁的线程可以安全的执行临界区内的代码,不用担心线程上下文切换注意:虽然java中互斥和同步都可以采用synchronized关键字来完成,但它们还是原创 2022-07-05 20:03:12 · 346 阅读 · 0 评论 -
并发编程(二)---线程
例如:输出:把【线程】和【任务】(要执行的代码)分开例如:输出:输出:小结:FutureTask能接收Callable类型的参数,用来处理有返回结果的情况例子:输出:2.2多个线程执行主要理解我们都知道JVM中由堆、栈、方法所组成,其中栈内存是给谁用的呢?其实就是线程,每个线程启动后,虚拟机就会为其分配一块栈内存因为一些原因导致cpu不再执行当前的线程,转而执另一个线程的代码当Context Switch发生时,需要由操作系统保存当前线程的状态,并恢复另一个线程的状态,Java中对原创 2022-07-11 14:30:00 · 185 阅读 · 0 评论 -
并发编程(一)---线程和进程
进程:是一个应用程序线程:是一个进程中的执行场景/执行单元注:一个进程中可以有多个线程二者对比:Java 给多线程编程提供了内置的支持。 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销。这里定义和线程相关的另一个术语 - 进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个线程不能独立的存在,它必须是进程的一部分。一个进程一直运行,直到所有的非守护线程都结束运行后才能结束。多线程能原创 2022-07-05 19:44:53 · 164 阅读 · 0 评论 -
算法笔记-归并排序
归并排序采用的是分治(divide-and-conquer)法思想。基本思想是将一个集合递归分成两个集合,对每个集合内的数进行排序,最后再把排好序的集合再次排序先来看归并排序的大致过程,这个是为了方便看,是这样的可以将他的执行过程理解为一颗二叉树,每个数的子节点都是父节点对半分的集合,对每个子节点进行排序之后,再对父节点进行排序以[8,4,5,7,1,3,6,2]为例子运行结果:4、时间复杂度分析......原创 2022-06-23 11:36:14 · 168 阅读 · 0 评论 -
Java使用selenium的一些问题
2、下载与本地Google对应的chromedriver驱动网址:http://chromedriver.storage.googleapis.com/index.html如找不到与自己浏览器匹配的版本,参考官网:https://chromedriver.chromium.org/downloads当selenium在本地运行时没有问题,但是放到远程服务器上出现了无法定位到click元素的问题,这个问题的原因是浏览器视窗太小了造成的,使用selenium测试时,如果视窗不够大,相应的selenium模拟原创 2022-06-17 08:58:47 · 312 阅读 · 0 评论 -
Nginx笔记
一、反向代理1、正向代理正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。2、反向代理反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通原创 2022-06-12 11:03:32 · 81 阅读 · 0 评论 -
设计模式笔记【未完】
设计模式一、设计模式相关内容介绍1.1软件设计模式的概念软件设计模式(Software besign Pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用。1.2学习设计模式的必要性设计模式的本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性以及类的关联关系和组合关系原创 2022-05-15 10:28:57 · 118 阅读 · 0 评论 -
杂杂杂杂杂
二叉树层序遍历:力扣–二叉树层序遍历原创 2022-03-06 15:43:12 · 198 阅读 · 0 评论