自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(143)
  • 资源 (1)
  • 问答 (1)
  • 收藏
  • 关注

原创 雪花算法源码解析

雪花算法源码解析id的组成雪花算法的id由64位组成,总共分为4部分,第一部分只有一位,是正负标识位,没有其他作用,第二部分由41位的时间戳,第三部分为工作机器id,第四部分为自增序列号41位时间戳能表示毫秒级的时间为69年,意味着id在69年不重复(时钟不会滚)10位工作机器id,这个10位可以自由调整,可以用来表示业务12位自增序列号,表示同一毫秒内能生成的id的数量源码解析const ( nodeIDBits = uint64(10) sequenceBits = ui

2021-11-11 18:03:22 950

原创 mysql-查看binlog日志

mysql-查看binlog日志binlog有三种格式STATEMENTROWMIXED在 MySQL 5.7.7 之前,默认的格式是 STATEMENT,在 MySQL 5.7.7 及更高版本中,默认值是 ROW。可以使用配置文件来修改vim /etc/mysql/mysql.conf.d/mysqld.cnflog-bin=mysql-bin # 开启 binlog# binlog-format=ROW # 选择 ROW 模式# binlog-format=STATEMENT #

2021-07-16 15:27:23 584

原创 Go并发编程-Channel

Go并发编程-Channel​ Channel在Go中是first-class,其地位是非常重要的。在golang中,channel的使用是非常简单的。在Golang中流传一条有名的话Don’t communicate by sharing memory, share memory by communicating.​ 在业务的goroutine中,不要使用共享内存的方式通信,而是使用channel进行通信。简单用​ channel使用make进行初始化,channel分为三种类型,双向c

2021-04-20 15:28:49 277

原创 Go并发编程-map

Go并发编程-map​ hash table的结构时日常开发中经常使用的,在go中内建了map的类型。本文介绍下在并发情况下的map使用map的常见错误map必须初始化后使用,否则会panic// 直接使用忘记初始化func main() { var m map[int]int m[100] = 100}// 结构体中忘记初始化type Counter struct { Website string Start time.Time PageCount

2021-04-19 21:45:32 343

原创 Go并发编程-SingleFlight

Go并发编程-SingleFlight​ SingleFlight是Go提供的一个扩展并发原语。作用是当多个goroutine同时调用一个函数时,只有一个goroutine在真实调用,其他的goroutine在阻塞等待这个goroutine返回,然后直接将第一个goroutine的结果返回。这样可以减少并发时的调用量。在实际的开发中面对大并发请求的场景,如果请求都是读请求可以使用这个合并请求的方式来降低服务的压力。简单用​ 同时开启1000个goroutine,通过count来控制耗时不同查询的请

2021-04-19 21:06:02 442 1

原创 Go并发编程-Semaphore

Go并发编程-Semaphore转自 :Go并发编程-Semaphore信号量就是用一个变量来控制并发能力。在高并发的情况下,资源是有限的,多个线程对于资源的申请和使用,当资源不足时需要阻塞等待,当有资源释放出来时需要通知阻塞等待的线程获取资源继续处理。P/V操作在信号量中有两个操作。P操作(descrease, wait, acquire)是减小信号量的值。V操作(increase, signal, release)增加信号量的计数值。信号量更像一个资源池,p是从池子中获取资源,v就是将资源返还

2021-04-13 20:09:08 686

原创 Go并发编程-内存模型

Go并发编程-内存模型​ 此处的内存模型并不是指Go对象的内存分配、内存回收、内存整理的规范。指的是在并发环境下goroutine读相同变量的时候,变量的可见性条件。换句话说就是,一个goroutine在读取变量时,在什么条件下,能够看到其他goroutine对这个变量进行赋值的结果。​ 由于CPU的指令重排序和多级Cache的存在,保证多核条件下,访问同一个变量这件事情变得很复杂。所以编程语言需要一个规范用来明确多线程同时访问一个变量的可见性及顺序。这个规范就叫做内存模型指令重排序导致的问题​

2021-04-12 19:54:29 129

原创 Go实现的压测工具

Go实现的压测工具​ 压测是用来确定系统稳定性的一种测试方法,主要检测服务器的承受能力,包括用户承受能力。这样可以对未来可能达到用户数量以及活动时高流量时有一个预估,可以提前准备机器来保证项目稳定运行。压测名词及服务器指标名词QPS:服务器每秒钟处理请求数量 (req/sec 请求数/秒 一段时间内总请求数/请求时间)错误率:在压测中,请求成功的数量与请求失败数量的比率平均响应时间:在一次压测中,从发出请求或指令系统做出的反映(响应)的平均时间cpu的利用率:CUP 利用率分用户态、系统态和

2021-02-25 15:30:46 1364

原创 Go并发编程-Once

Go并发编程-Once​ 只执行一次。常用于单例对象的延迟初始化和并发访问下的只需一次初始化的共享资源或者在测试时候初始化测试资源。简单用​ sync.Once 只暴露了一个Do方法,多次调用时只会执行一次func main() { o := sync.Once{} o.Do(GetConn) o.Do(GetConn)}func GetConn() { fmt.Println("获取连接")}​ 分析以上代码:main方法中调用了两次do方法,但是GetConn只执行了一

2021-02-23 18:43:07 120

原创 Go并发编程-WaitGroup

Go并发编程-WaitGroup​ 协同等待,任务编排利器简单用​ WaitGroup解决了并发等待的问题。在使用groutine执行任务时,经常需要等待goroutine全部执行完成后再执行下一步。WaitGroup并发原语非常容易的解决了这个问题。func main() { wg := sync.WaitGroup{} wg.Add(10) for i := 0; i < 10; i++ { go func() { defer wg.Done() fmt.Pri

2021-02-20 19:35:17 204

原创 Go并发编程-RWMutex

Go并发编程-RWMutex简单用​ 读写互斥锁RWMutex与互斥锁Mutex使用方法非常类似。在使用互斥锁Mutex时,并行会变成串行化,降低了效率,分析的时候就会发现读写如果能够分离开能极大的提高效率。也就是将串行读改为并行读,串行写保持不变。这是一个经典的readers-wriders问题。解决readers-writers有三种方案,read-prefer,write-prefer,不指定优先级。Read-prefer:读优先,提高很好的并发性,但是会导致写饥饿问题。Write-

2021-02-18 23:07:54 471 1

原创 Go并发编程-Mutex

Go并发编程-Mutex简单用​ 互斥锁Mutex提供了两个方法Lock和Unlock:进入临界区之前调用Lock方法,退出临界区的时候调用Unlock方法,当一个goroutine拿到了锁,就会阻塞其他gotoute在调用lock的方法上,直到这个锁被释放,并自己获取到了锁。type Count struct { sync.Mutex Count int}func (c *Count) SyncAdd() { c.Lock() defer c.Unlock() c.Count++

2021-02-07 18:19:15 289

原创 有效的单元测试

有效的单元测试​ 好的单元测试会有一些原则,说起来比较容易,但是书写起来就有一些抽象,不太好实践。换一个思路,只要你的单元测试不要出现一些错误,这样对于书写者来说是更容易接受和实践的。在这罗列些单元测试中不要出现的情况:人格分裂​ 好的单元测试不能出现“人格分裂”的情况,单元测试是个单纯的小家伙,没有什么胃口,他只能处理一种情况并妥善执行。如果单元测试中测试了多个功能,那就属于人格分裂。示例func TestNum(t *testing.T) { testNum := 1 evenRes

2021-02-04 21:34:10 365 6

原创 设计模式在实际开发中的应用

设计模式在实际开发中的应用什么是设计模式​ 设计模式和设计原则类似,也是由程序员的前辈们总结出来,写出高质量代码的总结。设计模式的说明及实际应用创建者模式1. 单例模式​ 同一个类型的对象,在全局范围内只有一个。​ 单例模式的用途:(1)解决线程安全的问题。在并发当中我们常采用锁去解决线程安全问题。在java中有synchizoned的关键字,他是对象级别的锁,如果一个类型拥有多个对象,他是不能够解决多个对象对于同一个内容操作时的安全的。​ (2)某些类在其类型上讲,本来就

2020-10-26 16:51:56 2368

原创 MongoDB学习(四)

MongoDB学习(四)Change StreamMongoDB中提供了ChangeStream的功能。此功能类似于关系型数据库中的触发器,有所区别的是Change Stream是异步的,并且只要注册了监听事件,所有的客户端都可以得到请求。​ Change Stream可以监听collection的drop,rename,以及文档的增,删,改等操作。​ Change Stream提供了可重复读的功能,只有大多数节点数据提交之后,才会触发事件。能够保证数据的一致性。​ Change Sream

2020-10-14 11:52:03 316

原创 MongoDB学习(三)

MongoDB学习(三)​ MongoDB作为一个分布式的数据库,数据的一致性是我们必须要考虑的问题。Mongo实现了事务,解决了事务一致性写事务​ MongoDB集群中只有一个primary节点可以负责接收写请求,在写入数据时会写入openlog,其他的secondary节点会将openlog数据读取从而实现同步数据。此时可能就是遇到问题,如下图所示:#mermaid-svg-xjAvhPxE70kfh4cQ .label{font-family:'trebuchet ms', verdana

2020-10-14 11:51:22 217

原创 MongoDB学习(二)

MongoDB学习(二)​ MongoDB作为一个nosql,经常会被认为,使用MongoDB不需要设计,使用一个大文档组织所有的数据,MongoDB不支持事务并且只适用于边缘化的逻辑。这些都是对MongoDB错误的理解Json文档模型设计​ 建模一般会经历三个阶段,概念模型 -> 逻辑模型 ->物理模型(文档模型)。尤其是传统的数据建模,有非常明确的规定,满足第三范式的要求。由于MongoDB使用Json表示的特性,可以省略掉文档模型建模,但是起码要经过概念模型到逻辑模型,所以Mon

2020-10-14 11:50:34 214

原创 MongoDB学习(一)

MongoDB学习(一)​ MongoDB是目前非常流行的nosql,尤其是在MongoDB4.0以后支持了事务操作,让MongoDB适应了更多的场景。目前我们在使用MongDB时,都会采用集群部署,主从结构(一主多从)。MongoDB集群MongoDB数据同步原理​ MongoDB主节点接受所有的写请求,在发生新增,修改,删除操作时会向oplog中写入日志,MongoDB会有一个线程一直监听oplog这个集合,当监听到oplog变动时,就会读取日志,并将日志回放,以此来实现主从同步。Mong

2020-10-14 11:49:52 128

原创 MongoDB学习(五)

MongoDB学习(五)索引MongoDB的索引采用了B树,索引能有效的提高查询效率。创建索引的查询的时间复杂度为logN,相当于做了一次二分法。MongoDB在执行查询时,如果有索引会走一次索引的选择,选择最优的索引情况,最终去执行查询再将结果返回。在使用MongoDB时,理论上所有的查询都应该落在索引上,除非数据很少,可以不落在索引。所以在开发时,有需求到来,首先要去看一下执行计划,检查自己的语句是否有问题。以下为返回的实例,并在关键参数后面增加了注释// db.user.find({user_

2020-10-14 11:49:00 111

原创 mongo connect error no reachable servers

使用mgo操作mongo时遇到了上述的异常,原因是session的使用失败。func foo(){ session ,_ := mgo.Dial("mongodb://127.0.0.1") defer s.Close() session.DB("test").C("coll").Insert(bson.M{"name":"zhangsan"})}上述的函数,调用一次是能够插入成功的,但是循环1000次调用该函数就会抛出异常mongo connect error no reachabl

2020-10-14 11:47:13 1624

原创 网络并发编程

网络并发编程​ 并发编程是指程序在运行期间,可以同时的执行多任务,充分利用资源达到节省时间的目的。实现I/O并发编程的三种方式:进程,线程,协程,异步。这里不过多解释他们之中的基本含义。进程和线程都是基于计算机操作系统的内核的方式,涉及到了上下文的切换。也就是用户核和系统内核之间的切换,这个的成本是比较高的。而协程都是用户级切换,系统内核无感知。所以说协程的效率会更好。协程​ 线程分为用户线程和内核线程,内核线程对应到的是操作系统上。cpu来调度内核线程,内核线程上执行用户线程,也就是说用户线程需

2020-09-21 09:22:56 162

原创 zookeeper应用场景

zookeeper应用场景​ zookeeper是一个分布式协同服务。目前很多开源软件都在使用zookeeper 1. hadoop:使用zookeeper做nameNode的高可用 2. hbase :保证集群中只有一个master,保存集群中的RegionServer列表,保存hbase:meta表的位置 3. kafka :集群成员管理,controller的选举 4. Dubbo 推荐使用zookeeper作为注册中心应用场景配置管理DNS服务组成员管理z

2020-09-10 09:14:47 153

原创 etcd入门

etcd入门​ etcd是分布式协调框架,基本和zookeeper功能和场景相似。它使用高可用的k-v键值对做数据库,采用raft一致性算法。采用Go语言实现。​ etcd使用gRPC对外提供API。总共分为三类Kv:key-value的创建、更新、读取和删除watch:提供监控数据更新的机制Lease :用来支持客户端的keep-alive的消息 可以设置lease和key进行绑定,当lease释放后,key就会被删除,相当于zk中的临时性节点etcd本地安装Mac : etcd-v

2020-09-10 09:09:00 169

原创 设计原则在实际开发中的应用

设计原则在实际开发中的应用什么是设计原则?​ 我们实际开发当中,经常会思考,"代码怎么写才是更好"这个问题,其实这个问题在有程序员这个工作的时候就已经出现了。前辈们也一直在思考,慢慢的提出了一些"好代码"的形容词。比如说:可扩展性,可读性,可维护性等。并且总结出了一些好代码的特点,这些特点就是现在所说的设计原则。也就是说我们遵从设计原则目的是开发出扩展性高,可读性好,可维护性强的代码。设计原则有哪些1. 开闭原则​ 对于扩展开放,对于修改关闭。这里是一个颗粒度的问题,一个动作到底是修改的

2020-09-10 09:07:08 500

原创 JVM工具分析

JVM工具分析JDK监控和故障处理工具名称主要作用jps查看系统内所有jvm虚拟机进程jstat用于收集虚拟机各方面的运行数据jinfo显示虚拟机配置信息jmap生成虚拟机内存转储快照(dump 文件)jhat用于分析dump文件,会建立一个http服务,在7000端口jstack显示虚拟机线程快照处理工具详解jps常用选...

2019-12-17 20:22:30 299

原创 Go环境配置

Go环境配置下载Go下载windows 安装包类型有两种,1. msi 安装版 2. zip 压缩版采用Msi安装选择安装路径,建议不要有中文的路径,防止后续不识别中文。我的安装路径为E:Go环境变量配置GOROOT配置GOROOT可以在全局执行go命令,需要将其配置到系统变量PATH中添加变量 GOROOT 值为Go安装的根目录 E:Go并在Path后增加 ...

2019-11-02 15:22:54 465

原创 docker运行redis并设置密码

docker运行redis并设置密码准备工作一台centos 7服务器或者虚拟机 安装好docker jdk maven git//查询目前可用的reids镜像docker search redis //选择拉取官网的镜像docker pull redis//查看本地是否有redis镜像docker images//运行redis并设置密码docker run -d --...

2019-10-19 15:24:11 797

原创 阿里云redis公网连接

阿里云redis公网连接前提条件拥有一个Redis实例和ECS实例,并且ECS与Redis实例同属于一个vpc部署步骤在Redis实例的白名单中加入ECS服务器私网地址在ECS服务器的安全组中添加安全组规则,允许本地pc的公网地址和Reids实例的私网地址对ecs服务器的访问在ECS服务器上安装rineted(linux端口转发工具)安装、解压并进入到解压目录wge...

2019-07-04 14:39:54 534

原创 mysql查询表字段中是否包含xx内容

mysql查询表字段中是否包含xx内容场景:数据库某表的content段中存储的是json字符串,team字段存储的是班组,并且在json字符串中也存储了team的值。检测数据库中数据是否有包含两个值不同的数据采用mysql中的find_in_set函数;MySQL手册中find_in_set函数的语法:FIND_IN_SET(str,strlist)str 要查询的字符串strlis...

2019-06-24 17:08:05 4488

原创 批量插入并过滤数据库中已经有的数据

批量插入并过滤数据库中已经有的数据场景: 有多条数据要插入在数据库中,并且几个字段是联合唯一索引。这个时候如果采用mybatis的batchInsert或者insertList方法,就不能通过了。同时又不能for循环需要多条数据一一判断并插入到数据库中,这种方式非常浪费资源解决思路:利用数据库本身从A表同步数据到B表的sql,并加上not exists的判断实例:A表字段名...

2019-05-31 15:03:26 1937

原创 nginx配置详细说明

nginx配置详细说明nginx目录说明成功安装nginx并解压,目录有以下几个conf文件夹用于存放配置文件,我们需要重点关注该文件夹下的nginx.conf文件,作用是实现nginx代理的核心配置。该配置内容后面重点讲解。contrib文件夹html文件夹该位置用于存放打包好的项目,直接将dist中的内容直接拖过来即可。但不建议这样做,项目本身的位置应该单独存放,如果...

2019-05-29 14:10:30 259

原创 zookeeper启动闪退

下载好zookeeper后想启动zookeeper,如果是windows直接运行%zookeeer安装目录%/bin/zkServer.cmd即可,运行的时候可能会出现闪退的问题。首先要定位到问题,闪退的原因可能有几种。找到闪退的原因然后对症下药。实际上这个zkServer.cmd是一个脚本文件,脚本里面有个命令pause。可以让程序暂停到这里不往下运行。类似于前端的debgger。和后端的断...

2019-04-17 17:04:59 4411

原创 推荐算法

推荐算法当前的时代,经常会听到推荐两个字。比如:qq好友推荐淘宝购物推荐听音乐,音乐推荐看电影,电影推荐那么这些东西计算机到底是如何实现的呢?   最关键、最难以理解的就是数字化和抽象化,计算机是不可能像人一样给你分析的,一定是将实际中的问题转化成数字问题来解决,最关键的就是如何数字化,换成面向对象来说就是如何抽象。  实际上以上的推荐,从不同程度进行分析。是不一样的。他们的数...

2019-04-08 18:33:55 370

原创 背包01问题

背包01问题背包01问题是一个经典的算法。问题是这样描述的:一个背包最大容量为9kg,现在有5个物品,每个物品都有自己的重量,请问背包最后最多能装多少重量的物品。5个物品的重量分别是2,2,4,8,6解决这个问题可以用多种算法、贪心法、回溯法、动态规划。贪心法:依次那物品,每次挑选最优的情况,这样认为最后就是得到的最优解。这样的解决思路可能会有问题,并不能保证每次都是正确的。对于这个...

2019-03-29 17:54:52 787

原创 tk.mybatis.mapper.provider.base.BaseInsertProvider.<init>()

出现这个错误是通用Mapper初始化的错误,排查的方向就是往这个方向,可能的情况有以下几种:1.jar包冲突MapperCan 扫包配置错误我的错误就是扫描包错误。我的项目是采用spring-boot,在扫描的时候注解为@Configuration@ComponentScan(basePackages = {com.example.reposity})@EnableTran...

2019-03-20 18:04:07 1843

原创 java从线上读取图片转化为byte[]

java从线上读取图片转化为byte[]源码如下/** * 图片转为byte数组 * * @param path * @return */ public static byte[] image2byte(String path) throws IOException { byte[] data = null; ...

2019-03-20 17:53:21 3195 1

原创 Linux Command - sudo学习

在linux操作系统是一个多用户系统,root用户拥有执行所有命令的权利,但是普通用户没有这个权利 这是因为在sudo这个文件中没有配置其他用户的命令权利。 我们在使用中,经常要用到普通用户去执行命令,比如开启防火墙,关闭防火墙等,在不切换到root用户前提下,必须要修改sudo这个文件才能拥有命令。 sudo文件详解: 1输入命令visudo 并输入大写的G(光标跳转到最后)会提...

2018-08-26 20:42:25 278

原创 Linux安装mysql

centos 6.5安装mysql 5.7步骤 1 centos 6.5系统自带mysql 5.1 所以要先卸载 mysql 5.1 查询mysql安装版本: rpm -qa | grep mysql 如果不存在则不用删除,如果存在执行 rpm -e mysql-libs-5.1.73-8.el6_8.x86_64 mysql-5.1.73-8.el6_8.x86_64 ...

2018-08-04 20:29:46 301

原创 Linux 安装tomcat

Linux安装tomcat步骤: 1 下载对应tomcat版本,注意是linux版本。后缀名是.tar.gz tomcat8.5.32版本 2 使用远程连接工具,连接到linux服务器,然后将压缩包上传到服务器上。一般情况下,会将这些软件全部安装到 /usr/local/tomcat目录下,tomcat是自己创建的目录 3 解压刚刚移动过来的压缩包 执行tar -xvf tomca...

2018-08-04 17:21:12 312

原创 java.lang.ClassCastException: org.apache.catalina.connector.RequestFacade ca

原文异常java.lang.ClassCastException: org.apache.catalina.connector.RequestFacade cannot be cast to org.springframework.web.multipart.MultipartHttpServletRequest实现springMvc文件上传报如上错误: 问题出现的原因 ...

2018-08-03 16:40:20 9911 1

WampServer2.2a-x64.exe

php环境搭建

2017-08-11

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

TA关注的人

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