自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 别再错误的使用分布式锁了

分布式锁1. Zookeeper 实现分布式锁zookeeper 主要解决分布式数据的一致性问题1.1 zookeeper 节点类型临时节点程序执行完或者程序出现异常或者会话结束了,临时节点就会消失临时有序节点临时节点有序的排列持久节点不论是程序执行完或者程序出现异常或者会话结束了,节点都不会消失持久有序节点持久且有序的节点1.2 zookeeper 的事务监听 watch主要监听:节点创建节点删除节点数据修改子节点变更1.3 错误的分布式

2021-08-02 10:10:54 249

原创 CAP BASE ACID

CAP定理: 也称布鲁尔定律。他指出一个在集群上运行的分布式数据库系统,只能提供以下三个属性中的两个。如果不是分布式的情况就可以同时满足CAP三个属性一致性(Consistency)从任何节点的读操作应得到相同的结果可行性(Availability)任何一个读/写请求总能得到成功或是失败的相应(意思是只要收到用户的请求,服务器就必须给出回应)分区容忍(Partition tolerance)数据库系统可以容忍通信中断(可以允许出现线路故障,即集群中的某一台坏了,系统仍可用)

2021-06-13 16:04:48 247 1

原创 理解什么是设计模式,设计模式的原则

什么是设计模式每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动。如何解决复杂性分解人们面对复杂性有一个常见的做法:即分而治之,将大问题分解为多个小问题,将复杂问题分解为多个简单问题。抽象更高层次来讲,人们处理复杂性有一个通用的技术,及抽象。由于不能掌握全部的复杂对象,我们选择忽略它的非本质细节,而去泛化和理想化了的对象模型。重新认识面向对象理解隔离变化从宏观层面来看,面向对象的构建方式更能适

2021-06-06 15:43:02 192

原创 Go | Slice 及扩容规则

slice有三部分第一部分:data(元素存哪里)第二部分:len(存了多少元素)第三部分:cap(可以存多少元素)第一部分:data底层是一个连续内存的数组data就是这个底层数组的起始地址(如果没有make分配内存,此时data=nil)在len范围内,即已经存储的元素是可以安全读写的,但是超过这个范围,就是越界访问,会产生panicslice公用底层数组此时slice访问和修改的都是底层的元素如果此时再给s2添加元素,就会重新开辟一个新数组,原来的元素拷贝过来,并添加新元素

2021-05-23 11:42:50 568 2

原创 Go | string与UTF8编码

字符表示使用字符编号对照表,即收录很多字符,然后给他们一一编号。字符集促进了字符与二进制的合作ASCII字符集(1967年)只收录了128个字符,扩展字符集也就只有256个英文字符、阿拉伯数字、西文符、控制字符GB2312(1980年)添加了简体中文、拉丁字母、日文假名BIG5(1984年) 添加了繁体字,但是依旧有很多字符没有被收录GB13000.1(1993年) 添加了中日韩GBK(1995年) 不支持韩文GB18030(2000) 更多兼容与其不断退出更多字符的字符集,莫不如本着全

2021-05-15 16:55:46 1490

原创 Go | 类型元数据及类型断言

类型元数据runtime._type 类型元数据类型名称、类型大小、对齐边界、是否自定义等,是每个类型元数据都要记录的信息,所以被放到了runtime._type结构体中,作为每个类型元素的Heade在_type之后存储的是各种类型额外需要描述的信息,例如slice的类型元数据在_type结构体后面,记录着一个*_type指向其存储的元素的类型元数据,如果是string类型的slice,这个指针就指向string类型的元数据。如果是自定义类型,后面还会有一个uncommontype结构体

2021-05-09 11:46:37 1823 2

原创 Go | 结构体及内存对齐

CPU 要想从内存读取数据,需要通过地址总线,把地址传输给内存,内存准备好数据,输出到数据总线,交给CPU。如果地址总线只有8根[0,255],那这个地址就只有8位,可以表示256个地址,因为表示不了更多的地址,就用不到更大的内存,所以256byte就是8根地址总线最大的寻址空间,要使用更大的空间,就要有更宽的地址总线。例如:32位地址总线[0,2^32-1],就可以寻址4G内存了每次操作1字节太慢,那就加宽数据总线,要想每次操作4字节,就要有至少32位数据总线,8字节就要64位数据总线。这里每

2021-05-03 11:58:19 446

原创 Go | container/list标准库

概述container/list包实现了基本的双向链表功能,包括元素的插入、删除、移动功能

2021-04-25 14:42:24 744

原创 梳理 | 数据结构

基本概念线性表是一种逻辑结构,相同数据类型的n个数据元素的有限序列,除第一个元素外,每个元素有且仅有一个直接前驱,除最后一个元素外,每个元素有且仅有一个直接后继。线性表具有以下特点:元素个数有限逻辑上元素有先后次序数据类型相同仅讨论元素间的逻辑关系数组和链表–数组链表优点随机访问性强;查找速度快插入删除速度快;内存利用率高,不会浪费内存;大小没有固定,扩展和灵活缺点插入和删除效率低;可能浪费内存;内存空间要求高,必须有足够的连续内存空间;数组大小固定,

2021-04-11 14:37:36 206

原创 MySQL索引个人总结

1. 索引索引一般以文件形式存在磁盘中(也可以存于内存中),存储的索引的原理大致概括为以空间换时间,数据库在未添加索引的时候进行查询默认的是进行全量搜索,也就是进行全局扫描,有多少条数据就要进行多少次查询,然后找到相匹配的数据就把他放到结果集中,直到全表扫描完。而建立索引之后,会将建立索引的KEY值放在一个n叉树上(BTree)。因为B树的特点就是适合在磁盘等直接存储设备上组织动态查找表,每次以索引进行条件查询时,会去树上根据key值直接进行搜索。2. 索引的优点建立索引的列可以保证行的唯一性,生成

2021-04-04 11:54:41 262

原创 Docker | 基于Centos镜像的GoWeb部署

Dockerfile生成基础镜像FROM centos:7RUN yum -y update \ && yum -y install vim \ && yum -y install git \ && yum install -y gcc-c++ \ && yum -y install wget \ && wget -P /root/ https://dl.google.com/go/g

2021-03-28 14:54:19 561 2

原创 内存管理(分段、分页)

1. 虚拟内存#mermaid-svg-Vd4Whx00iDyA44cf .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-Vd4Whx00iDyA44cf .label text{fill:#333}#mermaid-svg-Vd4Whx00iDyA44cf .node rect,#mermaid-svg-Vd

2021-03-19 21:35:04 830

原创 讲解panice与recover

待更新

2021-03-14 14:56:00 412

原创 Nginx配置中指令root和alias的区别浅析

root和alias都可以定义在location模块中,都是用来指定请求资源的真实路径1. rootlocation /index/ { root /project/data;}请求 http://linbolun.cn/index/a.png 这个地址时,那么在服务器里面对应的真正的资源是 /project/data/index/a.png文件2. alias而 alias 正如其名,alias指定的路径是location的别名,不管location的值怎么写,资源的真实路径都是 ali

2021-03-08 17:48:00 172

原创 Go值类型和引用类型——内存分配规则

Go分配内存规则全局变量引用类型的分配在堆上,值类型的分配在栈上。局部变量一般分配在栈上。如果局部变量太大,则分配在堆上。如果函数执行完,仍然有外部引用此局部变量,则分配在堆上。什么是逃逸把本该分配在栈上的变量分配到了堆,则发生了逃逸。案例var global *intfunc fn() { var x int x = 1 global = &x}func fn2() { y := new(int) *y = 1}函数里

2021-02-21 12:02:52 533 2

原创 Redis详讲(快速上手)

1. 前言1.1 NoSQL:一类新出现的数据库(not only sql)泛指非关系型的数据库不支持SQL语法存储结构跟传统关系型数据库中的那种关系表完全不同,nosql中存储的数据都是KV形式NoSQL的世界中没有一种通用的语言,每种nosql数据库都有自己的api和语法,以及擅长的业务场景NoSQL中的产品种类很多:RedisMongodbHbase hadoopCassandra hadoop1.2 Redis简介Redis是 NoSQL技术的一员,它通过多种键值数

2021-02-16 14:56:21 228 1

原创 golong设计模式:简单工厂模式

go 语言没有构造函数一说,所以一般会定义NewXXX函数来初始化相关类。NewXXX 函数返回接口时就是简单工厂模式,也就是说Golang的一般推荐做法就是简单工厂。在这个simplefactory包中只有API 接口和NewAPI函数为包外可见,封装了实现细节。simple.go代码package simplefactoryimport "fmt"//API is interfacetype API interface { Say(name string) string}

2021-02-07 16:19:39 212

原创 Casbin 快速了入门

1. PERM原模型定义一个策略,定义一个匹配规则,通过请求参数与策略通过规则进行匹配,获得一个eft影响,拿到影响的结果,进到影响的表达式,返回一个布尔值。1.1 基本参数subject(sub访问实体)object(obj访问的资源)action(act访问方法)eft(策略结果,一般为空,默认指定allow,还可以定义为deny,是硬编码写死,只能是这两个值)1.2 模型介绍Policy 策略 p={sub,obj,act,eft}策略一般存放在数据库,因为会有很多

2021-01-31 20:59:33 633

原创 Goland使用validator进行结构体参数校验

validator是Goland里常用的表单校验工具。表单校验的作用就是对输入的数据进行合法判断,如果不合法,那没就会输出错误。1. go web应用中,我们使用 struct tag 来定义表单合法的值在web开发中一个不可避免的环节就是对请求参数进行校验,通常我们会定义一个DTO(数据模型)结构体来接收请求的参数。借助波形绑定跨界的解析请求中的参数。gin框架中集成了github.com/go-playground/validator进行参数校验,我们只需要在定义结构体是使用bindingtag标

2021-01-26 09:48:26 1154

原创 docker 命令

Docker 常见命令docker ps : 列出容器docker ps [OPTIONS]-a :显示所有的容器,包括未运行的。-f :根据条件过滤显示的内容。–format :指定返回值的模板文件。-l :显示最近创建的容器。-n :列出最近创建的n个容器。–no-trunc :不截断输出。-q :静默模式,只显示容器编号。-s :显示总的文件大小。输出详情介绍:CONTAINER ID: 容器 ID。IMAGE: 使用的镜像。COMMAN

2021-01-24 21:50:55 128

原创 JWT常用的几种应用场景

正常的JWT是不涉及服务端存储的,完全靠算法校验token是否有效当然想要实现某些进阶的控制或校验,就需要搭配一些其他的技术栈实现比如用户退出登录,要作废某个token,像这样的场景就需要在服务端保存一个token的黑名单把作废的token保存到黑名单里,后续每一次请求进来,先去黑名单里找一下,如果在黑名单里就拒绝此次请求。至于保存的黑名单是使用redis还是其他的存储都是可以的实现异地登录退出就是要结合请求的IP或设备识别号一起生成token,然后保存userid 和 token..

2021-01-17 08:17:13 1230 1

原创 Python | 中国天气网+数据分析

一、数据获取数据连接http://www.tianqihoubao.com/lishi/获取某个城市2011年至今每天的数据import requestsfrom lxml import etreeimport pandas as pdimport osimport reclass Weather: def __init__(self, city): self.city = city self.host_url = "http://www.t

2021-01-03 15:59:34 1117 4

原创 汉英平行语料标注与分析Python

为什么要对汉英平行语料进行标注现有大量的中英文语料需要切分成子句,人工切分费时费力。想通过机器学习,训练出一个模型来自动切分中英文语料。解决方法:1、中英语料分开,分别处理。中英语料测试数据:数据是手动切分的,用来训练模型例如在塞内加尔, |* 人口基金和人口和发展议员网络结成了战略性的伙伴关系。He reported that after robust debate, |* the group had agreed on a number of amendments to the draft

2020-12-27 17:16:34 880

原创 CentOS 7安装Docker并配置Docker镜像加速

一、CentOS 7安装Docker1. 检查并清除系统残余项,并安装docker依赖环境。sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ dock

2020-12-08 18:36:55 254

原创 初识Docker(通俗易懂)

初始Docker镜像(Image)相当于一个文件系统可类比虚拟机的系统镜像文件.iso容器(Container)镜像和容器的关系,就好像面向对象程序设计中的类与对象,镜像是静态的定义,同期是镜像运行时的实体。容器可以被创建、启动、停止、暂停、删除等可以类比为一个正在运行的虚拟机仓库(Repository)仓库可以看成一个代码控制中心,用来保存镜像。(有很多的第三方镜像,nginx、mysql…)Dookerfile配置文件,通过写“如何创建”的步骤,用来指定一个镜像是如何构建的ta

2020-12-06 16:50:59 504 1

原创 golang使用bcrypt包密码加密和解密

bcrypt介绍bcrypt是单向Hash加密算法,不可反向破解生成明文。bcrypt是一种加盐的加密方法,MD5加密时候,同一个密码经过hash的时候生成的是同一个hash值,在大数据的情况下,有些经过md5加密的方法将会被破解。使用bcrypt进行加密,同一个密码每次生成的hash值都是不相同的。每次加密的时候首先会生成一个随机数就是盐,之后将这个随机数与密码进行hash。package mainimport ( "fmt" "golang.org/x/crypto/bcry

2020-11-22 16:27:40 4741 3

原创 go语言中select实现优先级

已知,当select 存在多个 case时会随机选择一个满足条件的case执行。现在我们有一个需求:我们有一个函数会持续不间断地从ch1和ch2中分别接收任务1和任务2,如何确保当ch1和ch2同时达到就绪状态时,优先执行任务1,在没有任务1的时候再去执行任务2呢?func worker2(ch1, ch2 <-chan int, stopCh chan struct{}) { for { select { case <-stopCh: return case job1 :

2020-11-15 16:03:37 485 1

原创 golang延迟调用(defer)

defer特性关键字 defer 用于注册延迟调用。这些调用直到 return 前才被执。因此,可以用来做资源清理。多个defer语句,按先进后出的方式执行。defer语句中的变量,在defer声明时就决定了。defer用途关闭文件句柄锁资源释放数据库连接释放defer的触发包裹defer的函数返回时包裹defer的函数执行到末行时所在的goroutine发生panic时当一个方法中有多个defer时,defer会将延迟的方法“压栈”,当defer被触发时再将所

2020-11-08 16:55:51 290

原创 多线程爬取GitHub指定项目的所有close、merge、open

直接上代码class GitHub: def __init__(self): self.host = "https://github.com" self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"} self.url_que

2020-11-01 17:59:50 360 1

原创 Token登录验证(附图)

什么是Tokentoken是由服务器生成的一串加密后的字符串,用来作为客户端进行请求的一个标识。用户第一次成功登录后,服务器会针对这个用户生成一个token,用来标识这个用用户,并将生成的token返回给客户端,以后客户端只需要带着token来访问即可,不需要使用账号和密码来。通过JWT生成TokenJWT(JSON Web Token)是一种跨域认证解决方案,它规定了一种Token的实现方式。目前多用于前后端分离项目和OAuth2.0业务场景下。JWT是基于Token的轻量级认证模式,服务端认

2020-10-24 19:52:30 2963

原创 Go-webSocket实现广播

WebSocket 协议本质上是一个基于 TCP 的协议。为了建立一个 WebSocket 连接,客户端浏览器首先要向服务器发起一个 HTTP 请求,这个请求和通常的 HTTP 请求不同,包含了一些附加头信息,其中附加头信息"Upgrade: WebSocket"表明这是一个申请协议升级的 HTTP 请求,服务器端解析这些附加的头信息然后产生应答信息返回给客户端,客户端和服务器端的 WebSocket 连接就建立起来了,双方就可以通过这个连接通道自由的传递信息,并且这个连接会持续存在直到客户端或者服务器端

2020-10-11 15:33:24 1794

原创 Go 生成excel文件

titileList传入是标题dataList是每一行的数据func DataToExcel(titleList []string, dataList []interface{}) { // 生成一个新的文件 file := xlsx.NewFile() // 添加sheet页 sheet, _ := file.AddSheet("Sheet1") // 插入表头 titleRow := sheet.AddRow() for _, v := range titleList { cell

2020-09-27 12:02:18 1329 1

原创 text/template与html/template的区别

text/template 是将内容都已text文本格式返回。html/tempalte针对的是需要返回HTML内容的场景。在模板渲染过程中会对一些有风险的内容进行转义,以此来防范跨站脚本攻击。<!DOCTYPE html><html lang="zh-CN"><head> <title>Demo</title></head><body> {{.}}</body></htm

2020-08-30 10:02:38 1352

转载 编译型语言和解释型语言

编译型语言和解释型语言打个比方,假如你打算阅读一本外文书,而你不知道这门外语,那么你可以找一名翻译,给他足够的时间让他从头到尾把整本书翻译好,然后把书的母语版交给你阅读。或者你也可以立刻让这名翻译辅助你阅读,让他一句一句地给你翻译,如果你像往回看某个章节,他也得给你重新翻译。这两种翻译的方式,前者就相当于编译型语言,后者就相当于解释型语言。编译型语言编译型语言和汇编语言一样,有一个负责翻译的程序来对我们编写的源代码进行转换,生成相对应的可执行代码。这个过程说得专业一点,就称为编译(Compile),而

2020-08-09 14:56:26 135

原创 CentOS 7 修改ip、MAC、UUID

对于复制的虚拟机,在开机时,VMware自动为其分配了不同的Mac地址以及IP地址(ip是动态随机分配的)UUID(Universally Unique Identifier)是系统层面的全局唯一标识符号,Mac地址以及IP地址是网络层面的标识号两台不同的Linux系统拥有相同的UUID并不影响系统的使用以及系统之间的通信1. 设置静态ip1.1 找到配置文件ifcfg-ens33注:文静名可能有所不同 ,但格式都是 ifcfg-ensxxxcd /etc/sysconfig/netwo.

2020-07-20 11:14:20 1898 1

原创 IDE连MySQL:Server returns invalid timezone. Go to ‘Advanced‘ tab and set ‘serverTimezone‘ property

报错页面出现该问题的原因是MySQL驱动jar中的默认时区是UTC。UTC代表的是全球标准时间 ,但是我们使用的时间是北京时区也就是东八区,领先UTC八个小时。因为时区不一致,服务器返回了无效的时区。临时解决方法1. 去Advanced中找到serverTimezone,更改为Asia/Shanghai2. 点击apply,重新Test Connection注意 :下次链接需要再次修改serverTimezone,所以为临时修改设置MySQL的时区1. 进入命令窗口(Win + R)

2020-07-11 14:58:45 499

原创 Jinja2基本总结

模版讲解:{{ … }}:装载一个变量,模板渲染的时候,会使用传进来的同名参数这个变量代表的值替换掉。{% … %}:装载一个控制语句。{# … #}:装载一个注释,模板渲染的时候会忽视这中间的值。三:变量1)在模板中添加变量,可以使用(set)语句。{% set name='xx' %}之后就可以在页面文件中使用name这个变量了。在解释性语言中,变量的类型时运行时确定的,因此,这里的变量可以赋任何类型的值。上面的语句创建的是全局变量,从定义之后的文件部分中都可以访问 。2)局部变量

2020-07-05 14:23:57 1166

原创 MVC与Django的MVT简单介绍

MVC框架简介M:Modle 模型,和数据库进行交互。V:View 视图,产生html页面C:Controller 控制器,接受浏览器请求,进行处理,与 M 和 V 进行交互,返回应答。MVTpython MVC快速开发 和 DRY 原则。不要自己去重复一些工作M:Model 模型,和 MVC 中 M 功能下沟通,和数据库进行交互。V:View 视图,和 MVC 中 C 功能相同,接受请求,进行处理,与 M 和 T 进行交互,返回应答。T:Template 模板,和 MVC 中

2020-06-28 13:48:08 137

原创 CentOS的基本配置 与 shell的基本语法

设置ip和Mac地址每台虚拟机更改mac地址:vim /etc/udev/rules.d/70-persistent-net.rules每台虚拟机更改IP地址:vim /etc/sysconfig/network-scripts/ifcfg-eth0程序重启service network restart每台虚拟机修改对应主机名vi /ect/sysconfig/networkHOSTNAME=node01每台虚拟机设置ip和域瓴映射vim /etc/hosts4:虚拟机关团

2020-06-21 11:35:28 335

原创 解决django 3.0.2与mysql兼容性问题

Django 在使用mysql时报错时django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is可在__init__文件添加这几行代码import pymysqlpymysql.version_info = (1, 3, 13, "final", 0)pymysql.install_as_MySQLdb()

2020-06-04 21:45:55 388

空空如也

空空如也

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

TA关注的人

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