自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 windows 构建PHP开发环境

什么是vagrant?vagrant是一个工具,用于创建和部署虚拟化开发环境的。拿VirtualBox举例,VirtualBox会开放一个创建虚拟机的接口,Vagrant会利用这个接口创建虚拟机,并且通过Vagrant来管理,配置和自动安装虚拟机。下载Vagrant链接 这个软件是没有界面的,是命令行工具 windows安装完成后 就自动加到环境变量里了下载Virtual Box链接下载 laravel/homestead 镜像-下图通过镜像进行目录初始化然后打开 vi

2021-06-11 19:00:29 205 3

原创 HTTP认证的几种方式

Bearer Token(翻译:不记名令牌)不记名令牌是 OAuth 2.0 中使用的主要访问令牌类型。Bearer Token 是一个不透明的字符串,对使用它的客户端没有任何意义。一些服务器会发出由十六进制字符组成的短字符串的令牌,而其他服务器可能会使用结构化的令牌,例如JSON Web Tokens使用方式Authorization: Bearer token使用场景对于自己的服务签发的 jwtToken 鉴权服务发放的用于获取用户信息的 access_token,refresh_

2021-06-08 23:33:11 689

原创 proto3 any 的使用方法

import “google/protobuf/any.proto”;value, _ := proto.Marshal(result)comRes.Data =&anypb.Any{TypeUrl: “group/group.FindGroupMembersByCidSidRes”, Value: value}return comRes

2021-06-05 23:59:04 1392

原创 centos

centos7没有netstat命令的解决方法yum install net-toolsCentOS系统下安装lsof命令yum install lsof关闭占用某端口的进程1、查看占用端口的pid lsof -i:port2、杀死占用端口的进程kill -9 pid进程后台运行 nohup python manage.py runserver 0.0.0.0:8090 &...

2021-06-05 23:53:33 83

原创 一些编码习惯

Add make create?1:同层之间 最好不要互调2:Proto 文件编写时1: service 开头字母大写2: message 开头字母大写3: 字段用采用全小写 _ 分割的形式4:http里面的也是采用下划线分割的形式上图中 用户请求的时候 用message_id 或者 messageId 都可以请求成功但是生成的openapi 是mseegeId3:Http uri 设计中的规范?queryParams之前的实体都是小写,实在不行的用-分割queryPa

2021-06-01 15:35:48 98

原创 关于 grpc-gateway 的一些理解

// Register Greeter 把一些 微服务的接口 暴露出去 其实我目前写的不是微服务,而是一个纯网关// 一个proto 文件 如果你想把一些接口暴露出去,就可以加上 google.api.http 这个proto文件对应的东西,这样就可以被网关层发现,然后代理了// 一些微服务接口,不想暴露给用户,就不要加 google.api.http 这个proto文件对应的东西,这样这个接口,只能被rpc调用,不能被rest调用// 但是一个proto文件一般全部都是rpc,或者全部都是h...

2021-06-01 13:26:45 728 2

原创 Mac plantuml 配合 markdown

brew install plantuml 就行了,其他依赖会被连带着安装好vscode里 puml文件是没有 图标的,不过不影响使用vscode 里安装 插件 然后用 alt+D 渲染图片

2021-04-23 20:03:34 226

原创 gorm-Method Chaining

Chain MethodModel Clauses Table Distinct Select Omit WhereNot Or Joins Group Having Order Limit OffsetScopes PreLoad Attrs Assgin Unscoped RawFinisher MethodCreate CreateInBatches Save FirstTake Last Find FindInBatches Row assignInterface...

2021-04-21 22:06:58 141

原创 grpc学习笔记

https://grpc.io/docs/languages/go/quickstart/1:定义好proto 文件2:下载对应的依赖文件// 生成对应的struct文件go install google.golang.org/protobuf/cmd/protoc-gen-go@latest//生成 client和server .go文件go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest// go install

2021-04-21 22:06:13 85

原创 面试记录

2021.2.22日(正月11)今天上午投了一个阿里淘系交易,晚上七点五十来了电话,说要进行面试,最后我才知道这是简历面,不是一面,太难了,最后面试官让我问他问题,我直接懵了,不知道

2021-03-30 21:51:24 283

原创

双亲委派模式类加载器有三种:在java8里1:启动类加载器:由c++编写,系统首先创建的就是启动类加载器 加载路径:jre/lib/xxx.jar 和 jre/classes/bbb.class2:扩展类加载器:加载jre/ext/yyy.jar 只能加载jar包3:应用类加载器 : 包含 启动类加载器和扩展类加载器的范围这里的双亲指的是一个类里面的一个存放父加载器的实例变量在java14里,扩展类加载器变了什么是双亲委派模式?如果其中一个类加载器收到了类...

2021-03-14 22:21:49 179

原创 线程的状态

yield()方法仅释放CPU执行权,锁仍然占用wait(方法会释放锁)中断妙不可言wait()是能中断 否则会抛出java.lang.InterruptedException 异常Java中对线程中断所提供的API支持在以前的jdk版本中,我们使用stop方法中断线程,但是现在的jdk版本中已经不再推荐使用该方法了,反而由以下三个方法完成对线程中断的支持。public boolean isInterrupted()public void interrupt()pub...

2021-03-11 16:15:22 70

原创 分布式锁

如果不用分布式锁,有哪些问题?现在的架构基本都是先分布式再集群化:比如,有库存服务集群,下单服务集群等等。一个集群中的所有服务器,干的事都是一样的,用户的请求会被分散到集群中的某些服务器上,最主要的问题就是数据库压力太大当这些服务器对一些共享资源做读写请求的时候,就可能会出问题。为什么说是可能,因为我们可以通过优化sql的写法,写带锁的sql语句,以及限定某些字段不能为负值等方法,去解决问题,但是带来的问题就是数据库的压力炒鸡大,炒鸡大!其次的是数据共享问题为什么是..

2021-03-10 21:23:02 116 1

原创 mysql的锁

乐观锁:假设本次操作,没有冲突,本质上就是CAS操作,需要我们自己实现,本质上是加一个version字段,在一个事务中, 先获取某一行的version字段,等到更新的时候查看version是否跟刚才的version一样。 一般不会产生死锁,适合用于读多写少的情况悲观锁:先假设这次操作一定有冲突,然后加锁(共享锁或者排他锁), 共享锁或者排他锁都是悲观锁 共享锁也叫读锁(会排斥其他写操作,不排斥读操作), loc...

2021-03-07 16:45:07 157 1

原创 durid连接池源码分析

连接池是什么在系统启动时或者在getConnection,创建若干连接,放到连接池里(durid里本质上是用hashMap存的,key是DuridPooledConnection),对连接进行一个复用一次数据库的连接要经历那些过程?为什么要用连接池因为连接是可以复用,没必要每次运行sql前创建,运行完SQL后就关闭复用连接能减少频繁创建和销毁连接带来的开销,增加程序运行的效率druid连接池中管理连接池的常用参数initialSize ...

2021-03-06 16:38:16 209

原创 动态代理

jdk的动态代理只能代理那些实现某个接口的类如果一个类没有实现接口则需要用cglib去代理JDK动态代理的原理JDK动态代理的核心就是反射和动态生成Class对象。有两个核心类组件,类:Proxy和接口:InvocationHandler。我们自己的handler要实现InvocationHandler接口,创建被代理对象时调用Proxy.newProxyInstance()方法 传入的参数有三个1:被代理对象的类加载器2:被代理对象的interfaces3:MyInvocationH

2021-03-06 15:32:44 101 1

原创 关于线程池的一些思考

线程池的原理ThreadPoolExecutor线程池:有几个比较重要的参数核心线程池的数量:io密集型线程设置多一点(2*N) cpu密集型 设置少一点 (N+1)依赖数据库连接池的任务,因为线程提交SQL后需要等待数据库返回结果,等待的时间越长,则CPU空闲时间就越长,那么线程数应该设置得越大,这样才能更好地利用CPU。keepAliveTime:非核心线程,空闲多长时间后被销毁 unit:时间的单位BlockingQueue:阻塞队列的实现常用的有:·ArrayBlockingQue

2021-03-04 23:34:28 198 1

原创 servlet的加载过程

1:用户发出一个请求,浏览器先从本地host文件中,查找域名和ip的对应关系,如果没有,则去dns服务器去查,得到目标服务器ip地址后,发送一个探测包,看目标服务器是否有回应,如果有,则向目标服务器发送http请求2:tomcat服务器收到请求后,Servlet容器产生链各个对象,请求对象(HttpServletRequest),响应对象(HttpServletResponce)3:解析URL,去web.xml通过servletMapping找到对应的servlet,然后找到对应的servlet-cl.

2021-03-04 14:00:30 587 2

原创 高性能mysql

行锁 表锁acid隔离级别未提交读(X) 提交读 可重复读 可串行化(X)脏读:只存在未提交读上,事务中的修改,即使没有提交,对其他事务也可见不可重复读:同一个事务中,对同一条数据的多次查询,得到不同的结果,并且这个结果,是由其他事务导致的。幻读:某个事务在读取范围内的记录时,另外一个事务又在该范围内插入了新数据,当之前的事务再次读取该范围内的记录时,会产生换行MVVC只在提交读和可重复读这两个隔离级别下运行死锁死锁发生后,必须回滚某个事务Mysql的存储

2021-03-04 00:09:56 105 1

原创 缓存

分布式缓存缓存为什么快缓存是将数据存储在访问速度较高的介质中 能减少数据访问时间,如果结果是运算出来的就可以减少计算时间缓存的更新策略缓存需要更新的原因就是,源数据发生了变化,更新策略就是,更新DB,然后删除缓存妙不可言已过期的 key 如果处理?设置了 expire 的 key 缓存过期了,但是服务器的内存还是会占用,这是因为 redis 所基于的两种删除策略1:(主动)定时删除:定时随机的检查过期的 key,如果过期则清理删除(每秒检查次数在 redis.conf 中的 hz

2021-03-01 13:58:12 113

原创 Nginx

正向代理服务器代理的是客户端,用户的请求先发送到正向代理服务器,然后由正向代理服务器向目标机器发送请求,隐藏了客户端的信息。等目标机器将结果返回后,正向代理服务器再把结果返回给客户端反向代理服务器用来代理服务端的服务器,用户发来的请求,按照轮流,哈希,设置权重,智能等方法将用户的请求转发到被代理的其中一个服务器上反向代理隐藏了服务器的信息通常情况下,我们在实际项目操作时,正向代理和反向代理很有可能会存在在一个应用场景中,正向代理代理客户端的请求去访问目标服务器,目标服务器是一个反向代理服务器,反向代.

2021-02-27 22:36:03 78

原创 你的java代码是如何运行起来的?

首先JVM的前端编译器(javac等)会把.java代码编译成.class的字节码文件,然后类加载器(classLoader)把字节码加载进JVM的方法区,然后在JVM的堆里面建一个该类的Class对象,一个类一个Class对象。然后JVM的执行引擎从程序入口解释执行字节码,由指Java虚拟机的即时编译器或者提前编译器将字节码编译成与本地机器指令集相关的机器码(一般都是两种编译器结合着来进行编译)即时编译器:逐条将字节码翻译成机器码并执行;提前编译器:将一个方法中包含的所有字节码编译成机器码后执行。

2021-02-24 14:52:18 207

原创 java中的 synchronized锁优化

自旋锁与自适应自旋–虚拟机默认开启虚拟机的开发团队也注意到在许多应用上,共享数据的锁定状态只会持续很短的一段时间,为了 这段时间去挂起和恢复线程并不值得。所以可以让需要等待锁的线程,不放弃处理器的执行时间,进行一个忙等,重复尝试获取锁,默认是自旋10次。但是这种自旋对于那种锁被占用很长时间的,只会带来性能的浪费,不会做任何有价值的工作。所以又有一个自适应自旋,如果在同一个锁对象上,自旋等待刚刚成功获得过锁,并且持有锁的线程正在运行中,那么虚拟机就会认为这次自旋也很有可能再次成功,进而允许自旋等待...

2021-02-24 14:16:16 198

原创 ThreadLocal中的一些点

ThreadLocalMap是ThreadLocal中的一个静态内部类ThreadLocalMap中有一个Entry数组,存放着value可能导致内存泄漏因为,ThreadLocalMap中的Entry中的key也就是传进来的ThreadLocal是弱引用,也就说ThreadLocal对象分别有一个强引用一个弱引用,如果ThreadLcoal的强引用失去后,只剩下弱引用,n那就在下次垃圾回收时key就会被回收,value不会被回收,就会导致Entry数组的某一位,e.get() == nulle.v.

2021-02-23 01:50:53 83

原创 JAVA内存模型

操作系统层面–处理器、高速缓存、主内存间的交互关系java层面–线程、主内存、工作内存三者的交互关系

2021-02-21 13:36:00 61

原创 学妹问我:对象的内存布局?

在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例 数据(InstanceData)和对齐填充(Padding)。对象头hash: 保存对象的哈希码age: 保存对象的分代年龄biased_lock: 偏向锁标识位lock: 锁状态标识位JavaThread:* 保存持有偏向锁的线程IDepoch: 保存偏向时间戳实例数据接下来实例数据部分是对象真正存储的有效信息,即我们在程序代码里面所定义的各种类型的字段内容,无论是从父类继承.

2021-02-19 16:19:53 61

原创 Java8开始ConcurrentHashMap,为什么舍弃分段锁?

概述我们知道, 在 Java 5 之后,JDK 引入了 java.util.concurrent 并发包 ,其中最常用的就是ConcurrentHashMap 了, 它的原理是引用了内部的 Segment ( ReentrantLock )分段锁,保证在操作不同段 map 的时候, 可以并发执行, 操作同段 map 的时候,进行锁的竞争和等待。从而达到线程安全, 且效率大于synchronized。但是在 Java 8 之后, JDK 却弃用了这个策略,重新使用了 synchronized+cas。

2021-02-08 14:48:28 1161 2

原创 Hashmap原理

HashMap桶的最大数量就是2^16最多能容纳2^30个Node桶的默认大小(DEFAULT_INITIAL_CAPACITY)负载因子(load_factor):默认0.75hash函数返回:hashCode的低16位和高16位异或结果

2021-02-07 17:37:27 103 2

原创 如何自定义注解?

Annontation是Java5开始引入的新特征,中文名称叫注解。它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。为程序的元素(类、方法、成员变量)加上更直观更明了的说明,这些说明信息是与程序的业务逻辑无关,并且供指定的工具或框架使用。  Annontation像一种修饰符一样,应用于包、类型、构造方法、方法、成员变量、参数及本地变量的声明语句中。  Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和.

2021-02-05 01:02:22 222

原创 Java 泛型 T,E,K,V,?,傻傻分不清?

Java 泛型(generics)是 JDK 5 中引入的一个新特性,泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。泛型带来的好处在没有泛型的情况的下,通过对类型 Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这本身就是一个安全隐患。泛型的好处就是在编译的时候能够检查类型安全,并且所有的强制转.

2021-02-02 18:16:47 160 1

原创 外键约束并保证了什么?

前言:数据库设计中,如果这样设计可能会出错则这种设计就是不对的1:外键不要设计为表的主键(注意是不要而不是不能,外键是可以作为表的主键的,但实际应用中那样设计几乎没有吧,此处请仔细想 )2:被指向的键必须具有唯一性外键约束了什么?约束,被设为外键的那一字段中的值都必须出现在 被引用的列中案例现在有三个表dish(dish_id)order(order_id)order_detail(order_id,dish_id)我在order_detail里对order_id , dish

2020-11-22 02:25:13 456

原创 什么,我被勒索了?

什么,我被勒索了?这学期选了一门方向课-非关系型数据库,这门课有个关于mongo的实验,需要自己搞个mongo数据库连上做实验,我心想这不能在自己笔记本上安数据库啊,否则风扇呼呼呼的,顶得住?索性在华为云租了个服务器,倒也不贵10块钱一个月,安装mongo 开启远程访问 倒也顺利。 但是有一天 他突然变成了这个样子仔细想来倒也不奇怪,安装的时候我就想到了,从头到尾我也没有设置任何密码,会不会有安全隐患,因为只做个实验,数据也没有很重要,也就没多想(毕竟这种事没发生在我身上过)如何给mon

2020-11-21 16:28:47 119

原创 华为云 ubuntu18.04 mongo安装和开启远程访问

ubuntu下安装首先别忘了开启安全组sudo apt-get install mongodb安装好后,查看是否运行:pgrep mongo -l在 terminal 下输入 mongo 进入 mongodb 的 shellmongo启动 mongodbsudo service mongodb start关闭 mongodbsudo service mongodb stop开启远程访问修改 mongodb.confsudo vi /etc/mongodb.conf将

2020-11-11 17:30:09 198

原创 linux关闭占用端口的进程

1、查看占用端口的pidlsof -i:port2、杀死占用端口的进程kill -9 port

2020-10-14 17:39:17 230

原创 服务器环境部署: jdk14 mysql8.0+

.xz文件的解压Python-3.8.6.tar.xzxz -d Python-3.8.6.tar.xz tar -xvf Python-3.8.6.tarmysql-8.0.21-linux-glibc2.12-x86_64.tar.xzxz -d mysql-8.0.21-linux-glibc2.12-x86_64.tar.xz tar -xvf mysql-8.0.21-linux-glibc2.12-x86_64.tartar -xzvf file.tar.gz 解压ta

2020-10-13 17:34:06 194

原创 学妹问我:jps,jstat,jinfo,jmap,jhat,jstack ?

jmap --help/-?/-h 是 最好的官方文档jsp:JVM Process Status Tool虚拟机进程状况工具jstat :JVM Statistics Monitoring Tool虚拟机统计信息监视工具jstat命令格式为:jstat [ option vmid [interval[s|ms] [count]] ] jstat -gc 1524 250 20 S0C S1C S0U S1U EC EU .

2020-09-30 17:34:26 253

原创 学妹问我:JVM内存分配与回收策略?

Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象。 在 Java 中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。新生代 ( Young ) 又被划分为三个区域:Eden、From Survivor、To Survivor。 这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收。 堆的内存模型大致为:从图中可以看出: 堆大小 = 新生代 + 老年代。其中,堆的大小可以通过参数 –Xms、-Xmx..

2020-09-29 15:05:23 159

原创 学妹问我:有哪些垃圾收集算法?

垃圾收集算法可以划分为“引用计数式垃圾收集”(ReferenceCounting GC)和“追踪式垃圾收集”(TracingGC)两大类,这两类也常被称作“直接垃圾收集”和“间接 垃圾收集”。主流Java虚拟机采用追踪式垃圾收集分代收集理论1)弱分代假说(Weak Generational Hypothesis):绝大多数对象都是朝生夕灭的。2)强分代假说(Strong Generational Hypothesis):熬过越多次垃圾收集过程的对象就越难以消 亡。3)跨代引用假说(Inter.

2020-09-28 01:59:14 151

原创 学妹问我:垃圾回收如何判断对象是否死亡?

引用计数法在对象中添加一个引用计数器,每当有一个地方 引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。单纯的引用计数 就很难解决对象之间相互循环引用的问题可达性分析算法当前主流的商用程序语言(Java、C#,上溯至前面提到的古老的Lisp)的内存管理子系统,都是通过可达性(ReachabilityAnalysis)算法来判定对象是否存活的。这个算法的基本思路就是通过 一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据

2020-09-28 00:50:54 166

原创 学妹问我:我遇到了OutOfMemoryError异常怎么办?

除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError(下文称OOM)异常的可能java堆溢出堆在动态扩展的时候,超过最大值-Xmx参数,就会触发OutOfMemoryError异常堆的最小值-Xms参数与最大值-Xmx设置的参数 设置为一样即可避免堆自动扩展while (true) {list.add(new OOMObject());}虚拟机栈和本地方法栈溢出在热点虚拟机中,因为上述两个栈不能动态扩展,所以没有OutOfMemoryError错误

2020-09-26 19:17:49 590

空空如也

空空如也

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

TA关注的人

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