- 博客(32)
- 收藏
- 关注
原创 Spring专题
1、创建ioc容器ApplicationContext,bean被加载到BeanDefinition,用户后续创建对象,比如id、classs、lazy、scope这些都会加载进BeanDefinition中。3、BeanFactory为实例注入属性,对象加入到单例池(一个Map),也就是加入到一级缓存。2、BeanFactory创建bean的实例,存入一级缓存,用于解决后续的循环依赖问题。单例Map,也就是单例池,也就是一级缓存,处于成熟态的bean会加入到单例池中。注意,创建的对象是单例的。
2024-10-15 12:51:51
248
原创 ThreadLocal-共享变量
缓存对象中定义了一个字节数据,byte[1024*1024],也就是1M,创建一个核心线程数为30的线程池,使用excute将线程的状态修改为running,循环创建30个线程,共计30个ThreadLocalMap,每个map存储了一个对象,共计30M,而我们jvm堆内存设计的初始容量和最大容量是25M,循环到第26次的时候,内存会泄漏。local.get()获取缓存的数据,也就是说,缓存对象使用完之后,我们可以手动清除,local.remove(),完美的解决了ThreadLocal内存泄漏问题。
2024-10-13 15:37:43
204
原创 weititer0000
浏览器>dns将解析操作移交给cdn>cdn向服务器发送负载均衡设备ip>浏览器>负载均衡设备ip>浏览器得到缓存服务器ip>缓存服务器向目标服务器发送请求>目标服务器将数据发给缓存服务器>缓存服务器将数据发给浏览器>浏览器。除了可以转发请求,还可以检查请求需要的内容是否缓存于服务器中,若存在,则此次请求是结束了。缓存未命中:这条数据存在缓存中,这条数据因为太久没有使用被淘汰。缓存命中:这条数据在缓存中不存在,将这条数据设置进缓存。utf-8编码 3个字节。gbk 两个字节。utf-16 两个字节。
2024-09-09 22:01:39
279
原创 stream自定义异常处理逻辑
stream的降级与hystrix不一样。hysdtris是作用在接口上。consumer出现异常。fallback降级。
2024-07-20 11:01:43
122
原创 消息队列中的顽固异常
当消费者消费的效率低于生产者生产的效率时,队列中的消息会积累的越来越多,知道队列满,满了之后,消息就无法再添加到队列中。2、设置拒绝重试max,达到阈值后,消息无法再被消费,为了避免消息占着茅坑不拉屎,就让它消失。1、设置消息过期时长。指定时间后,如果消息无法被正常消费,则消失。针对导致异常的消息一直入队的解决办法。
2024-07-14 19:07:28
137
原创 项目开发经验
3、将authrization解析成用户实体的操作在当前项目上一层甚至上几层的拦截器中,从redis中获取用户数据并解析成实体存储在容器中。所以用户身份的验证和用户信息的获取和另外一个项目system无关。1、LoginUserContext.get()获取的用户信息是null,@NoLogin会清除/根本没有初始化用户实体。2、LoginUserContext.get()是从容器中获取用户实体,用户实体数据是从redis中获取的。
2024-07-11 16:56:19
94
原创 从页面上爬取数据
jsoup用来解析html,httpClient用来获取html文件,拿到html资源后就可以解析了。倘若拿到的html不是我们想要的东西呢?就只能通过调用接口来获取数据了。综上,若html资源文件中存在数据,则解析html文件,从中获取数据后入库。若拿不到html,则通过调用后端接口来获取数据,相对来说麻烦哦。
2024-07-10 16:37:46
154
原创 轮转数组,转动起来
模代表新一轮遍历中某一段长度的标识。%包含除数(完整遍历的次数)和模(最后一次遍历不完全,代表最后一次遍历的那段长度的索引)的含义。从结果来看,若i+k<长度,当前元素往后移动k个单位。若i+k>=长度,元素会移动到首端,模就是移动后的索引。说说%的含义:场景选择数组而不是数轴,两者的区别是前者索引代表一段距离的标识,后者代表某个点位。元素包含:1、数组长度。2、当前元素的索引。3、当前元素移动之后的索引。轮转:轮到当前元素的时候,将其向后移动k位。
2024-07-09 10:11:07
237
2
原创 基于发布订阅实现广播功能
创建producer,并为生产者配置消息的topic,并且创建相应的consumer监听producer。利用stream特有的标签从rabbitmq的topic里面拉取消息。搭建一个生产者到消费者的完整链路,实现消息的广播功能。启动多个consumer节点测试消息的广播功能。
2024-07-01 20:59:56
149
原创 找一个数组中的众数-boyer-moore
先判断count的数值,那么count == 0,那么该元素就是候选众数。再比较元素num与候选众数的值,若一致,count自增,反之自减。候选众数会成为最终的我们要找的众数。主要从数学的角度思考问题。
2024-07-01 17:14:19
164
原创 Stream急速落地
主要包含三个部分:1、创建项目,添加依赖。2、创建监听器,包含声明和绑定信道。3、从RabbitMQ触发一条消息,看监听器有没有消费这条消息。
2024-06-30 21:21:00
463
1
原创 数组中的多数元素
使用Map.Entry entry来存储当前遍历映射的元素,若entry仍然为null,将映射的值添加进entry,既然entry不包含该元素,这个元素便是第一次出现,故设置value为1.若entry不为null,则将当前元素的value与entry的value比较,所以说,entry的value必会是num中出现次数最多的一个元素。获取num中出现个数超过n/2的元素,假设数组不为空,且结果有且自由一个,不考虑两个元素出现次数一致且大于n/2的情况,不考虑空。
2024-06-28 10:03:41
185
原创 删除有序数组重复元素ll
思路:设置快指针fast和慢指针slow。若nums[slow-2] == nums[fast],则nums[fast]不应该保留,因为此时必然有nums[slow-2] == nums[slow-1] == nums[fast].
2024-06-26 14:48:07
97
原创 删除排序数组的重复项
快指针fast,遍历数组时,fast代表当前指向元素的索引值。快指针依次遍历1到n-1的每一个索引对应的位置,若当前元素与前一个元素值比较不相等,说明fast指向的位置的元素与前面的所有的元素值都不相等,因此把把fast指向的值填入slow指向的值,随后slow指向下一个位置。n可以理解为数组最后一个元素的后面一个元素对应的索引。n-1代表的是数组中最后一个元素对应的索引。while(fast < n){//fast == n的时候,代表所有元素都被快指针遍历完毕,这个场景用==来结束也是可以的。
2024-06-25 17:14:43
138
原创 双指针-移除与val相等的元素
数组中的元素若不等于val,把left指向的位置的值设置为right指向的位置的值,在遇到==val的元素之前,left和right都是指向的同一个元素,所以赋值操作赋的是同等数据,执行完赋值操作后left指向下一个位置,循环体执行完,right也会指向下一个元素。若数组中存在一个元素等于val,right指向往后面一个元素,left的指向不变,这时候,left和right指向的就不是同一个元素了。2、从left指向的元素的后一个元素开始直到right指向的元素,都是与val相同的元素。
2024-06-24 18:00:58
211
原创 两个数组的元素合并
它同样可以升序排列呀。paralleSort处理数据的能力比sort更强力,数据量相对大的时候用paralleSort,它把数据分成几组,对每组进行排序,最终在进行组排序。1、假设nums1.length = 4,可以得出的一个结论就是,4代表num1最后一个元素的后面一个元素的索引(这里用m替代了num1的真实长度,实际上nums1.length > m,多余的位置用0填充了)。要求:将num2中的元素合并到num1中,要求结果存储在num1中,num1中的0代表即将从num2中添加过来的元素。
2024-06-24 10:33:05
292
原创 一键开店-流量削峰
涉及知识点:消息中间件(50w的吞吐量不在话下、发布-订阅模式广播一条消息,商品服务、销售单服务、库存服务监听中间件中的消息-http request,若服务存在空闲的资源,便主动从中间件拉取请求再执行。
2024-06-22 18:38:40
122
原创 springcloud整合mq
基础认知:消费者、生产者、队列。消费者从队列消耗消息,生产者往队列发送消息。生产者和消费者互不干扰。mq:message queue,消息队列。模式:发布-订阅模式。可以用来实现刷新商品。
2024-06-22 11:45:58
136
原创 springcloud-sleuth链路追踪
梳理微服务之间调用的上下游。哪个服务调用量最多,从而梳理出大客户。每个服务调用花费的时间。为什么要使用链路追踪?
2024-06-20 16:39:08
104
原创 springcloud网关层鉴权
提供token的创建(用户登录后发放一个新的token)、验证(校验username和token是否有效,无效则403requestforbidden)和刷新服务。token:类似于访问应用的一个钥匙。鉴权:用户登录之后发放一个新的token,用户访问应用的时候校验username和token是否有效。基于token实现鉴权的技术:oauth、某大型应用使用的推飞、jwt鉴权。实现鉴权的组件:spring的security和apache的shiro。
2024-06-19 10:51:14
280
原创 网关自定义过滤器
time的prettyPirnt()会答应task(接口调用对应的path。条件:实现GatewayFilter或者GlobalFilter和Order(用来设置过滤器执行的顺序,值越小,优先级越高)exchange类似于WebRequest,可以设置attribute和获取请求中的数据已经请求path等。路由规则和过滤器是一一对应的,只对对应的路由生效。then可以返回异步式编程模型Mono,用来实现回调逻辑(打印记录时间的日志)最合适不过了。将过滤器添加到路由规则中就可以生效了。
2024-06-18 22:59:06
171
原创 异步式模型编程框架Mono
chain.filter(exchange)指接口调用。then指执行完接口调用后再执行自己的业务。接口调用前写一个开启计算开始时间的业务。故,在代码执行前后执行一段自己的业务,就是指回调函数。使用场景:gateway实现自定义过滤器。在return中写一个异步式的回调函数。回调:先执行完一个业务再执行另外一个业务。
2024-06-18 22:30:37
217
原创 Java开发规范&开发工具使用经验&Java基础知识&简单业务场景
2、接口抽出的层次结构。从控制层所在服务抽离出实体类,单独用一个module存放实体,实体中只包含属性,不包含方法。业务相关的实现包括方法就写在服务自己的module中。3、架构角度-gateway。保证纯洁性,存粹的用来做转发和限流,相关业务实现写在下游,比如说秒杀接口就在下游。方法名用动词,path用名词。或者方法名和path用名词,把请求方式当作动词。
2024-06-18 17:45:54
123
原创 简单的秒杀场景demo
特别注意锁定再次检索库存数量(假设两个线程同时指定第一次检索操作,都检索到的数量是1,若锁定(同步)代码块中没有二次检索操作,头一个线程执行扣减操作,库存为0,后一个线程拿到锁,执行扣减操作,此时就会出现超卖现象,库存变为-1。该map线程安全,添加商品时,执行putIfAbsent()的多个线程会先后执行,在数据不存在的情况下,添加商品,优先添加同一key的线程会添加成功,其它线程添加失败。接口:1、获取(pid存在,获取)和添加商品(pid不存在,创建,模拟发布商品,少写一个发布接口)。
2024-06-18 17:38:51
132
原创 springcloud网关
商品订单服务背后可能存在成百上千个的节点,也就是说集群,所有节点共同提供商品订单服务相关的api调用,这个时候应该把请求发送到哪一个节点呢?答案依据负载均衡策略发送到对应的节点。由Netflix维护,没有被springcloud指定为官方的网关组件。1、gateway。根正苗红,能打胜仗。底层是基于Netty(特点是通信快)实现的。根据path匹配到对应的服务。springcloud用来做网关的组件有哪些?gateway能用来做什么?
2024-06-16 10:58:34
225
原创 Eureka:config-Bus
2、rabbit-mq,amqp用来适配rabbit-mq,如果想用kafka就把amqp换成kafka。用于更新配置bean。拉取配置文件的链接:localhost:currentPort/config-consumer-prod.json(文件名称)暴露actuator的所有endpoint,链接:localhost:currentPort/actuator.1、github用于存储配置文件。
2024-06-15 16:58:54
188
3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人