- 博客(102)
- 收藏
- 关注
原创 实际开发中Java线程池怎么配
在实际开发中,业务场景是多种多样的,分为IO密集型与CPU密集型俩种。针对不同的场景。如何配置一个合理的线程池是十分重要的~。接下来我从Java线程池的生命周期以及实际开发场景讲解如何配置Java线程池IO密集型任务:配置更多线程(通常是CPU核心数的2到4倍),以充分利用CPU资源。CPU密集型任务:配置接近于CPU核心数的线程数,以避免过度上下文切换。
2024-06-27 12:01:22
507
原创 Golang -----channel
go 的 select 为 golang 提供了多路 IO 复用机制,和其他 IO 复用一样,用于检测是否有读写事件是否 ready。属于链式结构,存放的是goroutine,主要作用是保证gotoutine执行的顺序性.由数据结构可以看出来,锁的力度是整个通道,读写实际是串形执行的。写操作会panic,读操作会立即返回(剩余数据/或者零值)未缓冲区channel就是数组长度为1的channel。缓存区channel就是数组长度大于1的channel。(前者就是传统的加锁,后者就是channel)
2024-06-24 02:35:27
383
原创 MySQL的组成与三种log
记录数据页的物理变化(可以理解为记录的是DML造成的数据diff)开启事务的时候会产生一个视图,存本次事务id,所有活跃的事务id等。事务开始时,获取一个一致性快照,整个事务期间读取的数据视图保持不变。MySQL写操作同步写的是缓存区与redolog,异步写的磁盘。所以可以通过mysql数据+undolog 找到数据的历史版本。数据的事务id属于活跃的事务id 证明当时未提交,不可读。数据的事务id本次事务id 证明未提交,不可读。
2024-06-04 02:51:14
1158
原创 Java多线程--volatile关键字
简单理解就是当cpu修改了volatitle修饰的变量的值时 会立刻刷新到主内存区中,保证其他cpu操作时时最新值。在java编译的时候,会对加有volatitle关键字的变量 读写操作前加上jvm的内存屏障指令,保证。CPU在操作内存时,因为cpu高速内存的传输效率(寄存器)要比内存的效率快得多,如上,即使加上 volatile关键字,多线程的情况下,count数还是会有问题。多核CPU 为了提升CPU效率,设计了L1,L2,L3三级缓存,如图。例如 i++ 就可分为 读取,修改,写回,并非一个整体。
2024-06-01 21:31:17
448
原创 CMS 中 三色标记概述
CMS 清理流程三色标记概述三色标记其实就是用三种颜色区分不同的内存区域。黑色标记:自己已经标记,直接引用的对象区域已经标记灰色标记:自己标记完成,但引用区域没来得及标记白色标记:没有遍历到的区域,可以理解为没有标记CMS在每次进行标记的时候。从根root广度优先遍历。第一次遍历根root最终被标记为黑色,且引用对象标记为灰色。再次遍历时黑色区域引用区域也已经标记,则不会再次扫描标记,灰色区域需要进行扫描并最终标记为黑色区域。白色区域<未标记>的认为是垃圾,进行清理。可能
2022-05-09 20:36:50
3202
1
原创 Java8新特性->stream流式处理
stream特点不改变原来的数据源,会将操作后的数据保留到另一个对象中惰性求值,流在中间处理过程中,只是对操作进行记录,而不会立即执行常用方法创建流stream() 获取一个顺序流parallelStream() 获取一个并行流中间操作筛选与切片filter 过滤流中的某些元素limit 获取n个元素skip 跳过n元素,配合limit 可实现分页distinct 通过流元素的hashCode跟equals去重元素映射map 接收一个函数作为参数,将每个元素映射为
2022-04-01 17:01:52
492
转载 分布式事务一致性解决方案
最近工作上进行重构,切流量的期间会涉及到新老系统同步更新的情况,这样就设计到多系统保证一致性的问题。针对这个的解决方案,看了一个博客,写的很不错,记录一下~https://zhuanlan.zhihu.com/p/183753774...
2022-03-31 21:25:29
220
原创 分布式系统的了解学习
分布式系统的基本功能配置中心注册中心服务网关负载均衡RPC调用服务熔断服务降级服务限流全局锁控制总线分布式事务服务安全链路追踪集群管理事件驱动任务调度云连接器函数计算配置中心功能区分不同环境的配置<开发,测试,生产>配置动态实时刷新 <实时监听到配置的更改,进行热部署>配置的权限控制配置的版本控制<支持版本回退>配置的灰度发布 <支持部分实例测试通过后,再推到全部实例>注册中心简介注册中心相当于微
2022-03-24 21:37:09
481
原创 使用vim 改变文件编码格式
这几天有个数据导出的需求,但是我用脚本导出表格后,编码是utf-8想着在代码里改一下编码,但是却发现了一种更方便的方式可以使用 vim 改变文件的编码格式在实际生活中相当有用啊!表格导出表格导出其实不需要在后台拼接<table>标签,感觉写起来很费劲有一种更简单实用的表格格式是 .csv 格式,这种文件格式是用 英文逗号分割的,在表格识别时默认以逗号分割 <十分方便>但是在使用的时候有个问题是 – 导出的文件默认按utf-8编码,需要转成 gbk编码这就引出了我后.
2021-09-09 21:29:11
9896
2
原创 记录.vimrc配置。打造适合自己的vim
vim ~/.vimrc " ====================================== " 基本配置 " ====================================== " 不兼容vi命令 set nocompatible colorscheme desert " 打开语法高亮 syntax on " 开启文件类型检查,并且载入与该类型对应的缩进规则。 filetype off " 在底部状态栏显示当前模式,如插入、命令模式 set show
2021-08-11 13:55:20
152
原创 git 深入了解
安装与配置sudo apt-get install gitgit config --global user.name "your Name"git config --global user.email "email@example.com"x 删除当前光标处字母X 删除当前光标上一处字母D 删除光标至行尾的内容db 删除光标至行首的内容 d + .
2021-03-28 14:43:20
288
4
原创 PHP快速入门
PHP快速入门php是弱类型语言变量变量要以 $ 开头变量不需要申明,需直接赋值作用域分为:local,global,static,parameter函数中想要调用全局变量,前面必须加 global关键字在某个局部变量前面加static,可以做到函数执行结束不被删除,但是作用域仍是函数内输出语句echo 可以输出一个或多个字符串 echo "这是一个", "字符串,", "使用了", "多个", "参数。";。且没有返回值print 只允许输出一个字符串,返回值总为1数据
2021-02-02 20:49:39
183
原创 JVM初步了解
JVM跨语言的平台虚构出来的一台计算机。有自己的字节码指令集和内存管理任何语言只要能编译成.class文件,符合class文件的规范。都可以在JVM上运行java从编码到执行到过程:java文件经过javac 编译为class文件class文件经过类加载跟java的核心类库公共加载到内存中去通过字节码解释器解释为执行引擎,执行引擎可直接跟系统硬件交互(所以说java是半编译,半解释语言)。对于经常被使用到的类(当然是少部分),而是会通过JIT即时编译器编译为系统平台可以直接使用的文件。不
2021-01-22 20:23:13
100
原创 TCP粘包和拆包
粘包拆包问题出现的原理粘包拆包问题是发生在网络比较底层的问题,在数据链路层,网络层以及传输层都有可能发生。我们日常的网络应用开发大都是在传输层进行的UDP有消息保护边界, 不会发生这个问题出现粘包和拆包主要有以下几个原因应用程序写入的数据大于套接字缓冲区大小,这将会发生拆包问题应用程序写入的数据小于套接字缓冲区大小,网卡将应用多次写入的数据发送到网络上,这将会发生粘包问题进行MSS(最大报文长度)大小的TCP分段,当TCP报文长度 - TCP头部长度 > MSS的时候,将发生拆包
2021-01-14 17:18:11
234
原创 使用openssl生成自签证书使项目支持https
使用openssl生成自签证书使项目支持https生成CA证书创建私钥 openssl genrsa -out ca-key.pem 1024创建证书请求 openssl req -new -out ca.csr -key ca-key.pem之后按个人的实际情况,填写信息 (这些信息会标明在证书里面)自签署证书 openssl x509 -req -in ca.csr -out ca.cer -signkey ca-key.pem -days 3650生成server证
2021-01-13 16:29:49
396
原创 golang整合swagger的实现以及效果
golang整合swagger的实现以及效果Swagger是一个在线接口文档使用工具,对查看项目接口文档特别是自己测试时有很大的用途效果图整体效果图:可以对接口进行分组, 并且增加注释单个接口的效果图:会根据注释自己生成相应的参数,点击execute 可以获取返回结果golang实现方式 ginSwagger "github.com/swaggo/gin-swagger" "github.com/swaggo/gin-swagger/swaggerFiles" "rtp-c
2021-01-13 16:27:45
4207
1
原创 密码安全存储
关于现在的密码存储的安全性,有很多需要考虑的问题. 直接明文存储或者 双向加密(可以解密)存储都是不可取的有很多人使用了单向加密的方式-----MD5加密但是MD5加密后的安全性并不高。同样可以解出来因此产生了hash+盐的存储方式MD5加密特性:单向加密,不可以解密。特性:同一个密码每次MD5加密后生成的字符串是相同的基于相同这一个特点,只要枚举所有短密码进行 md5 加密,做成一个索引表,就能轻易的逆推出原始密码hash+盐盐是指随机生成的key很多加密算法都是采用ha.
2021-01-04 18:25:15
555
原创 算法小小心得===会持续更新~
java的实用方法System.arraycopy(来,begin,去,begin,length)Character.isLetterOrDigit(ch) 是字母或者数字返回true,不是返回false需要注意的特殊情况当遇到有关数字转化的问题时,要考虑Integer的边界问题
2020-12-31 20:27:03
127
原创 go语言的学习----结构体与方法
结构体t=new(T) 和 var t T的区别t=new(T) 变量t是一个指向T的指针var t T 称为t是类型T的i个实例结构体的内存布局Go 语言中,结构体和它所包含的数据在内存中是以连续块的形式存在的,即使结构体中嵌套有其他的结构体,这在性能上带来了很大的优势。不像 Java 中的引用类型,一个对象和它里面包含的对象可能会在不同的内存空间中,这点和 Go 语言中的指针很像下面的例子清晰的说明了这个问题:结构体工厂创建实例(构造方法)func NewFile(fd in
2020-11-24 16:04:45
576
原创 go语言的学习------Map
Mapvar map1 map[keytype]valuetypekey可以是任意可以用==或者!=所以数组,切片,结构体不能作为key(含有数组切片的结构体不能作为key,只包含内建类型的struct是可以作为key的)。value 可以是任意类型的...
2020-11-19 14:32:16
216
原创 go语言的学习------数组与切片
数组数组是具有唯一类型的一组已编号且长度固定的数据项序列如果想让数组元素类型为任意类型的话,可以使用空接口作为类型go语言中的数组是一种值类型(不像C/C++中是指向首元素的指针),所以可以通过new() 来创建 var arr=new([5]int)数组定义的三种方式var arrAge = [5]int{18, 20, 15, 22, 16}[10]int{1,2,3}:这是一个有10个元素的,除了前三个其他元素都是0var arrLazy = […]int{5, 6, 7, 8,
2020-11-11 15:12:14
216
1
原创 go语言的学习------控制结构与函数
控制结构Go完全忽略了if switch 和 for 结构中的括号,看起来更加简洁一点可以使用return来结束函数的执行,使用goto与标签来调整执行的位置runtime.GOOS上个常量,表示操作系统类型Abs()用来返回一个整形数字的绝对值isGreater()用来比较俩个整形数字的大小if 可以包含一个初始化语句(如:给一个变量赋值)(在初始化语句后方必须加上分号)if val := 10; val<max{// do something}多返回值函数的错误在函数
2020-11-05 20:03:59
163
原创 go语言的学习-----基本类型
基本类型数字类型go语言支持整数和浮点数,并且支持复数位运算采用补码go语言也有基于架构的类型,例如:int,uint等。这些类型的长度根据所在的操作系统而变。比如在32位机器,int类型长度为32,在64位机器,int类型长度为64go语言中没有float类型。(只有float32,float64)没有double类型增加前缀0来表示8进制,增加前缀0x来表示16进制,使用e来表示10的连乘(如:1e3=1000)go语言中不允许不同类型之间的混合使用,但是对于常量的类型限制很少,允许常量
2020-10-29 17:40:17
389
原创 go语言的学习-----常量和变量
常量与变量常量用const定义,用来存储不可改变的数据const pname [type]=value 可以省略type,,因为可以根据值来推测其类型const c2=自定义函数()会报错,因为在编译期间自定义函数属于未知,无法用于常量的赋值,但内置函数可以使用常量也允许并行赋值的形式 const beef, two, c = "eat", 2, "veg"常量在go中是弱类型如何体现:1. 给int起个别名 sint2. 如果函数形参为sint 而传参为int,编译期会出错误,反之一样
2020-10-28 11:18:11
252
原创 go语言的学习-----基本结构和类型
go语言的基本结构和类型文件名与关键字有效的标识符必须以字符(可以使用任何 UTF-8 编码的字符或 _)开头,然后紧跟着 0 个或多个字符或 Unicode 数字_ 被称为空白标识符。他可以用于变量的声明和赋值(任何数据类型都可以赋值给他),但是赋值之后将会被丢掉,无法在后续代码中使用,而且也不可以使用这个标识符进行赋值和运算程序的代码通过语句来实现结构化。每个语句不需要像 C 家族中的其它语言一样以分号 ; 结尾,因为这些工作都将由 Go 编译器自动完成。包与导入package ma
2020-10-27 16:34:17
136
原创 java8新特性:lambda表达式
lambda表达式lambda表达式实现的接口必须是函数式接口函数式接口:接口中,要求实现类必须实现的抽象方法有且只有一个lambda表达式的基础语法在写lambda表达式的时候,只需要关注俩部分即可:参数列表 和 方法体(参数) -> {方法体};InterfaceName lambda1=(a) ->{System.out.println(“这是一个有参无返回值的方法,参数a:”+a);};//a 具体的参数类型会跟 InterfaceName定义方法时的参数列
2020-10-20 14:29:34
118
原创 varchar int查询 到底什么情况走索引的问题
结论:表中的字段类型为整型时,无论查询用字符串类型的数字还是int类型的数字均能走索引表中字段类型为字符类型时,查询的值为整型时,无法走索引如果字段做了函数计算后,该列上即使有索引也无法使用(MySQL8.0之前的版本)实验操作# 创建表test1create table test1(id int primary key,c_no int ,c_2 varchar(1),key c_no(c_no));# c_no字段为int类型,下面分别用整型和字符串进行比较,查看是否走索引。对应的.
2020-10-18 11:41:53
795
1
原创 Java类加载的过程 ----双亲委派
Java类加载类的生命周期#mermaid-svg-IxC4Hkt4bnb9EW0l .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-IxC4Hkt4bnb9EW0l .label text{fill:#333}#mermaid-svg-IxC4Hkt4bnb9EW0l .node rect,#mermaid
2020-10-17 23:37:25
119
原创 Hadoop学习——hdfs
HDFS的整体架构namenode用于存储元数据接收读写请求元数据包括:1. 抽象目录树2. 存储数据和block的对应关系3. block存储的位置datanode负责真正的数据存储,存储数据的block真正处理读写secondarynamenode冷备份节点:助理 当namenode宕机的时候不能主动切换为namenode主要作用是:namenode宕机的时候帮助namenode恢复帮助namenode做一些事情,分担namenode的压力四大机制心跳机制nameno
2020-09-25 19:50:20
132
原创 Http请求
Http1.0和Http1.1的比较http1.1增加keep-alive 持久连接 (在请求头部增加标识)能不能开启多个tcp连接去下载资源呢?是可以的。 谷歌浏览器运行打开6个tcp连接。但不允许打开多个。因为打开多个就相当于D DOS攻击了但是在http1.0和http1.1 队头阻塞 ->请求是严格按照请求顺序处理的。比如先请求1后请求2,则必须在等待1 回来并处理后才能处理2即使开再多的tcp并发链接,队头阻塞也是一个很大的性能瓶颈。Http1.1和Http2.0比
2020-09-21 21:47:59
137
1
原创 前后端分离解决跨域的问题
跨域问题出现的原因浏览器都是基于同源协议的同源政策的目的:是为了保证用户信息的安全,防止恶意的网站窃取数据。同源协议是指:- 协议相同 - 域名相同 - 端口相同同源协议造成的问题:- Cookie、LocalStorage 和 IndexDB 无法读取 - DOM 无法获得 - AJAX 请求不能发送前后端分离跨域问题的解决方法基于nginx正向代理解决server{ listen: 80
2020-09-21 21:34:59
186
原创 并发编程----线程池与future
线程池业务场景分为IO密集型和CPU密集型IO密集型通常 存在线程等待阻塞 线程池最大线程数配置为2×CPU核数CPU密集型通常 不存在等待,每个线程过来都会运行的 线程数最大线程数配置为CPU核数线程池执行原理执行顺序当线程数小于核心线程数时,创建线程。当线程数大于等于核心线程数,且任务队列未满时,将任务放入任务队列。当线程数大于等于核心线程数,且任务队列已满1若线程数小于最大线程数,创建线程2若线程数等于最大线程数,抛出异常,拒绝任务为什么等待队列要使用阻塞队列因为使
2020-09-21 15:35:34
334
原创 数据结构---散列(hash)C++底层版
散列将元素通过一个函数转换为一个整数,使得该整数可以尽量唯一地代表这个元素最常见的散列应用,就是直接把key%length作为数组下标进行存储存在hash冲突的问题C++中解决hash冲突的问题线性探查法当H(key)被占用,就占用 H(key+1) 以此类推,超出表尾就回到表头这个做法容易出现扎堆的现象平方探查法当H(key)被占用,将按下面的顺序检查表中的位置:H(key)+12 , H(key)-12, H(key)+22,H(key)-22如果H(key)+k2超过
2020-09-17 11:49:49
437
原创 算法学习day5---DFS与BFS
DFS 深度优先解决的问题:给定一个起始点和一个终点,判断是否有一条路径可以从起点连接到终点只关注路径存在与否,不在乎其长短深度优先遍历必须依赖于栈,递归时调入函数相当于入栈,执行完函数相当于出栈...
2020-09-16 16:36:14
213
原创 算法学习day3--递归与回溯
递归与回溯递归的基本性质:函数调用本身将大规模的问题不断地变小,再进行推导的过程回溯:利用递归的性质从问题的本身出发,不断的尝试。返回一步甚至多步再做选择,直到抵达终点的过程递归经典案例:汉诺塔算法思想要懂得如何将一个问题的规模变小再利用从小规模问题中得到的结果结合当前的值或者情况,得出最终的结果通俗理解将要实现的递归函数,看成已经实现好的直接利用解决一个子问题思考:如何根据子问题的解以及当前面对的情况得出答案递归算法是自顶向下,动态规划是自底向上递归写法结构总结:第一步:
2020-09-08 21:51:54
695
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人