- 博客(53)
- 资源 (1)
- 收藏
- 关注

原创 经验分享:我推荐这两款SD-WAN
最后,我来说说,我理解的SD-WAN,它的全称:Software-Defined Wide Area Network,即软件定义广域网,直白一点就是用软件来连接网络,具体它内部怎么分发流量的,不需要关注,有可能是走专线,有可能是通过POP点转发,也有可能是优化了广域网的协议,相对于专线,SD-WAN更便宜。关于费用问题,我也比较过,具体多少钱,需要根据的自己业务量选择相应的配置的套餐,使用SD-WAN是一个订阅式服务,会涉及续费问题,具体签了多少的钱的合同,我这里就不便透漏了。这样的流程,其实很低效。
2024-11-10 15:41:59
1187

原创 使用dlv调试golang程序
1、编译选项go build -gcflags=all="-N -l" ## 必须这样编译,才能用gdb打印出变量,第二个是小写的L,不是大写的i需要加编译选项,类似gcc中的 -g选项,加入调试信息。关于如何安装dlv,请自行百度或者谷歌。2、使用dlv调试dlv的功能介绍Usage: dlv [command]Available Commands: attach ......
2018-12-09 12:37:35
19195
原创 企业跨境互联:SD-WAN解决了OpenVPN的哪些问题?
最近,有一些读者,还有一些客户,总是疑问SD-WAN和OpenVPN到底有啥不一样?有什么优势?先声明,我们今天讨论的都是企业级的跨境互联问题,我们仅为企业客户提供网络解决方案。
2024-11-23 21:26:19
849
原创 请假的羞耻感
如果中国所有企业都双休,不允许加班,那么企业的生产成本会提升,所生产的货物在国际市场上没有竞争力,因为就算中国不内卷了,但是越南会内卷、印度会内卷,他们的竞争力会提升,会抢夺中国的市场,会导致中国企业破产和更多的人失业。中国的文化,其实是推崇集体主义,即少数服从多数,个体服从集体,不要锋芒毕露,不要特行独立,任劳任怨,不屈不挠,埋头骨干,拼命硬干,反正就是吃苦在前,享受在后,前人栽树,后人乘凉,舍己为人,舍小家保大家。请假,仅仅只告诉领导,这可能是害怕对比压力,不想让别人知道,想做到悄无声息的休假。
2024-11-11 22:57:36
721
原创 Mysql事务的实现
文章目录四种隔离级别的实现行锁MVCC实现四种隔离级别的实现结论:对于RR和RC级别隔离,InnoDB使用MVCC+行锁实现。对于Serializable,使用表锁实现。具体实现:在可重复读(RR)的隔离级别下,事务启动时得到一个事务ID,整个事务存在期间只能看到小于等于这个事务ID的版本数据。(MVCC实现)在读提交(RC)的隔离级别下,每个SQL执行时,得到一个事务ID,这个SQL只能看到小于等于这个事务ID的版本数据。(MVCC实现)在串行化(Serializable)的
2021-11-28 16:12:37
798
原创 B树和B+树的区别
文章目录B树B+树比较疑问每个子节点内部的数据一定是有序的吗?进入叶节点后,查询的复杂度是怎么样的?B树定义class BTreeNode { int *keys; // 存储关键字的数组 int t; // 最小度 (定义一个结点包含关键字的个数 t-1 <= num <= 2t -1) BTreeNode **C; // 存储孩子结点指针的数组 int n; // 记录当前结点包含的关键字的个数 bool leaf; // 叶子结点的一个标记,如果是叶子结点则为t
2021-11-25 08:15:19
582
原创 Docker解决部署难题
文章目录部署存在的问题docker如何解决docker VS 虚拟机参考部署存在的问题1、环境依赖一个程序的运行,需要依赖文件系统、网络、动态库、各种运行时(例如Java虚拟机)等等。最简单的例子,一个Java程序要运行,机器上必须装有Java虚拟机。程序要写日志,对应的目录必须是可写的。因此,程序的部署依赖于环境的配置,配置环境需要消耗不小的工作量。2、环境冲突一台机器上,一般要部署多个服务程序。首先,它们的环境依赖可能存在冲突,比如A服务和B服务只能有一个监听80端口,它们依赖的运行时版本
2021-11-21 12:44:24
1501
原创 Linux系统平均负载的含义
定义平均负载,表示当前正在运行的线程加上等待运行的线程的数量。## 8.70表示过去1分钟的平均负载,7.33表示过去5分钟的平均负载,6.29表示过去15分钟的平均负载top - 10:01:07 up 83 days, 23 min, 1 user, load average: 8.70, 7.33, 6.29 分析对于一个良好的系统,平均负载应该小于CPU核心数,这意味着所有的任务都可以被及时处理,而不需要等待,反之说明任务过多,无法及时响应,长期处于这样的状态,机器存在性能问题。
2021-11-21 10:19:41
1373
原创 如何在docker中产生core文件
docker参数 security_opt: - seccomp:unconfined privileged: true ### 主要是这一项 cap_add: - SYS_PTRACE - SYS_ADMIN ulimits: core: -1 # may also use -1 to indicates unlimited启动脚本## 配置core文件名的格式、保存位置 ## 正常情况下,不能修改
2021-11-18 23:16:50
3304
原创 Golang易错知识点
文章目录string和'\0'sliceWaitGroup使用range产生的临时变量goroutine泄露闭包闭包与range带来的问题对象滥用的后果string和’\0’Golang的string内部就是字节数组,末尾没有’\0’,对于Golang来说,’\0’也是一个普通的字节。其他语言在传输字符串的时候有可能在末尾加’\0’,那么Golang解析的时候会在末尾多了’\0’字符。就会出现很尴尬的事情。比如C语言传输了’CHINA\0’,Golang解析后,再用’CHINA’比较,就不会相等了,但
2021-11-17 23:34:25
1300
原创 Mysql索引设计和使用
文章目录1 概述2 设计原则3 设计误区4 索引方法5 索引类型6 参考资料1 概述索引就是对某些字段提前排序,生成特定的数据结构(例如B+树或者哈希),然后加快查询。2 设计原则要在过滤字段上创建索引。即where后出现的字段上创建索引。要在取值范围广的字段创建索引。比如用性别字段创建索引,那意义就不大。尽量使用短字段做索引。首先是节省空间,其次是IO较少,比较更快。主键尽量使用自增、整型字段。因为普通索引会保存主键,太长的主键会占用空间。创建联合索引时,利用最左字段查询。创建联合索引后
2021-11-13 11:03:05
884
原创 Mysql四种隔离级别
文章目录查看隔离级别四种隔离级别read uncommitted ( RU,读未提交 )read committed (RC,读已提交 )repeatable read (RR,可重复读)serializable 可串行化隔离解决的问题dirty read 脏读non-repeatable read 不可重复读phantom 幻读对应的解决方法查看隔离级别首先隔离级别是Mysql的一个参数配置,是可以修改的。SQL为:SHOW VARIABLES LIKE 'transaction_isol
2021-11-11 21:37:22
3033
2
原创 C语言实现选择排序
文章目录算法描述C语言代码实现算法特点时间复杂度算法描述第一步,找到数组中最小的数据,把它和第一个数据交换位置第二步,在剩余数据中,找到最小的数据,把它和第二个数据交换位置如此不断地重复,直到所有的数据排好顺序因为这种算法,总是在剩余数据中选择最小的数据,所以叫做选择排序。C语言代码实现#include <stdio.h>void SelectSort(int data[], int len) { for (int i = 0; i < len; i++) {
2021-10-13 23:11:52
336
原创 写博客的原则和方法
文章目录原则篇1、不写安装教程类博客2、用自己的语言来表达3、站在他人的肩膀上方法篇1、平时注重记录2、平时注重总结3、平时注重思考原则篇1、不写安装教程类博客比如Mysql安装教程,Redis集群搭建,Golang在Linux上安装配置教程等等,这类教程网上非常多,也有一定的作用。但是,却不是我写博客的范围。因为,我觉得这种工具类的软件,其官方会有对应的教程,我不用去写这类教程。另外,纯操作类型的教程仅仅指明如何操作而已,既没有说明底层原理,也没有说明这样操作的目的,反正就是跟着操作就对了。参与者
2021-09-05 19:47:22
905
原创 Golang中如何处理tcp粘包
文章目录为什么要处理粘包处理粘包的方法总结为什么要处理粘包由于tcp协议是数据流传输,一次读数据不一定能得到一个完整的业务数据包,所以需要进行粘包处理,保证要处理的数据是一个或者多个完成的业务数据包。处理粘包的方法假设:包的格式为 四字节包头 + 包体, 包头指明包体的长度大端传输数据处理过程:先读取四字节包头,解析出包头的长度bodyLen再读取bodyLen长度的包体,这次读取的数据就是一个完整的业务包bodyData把bodyData返回到业务层处理处理代码如下:c
2021-09-05 18:05:37
1442
原创 slice在Golang中的实现和应用
文章目录底层实现创建slice的三种方法1、使用make创建slice2、使用数组创建slice3、直接定义向slice插入数据直接使用在索引位置插入使用append插入数据总结底层实现struct Slice{ byte* array; // actual data uintgo len; // number of elements uintgo cap; // allocated number of elements};我们知道slice是用来管理一个内存地址连续的内存空间
2021-09-05 12:36:27
677
原创 Golang和C++简单对比
文章目录编译内存管理标准库性能并发编程语法复杂度开发和调试难度总结编译都可以静态编译,直接编译成二进制文件。目前,许多语言(比如Java,C#)都是基于运行时,能静态编译语言的不多,Go算一个。同时,都可以跨平台。内存管理在C++中,需要自己使用new和delete管理内存,尽管C++已经有了智能指针,但是有一些坑,不是那么好用。Go虽是静态语言,但是自己管理内存,减轻了程序员的心智负担。这一点,非常重要。因为C++程序的崩溃,大多数时候都是内存问题,比如内存泄漏,非常难以解决。标准库一门语言
2021-08-29 14:08:11
7333
4
原创 写博客的五个好处
文章目录绪论减轻记忆负担减少检索时间知识积累显性化有利于传播和复用总结经验绪论写博客,其实是一件费力费时的事情,现实中没有多少人能长期坚持下来。我自己也是断断续续地写,也没有写坚持下来。在实践的过程中,我本身却是收益良多。我养成了记录的习惯,记录确实提高我的工作效率。其根本原因:程序员本身就是一个知识工作者,每天的工作就是使用知识、创造知识。人的大脑,处理能力是有限的,记忆力更是不靠谱,因此做好知识管理可以分担大脑的负担。为什么有的人总是遗忘,总是粗心?光凭脑子,是记不住的,必然容易犯错。我认为,写
2021-08-29 13:02:56
3641
原创 git使用
目录原理分支本地仓库撤销撤销add撤销commit撤销push关于HEAD删除对比修改message其他常用操作原理对于一个使用5年svn的人来说,突然使用git,确实不太习惯,而且他们的设计方式上有很大的不同。他们最大的不同有2点:svn没有分支svn没有本地仓库分支在svn中,没有分支,都是保存一个一个文件,这些文件是平行存放的。而在git中,你进入一个仓库,要切换到你需要的分支中。那么这些文件的存储也比svn要复杂,据我观察,大概是只存储不同分支代码的不同部分。git branc
2021-08-29 11:25:18
255
原创 一个简单的socket编程demo
记录这个demo,相当于是保留一份代码片段,以后可以随时拿来用,验证新的想法。人的大脑是很靠谱的,经常记错东西,需要保留一个索引,放在这里。服务端#include &amp;lt;sys/socket.h&amp;gt;#include &amp;lt;netinet/in.h&amp;gt;#include &amp;lt;arpa/inet.h&amp;gt;#include &a
2018-12-16 16:44:03
1333
原创 mysql使用笔记
常用界面工具有时候为了方面,可以使用界面工具查看修改mysql,推荐两个工具:Navicat 需要破解HeidiSQL 开源免费shell操作远程登录mysql -u username -p123456 -h 192.168.97.200 -P 3300 -D dbname ## 注意 -p后面无空格,紧跟密码 查看数据库和表show databases...
2018-12-16 16:24:10
544
原创 pragma pack和内存对齐
内存对齐内存对齐和CPU有关系,可以认为内存对齐的大小就是CPU一次读取内存的大小,例如32CPU一次读取4字节,那么内存的对齐方式就4字节,64位就是8字节。本质上是保证CPU使用尽量少的次数将某一个变量取出来。pragma pack(n)的作用上面说了,编译默认对齐方式是4字节(32位系统)或者8字节(64)位系统,但是通过pragma pack可以自己定义内存的对齐方式。#pragm...
2018-12-16 15:47:53
479
原创 定时任务管理工具crontab
文章目录croncrontab定时执行命令定时执行脚本注意定时的语法格式1:每1分钟执行一次myCommand2:每小时的第3和第15分钟执行3:在上午8点到11点的第3和第15分钟执行4:每隔两天的上午8点到11点的第3和第15分钟执行5:每周一上午8点到11点的第3和第15分钟执行6:每晚的21:30重启smb7:每月1、10、22日的4 : 45重启smb8:每周六、周日的1 : 10重启s...
2018-12-16 13:47:56
1165
原创 实现golang中memset函数
C语言中的memset在C/C++中,有一个memset函数,常常用来清空一段内存。#include <string.h>// 将s的前n个字节用c填充void *memset(void *s, int c, size_t n);// 用法举例int arr[100];// 将数组内存全部置为0memset(&arr, 0, sizeof(arr));由于...
2018-12-16 12:11:11
4891
原创 shell脚本使用总结
文章目录指定解释器定义或者赋值变量使用变量特殊变量0、 单引号和双引号1、拼接2、获取字符串长度3、截取切片4、查找子串5、字符串替换逻辑判断字符串比较数字比较文件判断包含文件数组定义修改使用获取长度函数循环forwhileuntil后续指定解释器#!/bin/bash## 这行代码必须加入文件头定义或者赋值变量因为shell是一个脚本语言,只有赋值了,才能成为一个变量,不像其他静态...
2018-12-09 15:42:05
478
原创 gdb调试golang程序
gdb是linux系统自带的调试器,功能十分强大,对于C/C++程序员不会陌生,那么使用gdb如何调试golang程序呢?1、配置gdbgolang这门语言是2009年才出来,gdb并没有原生支持调试golang,这里需要配置gdb,使它支持golang,关于这里面的原理,我还不是很清楚,应该是gdb本身支持扩展,可以以提供插件的形式扩展支持其他语言,具体怎么样,我也不是很清楚,待后续研究。...
2018-12-09 11:26:28
2574
原创 内存查看工具之free
基本使用free是一个内存查看工具,使用起来非常简单:free -m ## 单位是M 也可以是-g -k[KentZhang@ALVPCFLKF-192-168-29-61 707]$ free -m total used free shared buffers cachedMem: 32186 ...
2018-12-03 23:32:11
1512
原创 系统监控之top
文章目录简介打印输出含义说明统计区第一行:TasksCpuMemSwap字段头任务区其他操作技巧只监控某个进程显示单个Cpu的统计信息改变排序方式显示完整的命令简介top可以用来实时显示linux系统的运行情况。打印输出top命令输出三个部分:统计区 主要由统计任务、CPU、内存、交换区的信息字段头 任务的字段头,标明字段的含义任务区 每一行打印一个任务信息## 统...
2018-12-02 23:49:23
472
原创 系统调用追踪之strace
strace 是一个常用的linux命令,应该是 trace system calls的简写形式,用来追踪一个程序的系统调用。1、启动并跟踪程序strace ./test.exe ## 结果打印在屏幕strace -o out.txt ./test.exe ## 结果输出在文件strace -f -o out.txt ./test.exe ## -f...
2018-11-29 00:19:37
834
原创 linux下常用时间函数
在linux下编程,有一些常用的时间函数,下面做一个总结梳理。1、timeSYNOPSIS #include <time.h> time_t time(time_t *t);DESCRIPTION time() returns the time since the Epoch (00:00:00 UTC, January 1, 197...
2018-11-28 00:32:45
402
原创 文本编辑工具之sed
sed是一个流文本编辑工具,全称是 stream editor,以下仅列举我常用的几个功能。批量替换比如某个函数名改了,那么其他文件中调用的函数全部都要修改,如果用手动修改,那是费时费力,此时需要借助sed.## 配合find 查找出所有 *.h文件,将文件中的g_pErrorLog改为LogError## 注意sed 后面的 -i 一定要加上,否则不会就修改文件find ./ -nam...
2018-11-23 23:15:26
212
原创 文本处理工具之awk
awk是一个文本处理工具,也是一中脚本语言。我常使用的就是下面的两个功能。基本格式:awk -F [str] ‘BEGIN{comand1}{commad2}END{command3}’ filename-F 后面的跟的是分割符号,可以是一个字符,也可以是字符串.中间的命令必须用单引号括起来BEGIN表示开始循环开始前执行的命令,执行一次END表示循环结束后执行的命令...
2018-11-23 23:09:40
446
原创 STL中map的使用详解
map的本质map本质上一个平衡二叉树(更准确地说是红黑树),那么每个节点存放一个数据,默认是key和value打包成一个数据pair,以pair的形式存放在节点的,由此来看,pair里面可以放任何数据,前提是pair必须可以比较大小,当然也可以自定义比较函数,而map的第三个参数就是指定自定义key的比较函数的。map的定义//map的定义//第一 第二 是key和value的类型//...
2018-11-14 18:34:04
1064
原创 tcpdump简明实用教程
文章目录网络包的五元组包输入包过滤1、IP过滤2、端口过滤3、IP和端口组合过滤与或非4、协议过滤包输出1、保存包到文件2、指定包的数量3、显示IP和端口号4、显示时间戳5、以ASCII码打印6、以ASCII和二进制同时打印谈谈如何记忆参数的使用网络包的五元组在网络中,一个五元组确定一种网络包,五元组包括:协议,tcp或者udp等等源IP目的IP源端口目的端口那么tcpdump...
2018-11-10 12:03:53
1796
原创 goroutine原理分析
文章目录进程和线程进程-——拥有资源的人线程——真正干活的人多线程和多协程多线程——多个人干多件事案例插曲多协程——一个人干多件事本质goroutine的原理GM模型GPM模型关于goroutine底层的线程的数量测试程序一测试程序二测试程序三结论进程和线程在讲解goroutine之前,先来熟悉一下进程和线程的概念,因为只有通过概念之前对比,才能更加理解这些概念。进程-——拥有资源的人计算...
2018-11-10 09:40:02
2226
原创 IP地址转换总结
一、IP地址结构体相关定义本文只讨论IPv4的情况,IPv6的相关转换,在项目中我也使用过,基本类似。struct sockaddr_in { sa_family_t sin_family; /* address family: AF_INET */ in_port_t sin_port; /* port in network byte order
2017-03-08 22:33:56
610
原创 gdb调试命令总结
之前已经写过一篇博客《Linux下使用gdb调试C/C++程序》,是一些简单的用法,今天的这一篇可以算是进阶篇。一、关于多线程的使用命令 1、thread 查看当前线程的ID,这ID是GDB对线程的编号,从1开始的。以下所说的线程ID,都是这种ID。 2、info thread 查看当前可以被调试的线程,ID前面有*号的表示GDB当前所在的线程。 3、thread thread_number GDB切换到线程
2016-06-09 18:56:33
854
原创 find、grep、wc使用方法简单总结
简单总结一下,几个常用的linux命令。 一、find 用来查找特定文件,在linux下一切皆是文件,因此十分有用。 基本格式:find path expression [-exec command {} \;] 会默认遍历到子目录。1、find /home/work/ -name "*.cpp" ...
2016-06-09 09:54:43
10550
原创 select 和 epoll 的区别总结
在Linux中,select 和epoll函数,都是为了监控大量的描述符,是一种I/O多路复用技术。下面总结它们的区别:select 与 epoll区别1、打开的最大描述符数量限制 select 文件描述符使用的是linux ext3,因此打开数量受限制,一般默认为1024 epoll自己实现了一个虚拟文件系统,因此打开的描述符数就和机器内存有关,这个数值会很大2、
2016-01-19 21:15:21
1049
原创 谈谈TCP三次握手
TCP协议是一个面向连接的,可靠的传输协议,两台计算机进行网络通信之前,需要进行TCP连接,其中连接发起方发包2次,连接接收方发包1次,这就是著名的TCP三次握手。一、TCP首部 上层的数据传到TCP层,会用TCP首部封装数据,TCP首部至少20字节,有关TCP首部的字段组成及其含义,网络上很多说明,本文不详述,请参见有关TCP首部的文章 http://blog.chinau
2016-01-09 17:27:34
961
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人