自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 K8s 学习笔记(一)——pod 详解

文章目录第一章 k8s 介绍应用部署方式的演变K8s 简介k8s 组件k8s 中的一些概念k8s 安装k8s 集群介绍k8s 安装方式k8s 部署应用k8s 资源管理资源管理介绍资源管理方式第一章 k8s 介绍应用部署方式的演变传统部署: app 直接在操作系统之上进行部署。虚拟化部署: 一台物理机上虚拟化多个虚拟机。 每个虚拟机都是独立的环境。容器化部署: 与虚拟化相似,但共享了操作系统。虚拟化部署,与容器化部署程序直接相互隔离,但是虚拟化每个隔离之间都需要操作系统,比较消耗系统的资源。

2021-11-13 21:04:39 5698 2

原创 剑指offer 刷题指南(题型整理)

文章目录前言刷题指南(十条建议)前言终于集中用了7天左右时间把剑指offer 给刷完了,之前 断断续续刷了30多道题,不少还是用c++刷的,秉持着自己的信念要么做就要做好,做完,要么就不要做 我决定集中一段时间把剑指offer 给刷完。因为我现在主要用java 和go 。因为java 有好多已经封装好的数据结构,所以最终用java 吧剩下的题给刷完。因为牛客网有剑指offer 的专题,所以我刷题的平台是牛客网。刷题结果展示:刷题指南(十条建议)我编辑代码和编译的环境是idea。我感觉这个工具

2021-11-13 12:33:48 1424

原创 线程安全之可见性问题

1 多线程下如何实现共享数据可以使用全局变量(静态变量、共享对象)来解决一个全局变量在线程1中被改变了,在线程2中能否看到该变量的最新值? 否并发的线程能不能看见到变量的最新值,这就是并发中变量的可见性问题。> public class VolatileDemo{> //全局共享变量,标识状态> private static boolean is = true;> public static void main(S..

2020-12-02 16:17:00 572

原创 latex安装与使用

latex

2022-10-22 09:35:00 739 1

原创 The missing semester of your CS education 学习笔记

文章目录Shell 使用小技巧Shell 基础知识:Shell 程序中两种流课后练习题:Shell 脚本Vim 编辑器数据整理Shell 使用小技巧Shell 基础知识:shell 是一个编程环境,所以它具备变量、条件、循环和函数。当在shell 中执行命令的时候,其实际上就是在执行一段 shell 可以解释执行的简短代码。如果你要求 shell 执行某个指令,但是该指令并不是 shell 所了解的编程关键字,那么它会去咨询 环境变量 $PATH,它会列出当 shell 接到某条指令时,进行程序搜索

2022-02-15 11:30:43 1323 1

原创 spring 和springboot 整合rabbitmq

文章目录spring && springboot整合 rabbitmq4.1 spring 整合rabbitmq4.2 springboot 整合rabbitmqspring && springboot整合 rabbitmqrabbitmq 的安装相关操作可以参考我的博客rabbitmq安装与操作。4.1 spring 整合rabbitmq新建一个maven 工程rabbitmq,新建两个module为maven 的工程, 一个module 为spring-rabbi

2022-01-08 17:15:54 1482

原创 rabbitMQ 学习笔记

文章目录RabbitMQ 常见的命令1 消息中间件概述1.1 什么是消息中间件1.2 为什么使用消息队列1.3 AMQP 和 JMS1.4消息队列产品2 RabbitMQ2.1 RabbitMQ 安装2.2 RabbitMQ 简单实战3 RabbitMQ 工作模式3.1 简单模式3.2work queue 工作队列模式3.3 发布订阅模式3.4 Routing 模式3.5 Topic 通配符模式3.6 模式总结rabbitmq 常见的操作如果没有配置RabbitMq 的相关变量,可以进到rabbi

2022-01-05 17:22:07 1336

原创 K8s 学习笔记——k8s 中的linux

文章目录K8s 中的linuxname spacedocker 的隔离性是如何实现的docker 网络模式不同network namespace 如何通信K8s 中的linuxname spacepid 为1的进程,系统的创始进程。 每创建一个进程pid的值就会往上增长。 但linux 中并不是只有一个pid 为1 的进程。因为linux 中有namespace的概念。不同namespace 中的的进程是独立的。linux namespace 机制提供了一种资源隔离和虚拟化的特性,PID,

2021-12-11 14:34:35 1280

原创 K8s 学习笔记—— 数据存储(持久化)

文章目录数据存储基本存储EmptyDirHostPathNFSPV 和PVCConfigMapSecret数据存储容器的生命周期可能会很短,会被频繁的创建和销毁。那么容器在销毁的时候,保存在容器中的数据也会被清除。这种结果对于用户来说,在某些情况下是不愿意看到的。为了持久化保存容器中的数据,K8s 引入了Volume 的概念。Volume 是Pod 中能够被多个容器访问的共享目录,它被定义在Pod 上,然后被一个pod 里面的多个容器挂载在具体的文件目录下,K8s 通过Volume 实现同一个Pod

2021-12-11 11:36:39 2615

原创 K8s学习笔记(三)——Service

文章目录ServiceService 介绍kube-proxy 支持的三种工作模式service 资源清单Service 使用实验准备ClusterIP 类型Service负载分发策略HeadLiness 类型NodePort 类型的ServiceLoadBalance 类型的ServiceExternalName 类型的ServiceIngress 介绍ingress 实例1 ingress 环境准备http 代理https 代理Servicek8s 中的流量负载组件: Service (四层路由的

2021-12-04 19:25:01 4140

原创 K8s 学习笔记(二)——pod控制器

文章目录pod 控制器ReplicaSet(RS)Deploymentdeployment 扩缩容deployment 镜像更新deployment版本回退金丝雀发布Horizontal Pod Autoscaler (HPA)DaemonSet(DS):JobCronjob(CJ)StatefulSetpod 控制器在K8s 中,按照pod 的创建方式,可以将其分为两类:自主式pod : K8s 直接创建出来的pod,这种pod 删除了也就没有了,也不会重建。控制器创建的pod : 通过控

2021-12-04 11:49:07 1597

原创 git push 远程仓库失败并与远程仓库发生冲突解决方法

使用git 工具在进行协同开发的时候,有时候会出现这样的问题,当我们需要将本地仓库提交到远程仓库的时候,发现已经有另外一个同学将自己的代码提交远程仓库。这是进行提交就会出现下图所示的界面。使用git fetch 命令查看看到远端有一个提交。git fetch <远程主机名> //这个命令将某个远程主机的更新全部取回本地我们看到远程仓库有一个更新,(分支是用来标记特定代码的提交(每次提交会产生一个值可以通过git log 进行查看本地的commit 记录),每一个分支通过SHA1sum

2021-11-24 17:41:47 3439

原创 剑指offer 系列之-重建二叉树(详细讲解)

题目描述解题思路根据前序遍历与后续遍历的规则得出下面结论。代码实现 HashMap<Integer,Integer> hashMap=new HashMap<>(); public TreeNode reConstructBinaryTree(int [] pre, int [] in) { int preLength=pre.length; int inLength=in.length; if(preLength!

2021-11-22 09:46:48 552

原创 leetcode 系列之-快速判断整数是否溢出并解决整数反转溢出

文章目录前言如何判断整数是否溢出举例说明整数反转将字符串转为整数前言在刷leetcode 时,经常要算y=10*x 此时需要判断整数y是否溢出 。比如说整数反转题,需要判断反转后的整数是否溢出,字符串转整数也要判断是否溢出。第三部分将会介绍这两道题,并给出解决方案。如何判断整数是否溢出判断y=x*10是否溢出,只需比较y/10 与x 是否相等,不等则溢出举例说明整数反转题目描述代码实现:public class 整数反转 { public static void main(S

2021-11-08 22:07:24 5005

原创 go 学习笔记 之 使用gob 进行序列化和反序列化

方法介绍编码使用 gob.NewEncoder(io.Writer).Encode(将要编码的值)解码使用 gob.NewDecoder(io.Reader).Decode(将要解码成的值)// 进行序列化func (b *Block) Encoder() [] byte{ var buffer bytes.Buffer //新建编码对象 bytes.Buffer 可以当作 io.Writer encoder := gob.NewEncoder(&buffer) //序列化,将

2021-10-28 22:33:50 913

原创 go 学习笔记 之sync.Pool

文章目录作用代码解析go 真的是一门神奇的语言,让我遇到了之前没有见过的协程,这次我又见到了sync.Pool。为表尊重,加以记录。作用sync.Pool 定义了一个池子。通过这个池子可以复用已经使用过的对象,来达到优化内存使用和回收的目的。sync.Pool 中有三个方法需要我们了解,New、Put、Get。通过New去定义你这个池子里面放的究竟是什么东西,在这个池子里面你只能放一种类型的东西。我们随时可以通过Get方法从池子里面获取我们之前在New里面定义类型的数据。当我们用完了之后可以

2021-10-28 18:50:17 185

原创 zookeeper 实现分布式锁原理讲解

这里写自定义目录标题前言为什么要实现分布式锁分布式锁实现非扩展锁vs 扩展锁本篇博客参考论文ZooKeeper: Wait-free coordination for Internet-scale system (ZooKeeper 互联网级别的无等待协调系统)前言为了读者更好的理解zookeeper 分布式实现原理,现对zookeeper 一些机制和client Api 进行介绍。Watch 机制: 通过指定watch,可以监听对应文件的变化,zookeeper 可以确保如果文件有任何变更,都

2021-10-17 21:09:54 938

原创 leetcode系列之-树(tree)题型总结

文章目录树模板路径总和112未完待续树模板路径总和112题目简介解题思路:现在大部分树的题大多使用递归解决。对于该道题用一个变量记录递归到某一层时,root到其根叶子节点的路径和。递归结束意味着要返回上一层,要减去该层的值进行复原。类似于二叉树的先序遍历。public int count=0; public boolean hasPathSum(TreeNode root, int targetSum) { if(root==null){ retu

2021-09-13 10:20:22 983

原创 leetcode 系列之-动态规划题型总结

动态规划问题一般性总结动态规划题目通常用于解决计数类问题。常见有线性DP,区间DP,背包问题等。解决背包问题通常要明白下面几点。属性:Max / Min /数量 动态规划问题最终通常让求解某一问题的最大值,最小值,数量。出现这几个字段,我们就要考虑是否应用动态规划能够解决该问题。 比如说: 最大连续子序列和,最长不下降子序列。状态表示: 解决动态规划问题的一个关键点就是 状态表示,状态表示根据问题而变化,最终能求出问题的最优解。状态表示的本质就是记录子问题的解,来避免下次遇到相同子问题重复计算。比

2021-09-09 12:54:36 772

原创 java go多线程:两个线程交替打印 0~100 的奇偶数

最近在实现raft算法,用到了很多go的高并发的知识,看到一道题写两个线程交替打印 1~100 的奇偶数,突然来了兴趣。题目要求我们要启动两个线程,一个打印奇数,一个打印偶数。中途不能跳出协程。算法思想:启动两个协程对同一个变量进行操作,当一个协程对该变量进行操作时进行加锁,另一个协程等待。释放锁后再进行操作,每次操作进行加1即可。代码如下:import ( "fmt" "sync" "time")type Tongbu struct { count int mu sync.Mute

2021-09-04 11:22:44 1137

原创 leetcode 系列之-滑动窗口算法题型总结

滑动窗口简介滑动窗口算法是在给定特定窗口大小的数组或字符串上执行要求的操作。This technique shows how a nested for loop in few problems can be converted to single for loop and hence reducing the time complexity.该技术可以将一部分问题中的嵌套循环转变为一个单循环,因此它可以减少时间复杂度。其实这里就可以看出来滑动窗口主要应用在数组和字符串上。可以用来解决一些查找满足一定

2021-08-28 11:06:32 796

原创 浅谈GFS之---读写文件流程

文章目录Master 主要的两个表单读文件流程写文件流程primary chunk 不存在Master 主要的两个表单客户端要从chunkserver 上读写文件首先要发请求给Master获取文件相关的数据。将数据缓存到客户端本地(后面将介绍为什么要这么做)。根据相关数据与chunkserver 进行交互,实现文件的读写。每个chunk 的大小为64MB。Master主要有两个表单来存储相关的元数据(注意有的元数据需要持久化到硬盘,有的只存放在内存,后面将介绍为什么这样做)。两个表单如下:文件名

2021-08-16 16:50:24 3235

原创 go rpc简介并实战

RPCRPC(Remote Procedure Call,远程过程调用)是一种计算机通信协议,允许调用不同进程空间的程序。RPC 的客户端和服务器可以在一台机器上,也可以在不同的机器上。程序员使用时,就像调用本地程序一样,无需关注内部的实现细节。为什么需要rpc两台机器上,两个应用程序之间需要通信。首先需要确定采用的传输协议是什么?​ 两个应用程序位于不同的机器,那么一般会选择 TCP 协议或者 HTTP 协议;那如果两个应用程序位于相同的机器,也可以选择 Unix Socket 协议。报文的

2021-08-08 10:19:10 766

原创 go module使用简介并解决 goland go Cannot resolve file ‘xxx ‘ 错误

go mod go Cannot resolve file 'mr1 Goland 打开文件显示 go Cannot resolve file ‘mr’ 错误解决方法 下图所示勾选原因可能是因为 GO MODULE 功能还需完善,GOLAND默认是关闭该功能的,我们需要手动打开(不排除之后更新会不会改成默认开启)这样做的目的是让goland 开启 go modgo module 介绍go module是go官方自带的go依赖管理库(类似于maven 与npm ),在1.13版本正式推

2021-08-06 20:53:38 3645

原创 go 学习笔记 之-序列化与反序列化 文件操作(解释为什么要进行序列化)

小技巧小技巧: 为了方便操作我们可以将file相关结构封装成结构体或全局变量type DBFile struct { File *os.File Offset int64}var ( newFile *os.File err error)创建空文件package mainimport ( "log" "os")var ( newFile *os.File err error)func main() {

2021-07-14 18:24:50 2418

原创 ubuntu查看apt 源中所有版本,并指定版本。(若没有相应版本解决方案)

查看/etc/apt/sources.list 中所有源软件的版本apt-cache madison 软件名安装指定版本 apt install 软件名=version没有对应源的解决方法如果源没有想要的版本 需要去官网下载 找到链接 wget + 链接解压 tar zxvf 软件名进入解压文件 ./configure make sudo make install 就 可以安装好了...

2021-06-25 16:46:19 10220

原创 一文读懂NVME为什么比较快

引言注意这里所说的快指的是是与传统的固态硬盘相比,而不是与HDD(机械硬盘)相比。因为固态与机械硬盘因其本质结构(固态省去了寻道时间和旋转时间),所以固态比机械要快。具体快多少要根据相应操作来确定。对于顺序读取(定位一次,大批量数据读写) ,SSD大概是HDD 的两倍。而随机存取,SSD要远远大于HDD。SSD 存储接口协议我们知道存储设备要与主机进行通信,需要定义接口规范,接口,总线。SSD存储协议如下图SATA接口最为原始,只支持SATA传输协议与AHCI上层协议。作为融合了多种协议的接口

2021-06-09 15:03:43 1443

原创 linux io栈(读写流程)

1 应用程序通过系统调用访问文件(无论是块设备文件,还是各种文件系统中的文件)。可以通过open系统调用,也可以通过memory map的方式调用来打开文件。2 Linux内核收到系统调用的软中断,通过参数检查后,会调用虚拟文件系统(Virtual File System,VFS),虚拟文件系统会根据信息把相应的处理交给具体的文件系统,如ext2/3/4等文件系统,接着相应的文件I/O命令会转化成bio命令进入通用的块设备层,把针对文件的基于offset的读/写转化成基于逻辑区块地址(Logical B.

2021-06-08 16:47:13 2849

原创 ssh: Name or service not known

在/etc/hosts 文件中输入相应的hostname及其对应的 ip 地址

2021-05-26 19:11:23 2255

原创 如何实现go 语言切片的深拷贝

问题引入go 语言中切片是引用类型。当我们把一个切片赋值给一个变量。对这个变量的修改也会改变原有的值。如下:package mainimport "fmt"func main() { // 也可以通过数组来构造切片 // make函数构造切片 a:=make([] int,2,10) // 切片是引用的类型 b:=a b[0]=1 b[1]=2 // a b 的值被同时修改 fmt.Println(a) fmt.Println(b) }运行结果由运行结果可以发现,当将

2021-05-18 20:41:28 1604

原创 go语言切片声明与数组声明的区别

注意数组是固定大小的在声明的时候需要给定大小而切片是可变的无需给定大小数组声明//声明数组不进行初始化var s1 [4] int//声明切片并初始化var s =[4] int{1,5,6,7}切片声明//声明切片不进行初始化var s1 [] int//声明切片并初始化var s =[] int{1,5,6,7}...

2021-05-18 19:09:35 539

原创 java 详解匿名内部类与函数式接口

引言匿名内部类也就是没有名字的内部类,正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写。匿名内部类的前提必须是继承与类或实现相应接口。匿名实现类的总体效果就是父类的子类对象或子接口的实现接口。不使用匿名内部类1 创建 Animal 的抽象类并提供eat 方法 abstract class Animal{ public abstract void eat();}2 定义一个dog 继承自Animalclass Dog extends Animal{ @Ov

2021-04-30 19:27:13 1815 1

原创 java 集合中各类型相互转换

代码示例import java.util.*;public class CollectionTransform { public static void main(String[] args) { // List 转化为Array ArrayList<String> strings = new ArrayList<>(); strings.add("12345"); strings.add("456");

2021-04-26 10:23:37 548

原创 深入了解netty链式调用

在netty中pipline 可以理解成双向链表。但是,Handler却又存在着入站和出站之分。那么Netty是如何将两种类型的Handler保存在一个链表中,却又能够入站的时候调用InboundHandler,出栈的时候调用OutBoundHandler呢?看下图,黄色的表示入站,以及入站的Handler。比如我们在pipline中添加如下代码:@Overrideprotected void initChannel(SocketChannel ch) throws Exception { C

2021-04-14 10:02:52 456

原创 servlet 监听器 springboot 实战

什么是监听器?监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。Servlet监听器在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为 ServletContext, HttpSession 和 ServletRequest 这三个域对象。Servlet监听器分为三大类1、数据域对象创建和销毁监听器2、数据域对象和属性变更监听器3、绑定到 HttpSession

2021-04-13 16:41:47 242

原创 Java 将.proto文件转化为.java 文件举例

前言google 的 protoBuf 为数据化存储格式,RPC 数据交换格式,支持跨语言。使用 protobuf 编译器能自动生成代码,Protobuf 是将类的定义使用.proto 文件进行描述,然后通过 protoc.exe 编译器根据.proto 自动生成.java 文件.将.proto文件转化为.java 文件定义一个Student.proto 文件 代码如下syntax = "proto3"; //版本option optimize_for = SPEED; //加快解析option

2021-04-12 18:21:33 2297

原创 Atomic原子类及其底层原理

并发包java.util.concurrent的原子类都存放在java.util.concurrent.atomic下JUC 包中的原子类基本类型AtomicInteger:整形原子类AtomicLong:长整型原子类AtomicBoolean:布尔型原子类AtomicInteger 类常用方法public final int get() //获取当前的值public final int getAndSet(int newValue)//获取当前的值,并设置新的值publi

2021-04-08 09:07:35 988 3

原创 java 多线程之synchronized原理

原理概述synchronized是基于对象监视器实现的。java中的每个对象都与一个监视器关联,一个线程可以锁定或者解锁监视器,从而拿到对应对象监视器的操作权;一次只有一个线程可以锁定监视器;当一个线程锁定一个监视器以后,其他所有试图锁定该监视器的线程都会被阻塞,直到它们可以锁定该监视器为止。类锁与实例锁synchronized 可以作用于变量、方法、对象。synchronized在非静态方法上:锁的对象 是 类的一个实例 ; 在静态方法上:锁的对象 是 类本身,即类锁。除此之外,public st

2021-04-07 21:05:54 105 1

原创 selector.selectedKeys()与selecot.keys区别

selector.keys 返回当前所有注册在selector中channel的selectionKeyselector.selectedKeys() 返回注册在selector中等待IO操作channel的selectionKey

2021-04-06 12:29:48 2401

原创 java 使用NIO进行文件的读写

前言在NIO中使用FileChannel 用于文件数据的读写FileChannel方法public int read(ByteBuffer dst)从通道读取数据并放到缓冲区中,此操作也会移动 Buffer 中的position指针,不断往position中放数据,read完成后position指向limit。public int write(ByteBuffer src)把缓冲区的数据写到通道中,此操作也会不断移动Buffer中的position位置直到limit,读取到的数据就是positi

2021-04-04 21:42:45 4908

空空如也

空空如也

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

TA关注的人

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