自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 带你快速了解并掌握TypeScript

一键带你快速认识Typescript

2024-05-09 18:03:54 301

原创 快速了解Vuex

📌vuex 可以在多个组件之间共享数据,并且共享的数据是响应式的,即数据的变更能及时渲染到模板。:类似于mutation,可以包含异步操作,通过调用mutation来改变共享数据。📌vuex 采用集中式存储管理所有组件的状态(将公用的数据提取出来集中存储)就像初始界面,我们登录进去会显示谁谁谁你好,这个数据就是后端提供的。:类似一个事件,用于修改共享数据,要求必须是同步函数。那么如何修改,修改需要通过事件调用函数进行改变。这样在我们的页面中就会展示出定义的共享数据。:状态对象,集中定义各个组件共享的数据。

2024-05-09 17:27:58 471

原创 快速掌握并使用Apache POI

快速掌握Apache POI

2024-05-09 09:54:48 251

原创 快速了解Apache ECharts的使用流程

带你快速掌握Apache ECharts的使用流程,并赋予简单实例

2024-05-08 18:49:14 358

原创 带你快速了解并使用WebSocket

⭐WebSocket是基于TCP协议的一种新的网络协议。他实现了浏览器与服务器全双工通信,浏览器与服务器只需要完成一次握手,两者就可以创建持久性的连接,并进行双向数据传输(服务器也可以所示向浏览器发送数据)

2024-05-08 16:42:54 246

原创 带你快速掌握Spring Task

⭐Spring Task 是Spirng框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑📌一款定时任务框架只要是需要定时处理的场景都可以使用Spring Task。

2024-05-08 13:00:42 351

原创 带你一键解析微信小程序微信支付详细流程(包括开发流程+Cpolar安装+获取公网ip方法)

带你一键解析微信小程序微信支付详细流程,带你理解内部流程

2024-05-08 09:13:48 1465

原创 【微信小程序开发】程序开发(微信登录前后端流程)

快速理解微信小程序

2024-05-06 19:10:29 421

原创 【微信小程序开发】微信小程序注册,配置开发者工具

快速配置微信小程序开发的准备

2024-05-06 17:41:32 486

原创 快速掌握HttpClient(httpclient使用实例)

一个小例子带你轻松掌握HttpClient使用

2024-05-06 16:45:51 350 2

原创 【微服务】分布式事务(通过Seata解决分布式事务问题)

在分布式系统中,如果一个业务需要多个服务合作完成,而且每一个服务都有事务,多个事务必须同时成功或失败,这样的事务就是分布式事务,其中每个事务就是一个分支事务,整个业务的事务称为全局事务。XA规范是X/Open组织定义的分布式事务处理(DTP)标准,XA规范,描述了全局的TM与局部的RM之间的接口,几乎所有的主流的数据库都对XA规范提供了支持。Seata主推的是AT模式,AT模式同样是分阶段提交的事务模型,弥补了XA模型中资源锁定周期过长的缺陷。:定义全局事务的范围,开始全局事务,提交或回滚全局事务。

2024-05-05 18:56:35 833 1

原创 【微服务】服务保护(通过Sentinel解决雪崩问题)

单击调用链路,是一次请求进入服务后经过的每一个被Sentinel监控的资源链,默认会监控SpringMVC中的每一个EndPoint(http接口),限流,熔断等都是针对簇点链路中的资源设置的,而资源名默认就是接口的请求路径。:配合线程隔离进行,由断路器统计请求的异常比例或慢调用比例,如果超出阈值则会熔断该业务,则拦截该接口的请求,熔断期间,所有的请求快速失败,全都走fallback逻辑(让业务失败时不再抛出异常,而是走fallback逻辑):限制访问接口的请求的并发量,避免服务因流量激增出现故障。

2024-05-05 17:12:04 1203 1

原创 【微服务】配置管理

在未来的微服务启动的时候,首先根据SpringCloud框架拉取Nacos中的共有配置初始化Spirng容器,然后再根据SpringBoot加载自己的配置信息,再次初始化Spring容器,但是由于Nacos的地址配置存在于本地的配置文件中,所以需要再SpringCloud中创建一个bootstrap配置文件作为引入文件,从它开始进行读取。由于SpringCloud Config的依赖进行自动配置后,项目启动会自动将本地的配置文件中的配置信息将Nacos中拉取下来的配置信息占位符进行替换。

2024-05-05 14:26:52 461 1

原创 【微服务】网关(详细知识以及登录验证)

快速掌握微服务网关

2024-05-05 13:37:21 1113

原创 【微服务】 OpenFeign

OpenFeign是一个声明式的http客户端,是SpringCloud在Eureka公司开源的Feign基础上改造而来。基于SpringMVC的常见注解,简化RestTemplate的http请求的发送。由于Feign默认的日志级别就是NONE,所以默认我们看不到请求日志。:记录所有请求和响应的明细,包括头信息,请求体,元数据。:在BASIC的基础上,额外记录了请求和响应的头信息。如果要更改默认的日志级别需要自定义日志级别的Bean。:仅记录请求的方式,URL以及响应状态码和执行时间。

2024-05-04 20:58:39 493

原创 【微服务】服务治理(Nacos注册中心)

RestTemplate进行服务间的相互调用是非常有问题的,如果服务备份多个服务器,进行集群服务,而且在开发阶段,我们也不知道其它服务器的地址,那这时我们将如何进行服务器之间的相互调用,我们就需要用到注册中心技术。我的理解:在现在一个服务备份多个分布在多台服务器上,当多个服务启动就将自己挂到注册中心,共消费者选择,起到一个公共黑板墙的作用。服务提供者通过心跳机制向注册中心报告自己的健康状态,当心跳异常时注册中心会将异常服务剔除,并通知订阅了该服务的消费者。:暴露服务接口,供其他服务调用。

2024-05-04 19:50:33 651

原创 【微服务 开发】微服务介绍,服务拆分,远程调用

SpringCloud是目前国内使用最广泛的微服务框架,SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配。Spring给我们提供了一个RestTemplate工具,可以方便的实现Http请求的发送。微服务是一种软件架构风格,它是以专注于单一职责的很多小型项目为基础,组合成复杂的大型应用。:每个微服务的职责要尽量单一,包含的业务相互关联度高,完整度高。:每个微服务的功能要相互独立,尽量减少对其它微服务的依赖。先采用单体架构,快速开发,随着规模扩大逐渐拆分。

2024-05-04 18:54:57 470

原创 【Nginx 开发】Nginx高可用集群

这时我们可以使用虚拟ip来完成,我们对外界提供虚拟ip,绑定集群中的Nginx地址,这时通过keeplived(相当于一种路由,检测主从服务器的工作状态),来完成主从服务器之间的切换。在实际开发过程中Nginx也有可能宕机,如果我们能够将Nginx配置成高可用,当Nginx宕机之后,在集群中我们可以将请求转发到从Nginx服务器当中,由该从服务器完成任务。那我们怎么实现主从之间的切换,要想到两台Nginx服务器的地址也是不同的。:执行命令安装(在/usr目录中安装)文件中配置Nginx服务器的主从。

2024-05-04 15:22:40 444 1

原创 【Nginx 开发】反向代理配置,负载均衡配置,动静分离配置

例如:访问http://127.0.0.1:9001/edu/,直接跳转到,127.0.0.1:8081。访问 http://127.0.0.1:9001/vod/,直接跳转到127.0.0.1:8082。第一步:在windows系统的host文件进行域名和ip对应关系的配置。我们还可以及进行通过不同的访问路径进入到不同的tomcat服务器中。第二步:在nginx进行请求转发的配置(反向代理的配置)root 跟的是在nginx中静态资源所在的目录。:表示展示的时候列出目录中所有的文件。

2024-05-04 14:21:26 930 1

原创 【nginx 开发】nginx安装,Nginx介绍

Nginx是一个高性能的Http和反向代理服务器,特点是占有内存少,并发能力强,Nginx可以作为静态页面的web服务器,Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验。设置一些影响nginx服务器整体运行的配置指令,主要包括配置运行Nginx服务器的用户组,允许生成的worker process 数,进程PID存放路径,日志存放路径和类型以及配置文件的引入等。:配置并发服务,值越大,可以支持的并发数量也越多,但是会收到硬件,软件等设备的制约。

2024-05-04 11:31:52 757 1

原创 【消息队列】延迟消息

快速理解掌握延时消息

2024-04-30 20:38:54 394

原创 【RabbitMQ】可靠性策略(幂等,消息持久化)

为了确认消费者是否成功处理消息,RabbitMQ提供了消费者确认机制,当消费者处理消息结束后,应该向RabbitMQ发送一个回执,告知RabbitMQ自己消息处理状态。幂等是一个数学概念,用函数表达式来描述是这样的:f(x)=f(f(x)),在程序开发中,则指同一个业务,执行一次或多次对业务状态的影响是一致的。我们完成一个任务将消息交由消息队列中,就进行别的任务了,当消息队列返回异常问题,在过来进行对应的处理。需要自己在业务代码中调用api,发送ack或reject,存在业务入侵,但更灵活。

2024-04-30 19:54:06 1855 2

原创 【消息队列】RabbitMQ五种消息模式

Spring AMQP是基于AMQP协议定义的一套API规范,提供了模板来发送和接收消息,包含两部分,其中Spring-amqp是基础抽象,spring-rabbit是底层的默认实现。这是为了防止消息队列中的队列不存在,在进行消息队列初始化的时候不知道是先建立消费者,还是先建立生产者,所以都执行创建函数,但是创建的队列只有一个不会重复。发布者发送消息时,指定消息的RoutingKey,Exchange将消息路由到BindingKey与消息RoutingKey一致的队列。Work queue,工作队列。

2024-04-30 16:09:10 2234 3

原创 【消息队列】MQ介绍

现在很多人同时访问一个功能,功能完成后需要同时调用功能,这时Broker可以将消息进行缓冲,再多其他功能也是一个一个从broker中提取,起到一个缓冲作用,就是流量削峰。理解:当我们完成一个功能需要完成其他多个功能后才能够返回消息,但是我们可以将调用多个的任务交给一个Broker进行,这个时候第一个功能结束就立即返回,剩下的慢慢进行。MQ(MessageQueue),中文是消息队列,就是存放消息的队列,也是下面提到的事件驱动架构中的Broker。时效性强,可以立即得到结果。

2024-04-29 20:59:58 355 1

原创 【多级缓存】多级缓存OpenResty,Canal,nginx本地缓存

第三方开源的canal-starter:地址:https://github.com/NormanGyllenhaal/canal-client。缓存预热:在实际开发中,我们可以利用大数据统计用户访问的热点数据,在项目启动时将这些热点数据提前查询并保存到Redis中。注意:这里的path是路径,并不包含IP和端口,这个请求会被nginx内部的server监听并处理,可以使用反向代理。Canal提供了各种语言的客户端,当Canal监听到binlog变化时,会通知Canal的客户端。

2024-04-29 19:50:45 1611 1

原创 【Redis 开发】多级缓存,本地进程缓存Caffeine

默认情况下,当一个元素过期的时候,Caffeine不会立即将其清理或删除,而是当再一次读或写操作后,或者在空闲时间完成对失效数据的驱逐。Redis处理并发的能力是非常强大的,但是tomcat的支持并发的能力跟不上Redis的性能,导致整体性能的下降。为了应对上述问题,我们采用多级缓存,就是在请求处理的每个环节分别添加缓存,减轻tomcat的压力,提升性能。Caffeine是一个基于java8开发的,提供了近乎最佳命中率的高性能本地缓存库。缺点:存储容量有限,可靠性较低,无法共享。

2024-04-29 17:43:51 515

原创 【Redis 开发】Lua语言

Lua是一种小巧的脚本语言,底层用C语言实现,为了嵌入式应用程序中。官网:https://www.lua.org/例如:定义一个函数,用来打印数组。函数测试变量的或值的数据类型。

2024-04-29 17:42:35 734

原创 【Redis 开发】Redis分片集群

key是num,那么就根据num计算,如果是{itcast}num,则根据itcast计算。命令可以让集群中的某个master宕机,切换到执行cluster failover命令的这个slave节点上,实现无感的数据迁移。如上图的流程,首先发送请求,得到现在的offset值,判断是否一致,不一致进行追赶,然后进行故障转移。:参数将添加的节点设置为从节点,并可以指定对应的主节点,如果没有参数默认添加的节点为主节点。在主节点出现宕机的情况下,如果使用插槽,可以进行将宕机节点对应的插槽转移到对应或者的节点。

2024-04-29 15:43:34 1054

原创 【Redis 开发】Redis哨兵

在Sentinel集群监管下的Redis主从集群,其节点会因为自动故障转移而发生变化,Redis的客户端必须感知这种变化,及时更新连接信息。Spring的RedisTemplate底层利用lettuce实现了节点的感知和自动切换。若超过指定数量的哨兵都认为该实例主观下线,则该实例客观下线,这个值最好超过哨兵实例数量的一半。如果某哨兵节点发现某实例未在规定时间内响应,则认为该实例主观下线。这里我们讲述在Linux下搭建三个三个哨兵。

2024-04-28 13:14:09 943

原创 【Redis 开发】详细搭建Redis主从,并了解数据同步原理

这个时候如果redis从节点宕机当他醒过来之后,master已经转了一圈了上一圈的数据被覆盖掉,slave就只能进行全量同步了。注意:repl_baklog中的存储是进行环形存储的,slave与master一直在环形存储内进行增量同步。slave返回的offset中记录了返回来的在backlog中读取到了哪里,baklog将后边的数据返回。主从第一次同步是全量同步,但是如果slave重启后同步,则执行增量同步。主从节点可以实现读写分离,将都大量的读操作分担与诸多从节点当中去。在cli客户端使用命令。

2024-04-28 10:33:49 649

原创 【Redis 开发】Redis持久化(RDB和AOF)

快速掌握Redis持久化

2024-04-27 21:08:55 953

原创 【Redis 开发】(Feed流的模式,GEO数据结构,BitMap,HyperLogLog)

如果我们需要统计UV值,我们可以使用HyperLogLog,它是从LogLog算法中派生出来的概率算法,用于确定非常大的集合的基数,但是它的单个存储的统计内存永远小于16kb,但是代价就是统计是概率性的有小于0.81%的误差,不过可以忽略。也叫做写扩散,发布的消息不需要写入到发件箱中,直接推送到被关注人的收件箱中并通过时间戳进行排序,延时低,但是比如说微博中的一些大V,粉丝人特别多,这样就会写很多。范围可以是圆形或矩形。:指定圆心、半径,找到该圆内包含的所有member,并按照与圆心之间的距离排序后返回。

2024-04-27 18:02:39 594 1

原创 【Redis 开发】Redis消息队列

但是这种方式存在弊端,当我们指定ID为$的时候,如果我们在执行handleMessage操作时一下传过来四五条消息,这时就会出现漏读的情况,针对这个我们采用一下方案。PubSub(发布订阅),消费者可以订阅一个或多个channel,生产者向对应channel发送消息后,所有的订阅者都能够收到相关信息。其它:根据指定的id从pending-list中获取已消费但未确认的消息,例如0,是从pending-list中的第一个消息开始。起始ID标示,$代表队列的最后一个消息,0则代表队列中的第一个消息。

2024-04-27 15:54:49 1043

原创 【Redis 开发】Redisson

在当下的场景中都是多台Redis服务器进行主从服务器,假定这时有一个线程访问中Redis服务器,成功获取锁,就在这时,主服务器与从服务器同步数据的时候主服务器出现故障,这时Redis哨兵会从从服务器中选出一个来当主服务器,这是锁信息并未同步,就在这时其他线程也能够得到锁进行操作,就会出现问题。原理就是在存放value的时候通过计数器机制进行重复访问,当同一个线程在此访问这个锁的时候会进行判断,是不是自己同一个线程,是的话计数器加1,同理释放锁的时候就是将该计数器的数字减1。这是可复用锁的底层原理。

2024-04-27 10:00:25 616

原创 【Redis 开发】分布式锁中的常见问题和Lua脚本

分布式锁中我们设置的过期时间:如果有一个线程获取锁之后在进行操作时,到达了锁的过期时间,之后就会有别的线程获得锁,如果这时,第一个线程执行完成后释放锁,就会将第二个锁的线程删除改进分布式锁添加释放锁的判断上述我们做了修改进行判断,但是还存在一种极端情况,当线程操作完毕需要释放锁的时候,这个时候已经判断完毕,但是由于比如说垃圾回收等问题对线程的释放操作进行阻塞,这个时候如果超过等待时间,这是还是会出现上述问题,在阻塞结束之后,会删除其他线程的锁。

2024-04-26 19:14:32 813 1

原创 【Redis 开发】一人一单,超卖问题(悲观锁,乐观锁,分布式锁)

就是在商品上添加版本号,一个线程查询用户的时候查询到id和版本号信息,当他需要进行修改数据的时候进行对比现在的版本号看有没有发生变化马,如果有就停止操作,并重新开始,如果没有则修改数据并将版本号加一,每个线程都执行此操作。就是在下单的时候,在订单数据库中进行查询如果该用户已经存在单子,那么会返回异常,如果在库中没有该用户,在创建新的订单,注意在创建新的订单之前需要使用悲观锁,防止多线程问题。原因:在多个集群中就会有多个jvm下的锁监视器,这些锁监视器只会监控本服务器下的悲观锁。判断库存有没有发生变化。

2024-04-26 18:00:40 889

原创 【Redis 开发】全局ID生成器

32bit,秒内的计数器,支持每秒生成2^32个不同的ID。:31bit,一秒为单位,可以使用69年。:1bit,一直为0。

2024-04-26 16:06:50 257 1

原创 【Redis 开发】缓存雪崩和缓存击穿

假若有很多线程进来,访问这个被击穿的数据,这是线程1先进来,拿到互斥锁,进行后面的数据库查询,写入缓存操作,其他线程在这个期间就不会拿到互斥锁,拿不到就会进行等待过一段时间重新在缓存中进行访问。在使用逻辑数据的时候同时也用到了互斥锁,但是处理不同,在线程获得互斥锁后,再创建一个新的线程来进行写入缓存的操作,这时候先返回过期的数据,其他没有拿到互斥锁的线程也是先返回过期数据。缓存雪崩是指在同一时间段,大量的缓存key同时失效或者Redis服务器宕机,导致大量请求到达数据库,带来巨大压力。

2024-04-26 10:48:17 425

原创 【Redis 开发】缓存穿透解决

当数据库中查询无果的时候,我们在对应的缓存中写入一个null,在下一次访问的时候就不会到达数据库,由缓存返回一个null。首先通过布隆过滤器,如果没有数据就拒绝访问,底层时间通过数据库中的数据通过哈希算法算出哈希值存到布隆过滤器中。缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存就永远不会生效,这些请求都会打到数据库。可能造成短期的不一致 (我在数据库插入一条数据,但是对应的缓存中存的是null)在服务层判断数据库的时候加入缓存空对象方面的技术。优点:内存占用少,没有多余的key。

2024-04-25 20:58:59 478

原创 【Redis 开发】(长篇学习)掌握Redis的用法,各种客户端下的操作

我们在作者之前的文章:快速掌握Redis安装与基本语法的基础上进行系统的学习,学习自黑马程序员的Redis实战课堂,进行学习总结,希望对大家有所帮助。

2024-04-24 18:50:09 1873

空空如也

空空如也

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

TA关注的人

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