- 博客(37)
- 收藏
- 关注
转载 SpringBoot配置文件加载顺序与互补原则
在执行命令的目录下建config文件夹,然后把配置文件放到这个文件夹下。(在jar包的同一个目录下建config文件夹,执行命令需要在jar包所在目录下才行)直接把配置文件放到jar包的同级目录在classpath下建一个config文件夹,然后把配置文件放进去。在classpath下直接放配置文件。以上1-4优先级逐渐递减。springboot默认是优先读取它本身同级目录下的一个config/application.properties文件。二、互补读取在不指定外部配置文件路径的前提下,sp
2021-12-19 19:57:20
361
原创 40亿个非负整数中找到未出现的数
用到bitmap8个bit只占1B,也就是1B能表示8个数字40亿个数字只需要不到500MBbitmap数组中 存在则为1 不存在则为0;遍历bitArr,哪个下标不是1 则表示未出现该数字进阶:内存限制为10MB
2021-07-07 11:03:05
208
转载 只用2GB内存在20亿个整数中找到出现次数最多的数
1、用到HashMap数据结构,因为是整数类型,key为4B value为4B,和为8B假设一个数重复出现了20亿次,因为整数的范围是-2^31~2^31-1 大约21亿1.6GB大概能存储2亿数据因为整数共42亿个(-21亿到21亿)按照2亿的间隔划分成21个小文件再对这21个小文件进行统计2、如果这20 亿个数数值比较集中的话,例如都处于 1~20000000 之间,那么你都会把他们全部映射到同一个文件中,存不了这么多,怎么解决?那我可以先把每个数先做哈希函数映射,根据哈希函数得到的哈
2021-07-07 10:34:15
416
原创 自定义连接池写法
public class Pool {//1.连接池大小private final int poolSize;//2.连接数组对象private Connection[] connections;//3.连接状态数组 0 表示空闲,1 表示繁忙private AtomicIntegerArray status;//4.构造方法初始化public Pool(int poolSize) { this.poolSize = poolSize; this.connection
2021-07-02 08:39:44
174
原创 spring家族常见面试题整理
(一)Springboot的优点基于Spring框架搭建起来的应用内嵌tomcat等服务器提供Maven根据需要获取相应的start(spring-boot-starter-web,start-aop)约定大于配置(啥玩意都给你配好了,用就完事儿了)(二)Spring MVC配置DispatcherServlet、SpringIOC容器,还得配置服务器去运行,既要开发还要部署和配置。...
2021-06-21 09:35:17
158
原创 了解布隆过滤器
(一)什么是布隆过滤器一个布隆过滤器可以精确地代表一个集合,并可以精确判断一个元素是否在集合中布隆过滤器是一个长度为m的bit类型的数组,即数组中每一个位置只占一个bit,每一个bit只有0和1状态。对同一个输入对象,经过k个哈希函数运算,对算出来的每一个结果都对m取余,然后在bit array上把相应的位置设置为1。在处理完所有输入对象后,该bitmap中已经有相当多的位置为1,至此一个布隆过滤器生成完毕。(二)如何检查对象是否在布隆过滤器中呢假设一个对象为a,把a通过k个哈希函数运算,得到k个
2021-06-21 09:06:01
197
原创 用Docker Compose编排下微服务项目
1、配置好第三方docker-compose-env.yml2、微服务打jar包,改好配置,IP变为对应第三方镜像名称3、微服务制作成镜像dockerfile4、配置docker-compose-app.yml5、执行命令一、创建docker-compose.yml文件docker-compose描述了对容器的配置,镜像细节写在Dockerfile中,而容器配置写在compose.yml上。这点要注意。docker-compose up -d 执行这样会构建一个容器,加上参数 --buil
2021-06-20 11:53:24
213
原创 Docker的学习笔记
一、简介Docker可更快地打包、测试以及部署应用程序,并可缩短从编写到部署运行代码的周期Registry:类似Maven的远程仓库,官方的Docker Hub,是默认的Docker RegistryImages(Docker镜像):类似Maven的本地仓库,和系统光盘有点像,可使用Docker镜像运行Docker镜像中的程序Containers:一个Contains相当于一个OS,容器中的应用互不影响,资源隔离,一个Container用的宿主机的内核client:build,pull,r
2021-06-19 09:32:26
97
原创 分库分表ShardingSphere(ShardingJDBC)学习笔记
(一)使用场景一般情况下,单机数据库容量支撑不住了,应先从缓存技术着手降低对数据库的访问压力,如果缓存使用过后,数据库访问量还是非常大,可以考虑数据库读写分离,如果依然非常大,且业务持续增长无法估量,最后才考虑分库分表。当然了,海量数据的存储可以用HBase,HIVE这些如果确定使用分库分表,就应该在系统设计之初开始对业务数据的耦合程度和使用情况进行考量,尽量控制业务Sql语句的使用范围。(二)ShardingJDBC的应用基本概念这块:逻辑表:t_user:水平拆分的数据库的相同逻辑和数据
2021-06-17 19:37:52
285
原创 Spring IOC的深入理解
控制反转控制对象的创建的权力控制:对象创建的权力原来是由程序员控制的,反转:控制对象的权力被反转了,也就是对象创建不需要程序员来创建了,而是由一个创建工厂(如Spring容器工厂)给我们创建好了,我们程序员只需要通过某种方式向容器索取需要的对象就可以拿到该对象了(注解、xml配置)也就是说我们程序员业务代码和组件创建的代码彻底分离,我们程序员只需专注业务代码,不需要关心我们所需的组件是如何创建来的。真正做到使用即有。依赖注入:依赖:汽车类依赖发动机类,也就是汽车类对象中需要用到发送机类这个对象
2021-06-17 15:02:50
119
原创 随手记 阿里Canal
Canal:Mysql可以做主从,主负责读写,从负责读,从的数据哪里来?通过binlog订阅Canal原理就是把自己伪装成一个数据库的从服务器,从服务器收到canal订阅消息,就会把binlog’数据推过来,推到canal,canal通过解析,把信息转成数据对象,把msg put到MQ,redis可以写一个监听器,去监听MQ。然后同步增量数据。Canal支持高可用架构,不怕挂具体配置:要标明 你订阅哪个数据库中的哪个表,这个库要开启用户的权限(可以被订阅)...
2021-06-16 21:32:26
129
原创 防刷限流策略(redis实现)
(一)防刷策略不能轻易的让机器刷我们的订单的接口需要做一些人工的保障,限流防刷,首先根据 /verifyCode路径请求,生成一个图片二维码(通过一个脚本的执行引擎)Image.getResult() 得到答案,并存储到redis里。然后在/token请求中,传入答案参数,进行校验,获得秒杀地址的令牌,注意,我们的秒杀地址是动态的注意路径,如果答案输入正确,那么就将token,传入到Url上(通过@pathvariable注解传入)。访问真正的秒杀地址。(二) 限流策略1s有10w个人去
2021-06-16 20:07:57
743
原创 对秒杀商品这块先做一个多级缓存优化
一、表的设计关于秒杀这块,一场秒杀活动有好几个场次,一个场次中有多个商品可以被秒杀,从这一句话就可以得出三张表表1:秒杀活动表:表2:限购场次表表3:商品限购场次与商品关联表也就是说一个商品,得知道该商品属于哪次活动的哪个场的秒杀商品~注:秒杀活动的库存不走SKU库存二、关于商品详情页商品详情这块应该是访问QPS最多的业务了,每次查商品详情都走数据库的话,后台受不了所以需要做优化qps(一)不加缓存直接头铁到DB上查,测一测QPS先估测一个值 从200开始 慢慢的压 以100为一个梯度。
2021-06-13 22:44:28
293
1
原创 商品超卖控制和订单业务高并发优化
一、下单业务流程分析订单确认 、下订单(锁库存-创建支付宝订单-生成支付二维码)、扫码支付、异步回调-修改订单状态、查看支付订单下单后减库存,而不是在付款是减库存(以防1000个人准备下单,提示下单成功,但是准备付款的时候却提示因为库存不足而付款失败,用户心态崩了)下单后不付款咋办?非秒杀商品,下单后不付款那么24h后取消,秒杀商品 10min后取消。或者我自己觉得可以在支付页面那里加一个倒计时60s的页面,超时不付款就拜拜。。。二、如何解决超卖超卖:订单数量多于商品真实库存数怎么解决:1、
2021-06-13 22:31:26
495
原创 异常的处理
先自定义各种异常类,让他继承RuntimeException,该类有两个属性,分别是Code和msg,分别是响应状态码和异常消息,该类可以定义多个。然后我们定义一个GlobalExceptionHandler,添加一个@ControllerAdvice 做全局异常处理,也就是说 配合@ExceptionHandler(Exception.class) 可以将所有Exception异常走这个方法,能够实现前端友好显示。...
2021-06-08 09:25:37
86
原创 微服务 第四节 限流容错Sentinel,挺好玩的一个组件,也很强大
一、什么是雪崩效应高并发场景下,A挂了,B还在疯狂的请求A,B会等待A的服务调用超时,调用线程大量阻塞,浪费啊浪费!活活把CPU、内存给榨干了啊…B活活被猪队友A给拖死了。。。B宕机,C,D,也是如此。这种情况叫服务雪崩,也叫级联故障二、咋解决1)超时机制:配置下超时时间,例如1s,那么请求在1s内必须返回,否则把线程掐死,释放资源2)舱壁分离模式:(线程池隔离模式):就是各个服务,你用你的线程池 我用我们 我们互不打扰。3)断路器模式:如果在一定时间内失败次数/失败率达到一定阈值,就跳闸,断
2021-06-04 21:31:56
160
原创 浏览器输入www.baidu.com
一、浏览器输入www.baidu.com1.DNS域名解析,为何解析?因为网络标准规定url只能是字母和数字和其他特殊符号需要转义,不转义会出现歧义。DNS解析过程:首先会向浏览器查询有无缓存,无的话就走本地DNS服务器,再无就走根DNS服务器,然后判断出.com,找到.com这个顶级域名服务器,并把对应的ip列表发给本地DNS服务器,本地DNS服务器再次向顶级域名服务器去查询,顶级DNS服务器经过几次从权威DNS服务器查找,找到了baidu的ip地址,之后本地dns服务器直接向该权威DNS服务器发送查询
2021-06-03 20:19:47
2898
1
原创 微服务学习 第三天 网关服务GateWay
一、常用功能(1)路由转发(2)权限校验(3)限流控制GateWay只支持springboot2.x没有网关的话,前端开发人员需要一个个的将后台微服务IP写到前端工程中,麻烦,冗杂。使用网关,只需要将网关注册到Nacos上,前端开发人员只需知道GateWay的IP就可再通过网关到Nacos中拉取其他微服务的资源二、搭建网关三板斧依赖、配置、注解:注意网关无注解,只是一个服务,开启@EnableDiscoveryClient即可三、网关核心概念路由:配合断言使用,断言为真,则匹配路由断言
2021-06-03 16:09:46
148
原创 Ribbon重要知识点,开发过程中遇到的问题和如何解决
服务网关需要在启动的时候通过ribbon去授权中心拉取我们的密钥也就是在拦截器中,注入RestTemplate,但是在启动消费者服务时,会报错,报找不到生产者服务异常。。问题出在哪儿呢?为什么拿不到呢Ribbon工作原理就是在RestTemplate里面注入我们的LoaderBanlanceClientLoaderBanlanceClient在什么时候塞到RestTemplate里面?是一个定制器将Client塞入到RestTemplate,那么这个定制器是什么时候执行的呢?通过分析spring
2021-06-02 16:07:02
431
原创 微服务第二天 客户端负载均衡器Ribbon
一、服务端负载均衡和客户端负载均衡区别Nginx是服务端负载均衡的,Ribbon是搞客户端负载均衡的。两者区别,个人理解:Nginx是面向前端的,请求打来,会先通过Nginx的负载均衡算法决定分发给哪个具体的服务而Ribbon是面向内部的,这个请求中的方法可以会包含调用其他服务的方法,你比如说订单模块的支付方法中,就需要库存模块的减库存操作,这里 订单模块选择具体哪个库存服务,也需要负载均衡一下,通过ribbon来实现。二、玩一玩Ribbon三板斧:第一步:加入依赖第二步:写注解,在Res
2021-06-02 14:41:48
104
原创 微服务第一天 Nacos
一、注册中心基本原理服务启动时,调用注册中心的注册接口,也就是insert into Register (1,order_name…);1)服务内部维护了三个TimeTask(定时任务),其中TimeTask1会通过心跳接口定时发送心跳,并实时更新注册表中last_heartbeat字段信息(会做定时清理)Update 表 set status=”down” where 当前时间-last_heatbeat>15.2)服务通过TimeTask2会定时拉取商品服务实例ip信息存储到客户端缓存,通
2021-06-01 14:01:09
177
1
原创 搭建微服务认证中心实现微服务鉴权
一、单体应用的安全,传统的SSO某些页面必须登录后才能正常使用,之前了解过单体架构可以通过分布式session或JWT实现传统的sso,又或者通过NG的ip hash算法(原理是根据用户的IP不变,定位到固定的后端服务器中寻找session)这些都不是重点!!!!!二、Oauth2协议个人的理解是这样的:我们可以在Oauth2上实现单点登录,但是Oauth2不仅仅只能实现单点登录,可以实现授权第三方应用有权限去访问另外的服务提供者上的信息,而不需要将你的登录信息(账号密码)提供给第三方应用,安全。
2021-05-31 15:21:37
3261
1
原创 一周算法总结
一、二叉树的深度优先遍历,包括递归和非递归(一)针对递归的方式,因为树的结点在遍历时,每个节点会访问三次,因此在第几次打印决定了是先、中还是后序基本操作: System.out.println(head.val +" "); preOrderRecur(head.left); preOrderRecur(head.right);(二)非递归的方式,深度优先遍历采用栈的操作 1、先序:当前栈不空,先压右孩子再压左孩子 Code如下: public static
2021-05-31 08:58:06
182
原创 电商业务Alipay支付实战(当面付实现)
一、扫码支付业务说明支付宝二维码当面付:(1)获取二维码、扫码支付、等待回调(支付宝后台)、修改订单状态(可能由未支付变为已支付)、定期对账(2)二维码中包含订单信息,以及怎么扣款等信息二、支付宝当面付流程 预下单:将订单信息先交给支付宝后台进行处理。三、支付宝sdk代码集成1、添加依赖包(1)SDK-maven依赖地址说明:https://docs.open.alipay.com/54/103419/2、Demo去了解怎么玩当面付DEMO:https://docs.open.a
2021-05-28 15:00:19
794
原创 商品服务(SKU、下单流程、购物车、优惠券设计)
一、两个概念SKU、SPUSKU:最小库存单位(裤子—蓝色—XS大小---->对应一个库存)SPU:商品具有的属性,不涉及到库存(一)SKU相关表的设计:(1) pms_product_attribute_category 商品属性表通过attribute_count字段记录当前商品有多少个SKU属性在前端显示(2) pms_product_attribute 商品属性参数表product_attribute_category_id字段对应了商品属性表的id注:商品属性表和商
2021-05-26 16:08:22
2036
原创 一周Leetcode(2021/05/16~2021/0521)算法总结
1、剑指 Offer 39. 数组中出现次数超过一半的数字摩尔投票法 int x=0;//众数 int vote=0;//计票器 for(int num:nums){ //票数为0的时候说明数据有变换了 if(vote==0) x = num; if(num==x) { vote++;//票数++ }else{ vote
2021-05-24 09:28:43
151
原创 用户服务模块(Spring Session底层原理与Jwt会话管理)
一、Spring Session底层原理昨天用Spring Session实现了用户分布式Session,那么为什么集成了springSession之后就可以把session存放在redis里面去?原理是什么?(一) Spring Session底层原理通过一个SessionRepositoryFilter将请求中原生的request、response以及HttpSession拦截,并做一个包装,重写内部获取session的逻辑,将getSession()做了一个重写。那么此时Controller中
2021-05-24 09:21:55
551
原创 基础算法复习(二)
一、栈和队列相关算法(1)用数组结构实现固定大小的队列和栈(一)、数组实现栈1、数组实现栈,非常简单,加上一个index的指针,每当数组中add了一个元素,index就++2、当该数组栈需要弹栈时,输出元素,index--即可。3、如果index==数组的长度,则表示栈满了,抛出异常(二)数组实现队列 较难的思路1、设置一个start和end变量分别初始化指向数组0位置,end变量表示如果我要新加一个数,要把数存在哪个位置, start表示如果我要取一个数从哪儿取。2、设计一个si
2021-05-24 08:57:44
83
原创 用户模块的处理(分布式session)
用户模块逻辑PS:前期准备:使用逆向工程(MBG模块)中的generatorConfig.xml将数据库中的表信息生成对应的Mapper、Mapper.xml以及domain(一)用户注册(1)获取otp(一次性密码)校验码的方法,传递电话号码为参数(2)对otp的思考:1、先查询当前用户有没有注册?注册了是不可以发验证码的通过Mapper查询当前参数(电话号码)是否存在,若存在,抛出一个自定义的业务逻辑异常2、校验60s后有无再次发送,校验码存在redis中3、再生产随机校验码(3
2021-05-22 19:51:25
275
8
原创 基础算法复习(一)
(一)基础算法复习(冒泡、选择、插入、递归Master公式、归并、荷兰国旗、经典快排、随机快排、堆排序) 1、一个算法的好坏关键是看它的指标,指标就是时间复杂度,即只要高阶项不要低阶项,也不要高阶项的系数, 当时间复杂度相同时再考虑常数项。 2、冒泡排序伪代码: (1)定义一个尾指针为end首次指向arr.length-1位置,循环减且大于0 (2)i指向数组首部,对比与其下一个元素的大小,i元素大则交换,i循环加并且小于end (3)因为是一种等差数列(0~N-1,0~N-2,
2021-05-21 10:58:50
156
2
原创 环境的安装与部署(一)elasticsearch配置中的一些错误
安装ES的时候,发现课上学的是ES7版本,可是代码中的是6.4.3的版本,对应的是springboot2.1.7版本。安装ES同时需要安装对应版本的ik分词器以及kibana。同时application.yml文件中需要包含以下配置:这块老是报错:Caused by: java.net.ConnectException: Timeout connecting to [localhost/127.0.0.1:9200]原因百度了一下可能是因为:spring默认会去监听本地127.0.0.1:9200
2021-05-20 17:07:17
447
原创 剑指Offer 52-II 0~n-1中缺失的数据
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。有序就要想到二分 或者i,j指针public int missingNumber(int[] nums) {//初始化 int i=0,j =nums.length-1; while(i<=j){//二分 int m = (i+j)/2;// 索引:0 1 2 3 4 5 6 7 8// 元
2021-04-22 10:00:18
54
原创 剑值 57-II和为s的正整数序列,用到滑动窗口
算法剑指Offer 57-II 和为s的正整数序列输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。示例 1: 输入:target = 9 输出:[[2,3,4],[4,5]]例 2: 输入:target = 15 输出:[[1,2,3,4,5],[4,5,6],[7,8]]public int[][] findContinuousSequence(int target) {//滑动窗口法,
2021-04-21 09:40:43
72
原创 leetcode 169
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。class Solution {public static int majorityElement(int[] nums) {//定义好大于一半的数字大小 int pos = nums.length/2+1; int max = Integer.MIN_VALUE; HashMap<Integer, Integ
2021-04-20 21:35:46
121
原创 剑指offer .52
输入两个链表,找出它们的第一个公共节点。public ListNode getIntersectionNode(ListNode headA, ListNode headB) {ListNode Long = headA;ListNode Short = headB;int i=0,j=0;int dis=0;//思路是找出两个链表的长度插值 while(Long!=null) { i++; Long = Long.next;
2021-04-19 09:42:44
114
原创 Leetcode 141 环形链表
算法笔记环形链表 leetcode 141public class Solution {public boolean hasCycle(ListNode head) {//初始判断 if(head==null){ return false; } if(head.next==null){ return false; } ListNode pos = head;
2021-04-19 09:00:28
54
原创 HashMap的一些整理
JAVA面试必备(一) HashMap(基于jdk1.8)@TOCJAVA面试必备(一) HashMap(基于jdk1.8概述HashMap(1.8)底层是由Node类型的数组、链表、红黑树组成的,接下来将会分析其put、resize、get、replace方法1、 讲一下HashMap的put原理:Put底层其实调用的是putval()方法,在put时,首先会算出当前Node的下标值具体算法是,(1)算出key的hashCode值,然后再根据算出的值通过扰动函数再算一遍,扰动函数具体做法是:将
2021-03-10 10:25:49
172
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人