自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 技术人员做数据质量治理实践总结

1 导语本人是腾讯游戏市场平台部的一名开发人员,目前主要负责O2广告投放系统的开发以及数据质量治理工作。O2是市场平台部用于做游戏广告投放以及相关效果数据回收展示的系统。该系统不仅在功能上支持广告的高效精准投放,也同时是一个较为庞大的数据系统,每天O2都会有大量的数据流入、计算、以及可视化。当一个数据系统越来越复杂,参与方越来越多,其需要管理的数据量越来越庞大时,数据治理尤其是针对数据质量的治理就变得越来越重要且紧迫了。本篇文章主要是对我过去一段时间针对O2所做的数据质量治理工作做一总结与分享,希望能

2021-01-13 19:07:42 1120

原创 Go语言内存泄漏问题排查总结

背景我们使用Go语言开发了一个后台服务,在发布测试环境后,发现内存使用量会随着时间的推移持续增加。因此服务的Pod会隔一段时间重启一次,因此,需要排查一下该问题。此文是对排查过程的记录以及排查后的思考总结。环境准备本文假设开发机环境中已经安装了go、pprof、graphviz,并且后台服务中已经集成了pprof。业务中内存泄漏的现象以及排查思路内存泄漏的现象我们将服务发布到测试环境中之后,可以从内存监控的看板中看到,内存使用量随着时间的推移会一直增加,而且会一直达到内存设置的限制并且重启Po

2021-06-27 14:33:10 2822 1

原创 业务中使用缓存的实践总结(一)

背景之前我在团队中一直负责的是数据开发的相关工作。因此,对于后台系统开发并没有很多工作实践。不过近期我也着手做了一些后台开发的相关工作,在实践过程中使用到了缓存,在实践一段时间后,在此文中对我使用缓存的实践做一总结。实际上,我们的业务场景非常简单,没有很高的并发以及时延要求。因此,在设计缓存时,我们也没有把问题复杂化,方案设计的很简单。不过也并不影响我们进一步的思考缓存的使用。本文主要总结的是在工作实践这一场景下更多的联想思考,包括为什么要使用缓存、我们的缓存方案选择以及使用缓存中可能要注意的问题。一篇

2021-06-20 13:06:59 707

原创 使用Prometheus和Grafana做服务指标监控可视化(实践篇)

文章目录1 背景2 安装及启动Prometheus3 安装及使用Grafana3.1 安装Grafana3.2 使用Grafana3.3 查看Prometheus的性能数据来进行Grafana测试4 使用Prometheus和Grafana做服务器监控可视化4.1 官方Exporter使用4.1.1 服务器指标监控4.1.1.1 Exporter运行4.1.1.2 Exporter指标采集4.1.1.3 配置Grafana面板从而可视化指标4.1.2 MySQL指标监控4.2 使用go-kit实现自己的Ex

2021-03-09 16:46:53 2246

原创 Go语言中sort.Search()的使用方法(数组中通过值来取索引)

方法名sort.Search()使用模板index := sort.Search(n int,f func(i int) bool) int主要功能该函数使用二分查找的方法,会从[0, n)中取出一个值index,index为[0, n)中最小的使函数f(index)为True的值,并且f(index+1)也为True。如果无法找到该index值,则该方法为返回n。常用场景该方法一般用于从一个已经排序的数组中找到某个值所对应的索引。或者从字符串数组中,找到满足某个条件的最小索引值,比如et

2020-11-14 13:04:05 10581

原创 etcd后端存储源码解析——底层读写操作

背景最近想找一些用Go语言实现的优秀开源项目学习一下,etcd作为一个被广泛应用的高可用、强一致性服务发现存储仓库,非常值得分析学习。本篇文章主要是对etcd的后台存储源码做一解析,希望可以从中学到一些东西。etcd大版本区别目前etcd常用的是v2和v3两个大版本。两个版本不同之处主要在于:v2版本仅在内存中对数据进行了存储,没有做持久化存储。而v3版本做了持久化存储,且还使用了缓存机制加快查询速度。v2版本和v3版本对外提供的接口做了一些改变。在命令行界面中,可以使用环境变量ETCDCTL

2020-11-08 10:29:09 869

原创 etcd的安装与命令行使用

背景etcd是CoreOS团队于2013年6月发起的一个开源项目,它是一个优秀的高可用分布式键值对存储数据库。etcd内部采用了Raft协议作为一致性算法,且使用Go实现。这篇文章主要记录etcd在Linux上的单机版安装与简单的命令行使用。主要是供初学者参考。etcd的安装etcd的github路径地址为:https://github.com/etcd-io/etcd我们可以直接从github中将安装压缩包下载到测试机上,使用命令wget https://github.com/coreos/e

2020-10-17 12:11:48 2364 1

原创 Kafka的基本知识梳理

1 背景近期在学习《深入理解Kafka核心设计与实践原理》这本书。接下来希望将每次学习的收获与心得记录成文,也希望可以帮助到同样初入门的人。2 思维导图先分享一下我在学习Kafka的基本知识之后整理的思维导图。3 Kakfa介绍3.1 三大角色Kafka主要用于扮演三种角色,消息系统、存储系统、流式处理平台。3.1.1 消息系统Kafka被用于最多的是消息系统,Kafka和传统的消息系统都具备了系统解耦、冗余存储、流量削峰、缓冲、异步通信、扩展性、可恢复性等功能。同时,Kafka还提供了大

2020-09-22 08:42:19 330

原创 在生产环境中修改MySQL库表结构

背景如果我们需要在生产环境中修改MySQL数据库中某个库表的结构。那么,需要考虑哪些要点,才能确保不会出问题呢?碰到的问题这里先描述一下我在生产环境MySQL数据库中修改库表结构时遇到的问题。在开发过程中,我发现MySQL中某个库表需要添加一个字段,比如库表:...

2020-09-19 17:55:48 1855

原创 Warning: (1265, u"Data truncated for column 'XXX' at row 1")问题解决

背景在使用MySQL数据库时,有时会遇到Warning: (1265, u"Data truncated for column ‘XXX’ at row 1")这样的报错信息。具体可以考虑哪些问题呢?这里简单记录一下问题原因与解决方法。报错原因写入该字段的数据长度大于该字段定义的最大长度,比如定义了字段user_name VARCHAR(10),这个字段定义了最长写入10位字符,但是,如...

2020-04-17 19:59:20 25681

原创 MySQL中常用于检索的字符串字段如何创建索引?

背景我们在业务场景中经常会碰到通过某个字符串查询对应记录的情况。比如常见的邮箱登录、或是手机号登录。如果不给它创建索引,则MySQL就会进行全局扫描,非常耗时。那么,类似邮箱地址这样的字符串,我们应该如何给它创建索引呢?这里简单介绍几种方法。几种方法比如我们有一张表user_info,存储了自增主键ID、邮箱地址、对应密码。这里我们经常会用到的SQL操作是select email, pa...

2020-04-10 09:43:49 2518

原创 MySQL中查询表的总行数该用什么命令?

背景我们经常会使用到一个SQL语句,就是查询某张表的总行数。常常使用的查询命令有几种,比如:select count(*) from t,select count(id) from t(id为主键),select count(1) from t,select count(某普通字段) from t以及show table status的rows字段。然而却不知道用哪种查询方式最合适。接下来简单介...

2020-03-20 09:25:37 11688

原创 在Mysql中执行一条SQL,会经历什么?

背景我们都经常使用Mysql作为数据库来存储与查询较常用的数据。当我们输入一行如SELECT * FROM table_name WHERE id=26这样的语句之后,Mysql如果正确执行的情况下,会输出你想要的信息。那么,在你输入这行语句之后,一直到它显示出你想要的信息,这中间Mysql都经历了什么呢?这篇文章会简单聊一下这个事情。Mysql基本架构图我们先看下Mysql的一个较整体的...

2020-03-16 09:56:09 1252

原创 mysql报错:2003, "Can't connect to MySQL server on ' ' [Errno 99] Cannot assign requested address 解决方法

背景使用Python脚本高并发的连接Mysql数据库时遇到了此报错。但是场景不仅限于Python,其它程序在高并发连接Mysql数据库时也可能会遇到此问题。原因定位出现该报错信息是因为在高并发连接Mysql数据库时,由于同时连接Mysql数据库的链接过多,且每次连接都是非常短的时间,导致有许多的TIME_WAIT,以致用光了服务器端口,所以新的连接就没有端口可用,导致了该报错产生。我们可...

2019-12-11 21:37:26 3596

原创 VSCode远程连接开发机.md

背景VSCode可以使用插件远程连接开发机来进行文件的编辑,这样就不用再登录到服务器上进行命令行操作修改文件了,可以提高在服务器上编写文件的效率。过程远程主机安装ssh-server如果已经安装了可以忽略,没安装的可以在网上找教程安装本地主机安装ssh-client一般都自带,没有的可以在网上找教程安装安装VSCode:https://code.visualstudio.com/...

2019-10-29 11:22:04 2479

原创 Druid安装(单机环境)

背景本篇文章将简单介绍Druid在单机上的安装与安装过程中可能会遇到的问题。主要目的是供初次接触Druid的同学了解Druid所用。准备工作软件Java8(8u92+)Linux或其他类Unix系统硬件4CPU/16GB RAM及以上下载Druid将Apache Druid 0.16.0-incubating下载到机器中。这里我们下载apache-druid-0.16.0...

2019-10-27 16:11:32 1450

翻译 Apache Druid设计——Segment

Apache Druid在segment文件中存储数据指标,segment文件用时间参数划分分区。在基础设置中,会为每一个时间间隔创建一个segment文件,该时间间隔可以在granularitySpec的segmentGranularity参数中配置。为了让Druid在繁重的查询压力下保持良好的操作性能,应该让segment文件的大小在300mb至700mb之间。如果segment的文件大小超出...

2019-10-26 20:51:19 1887

翻译 Apache Druid介绍

什么是Apache Druid?Apache Druid是一个专为大数据集的快速切片分析(OLAP查询)而设计的实时分析数据库。Druid作为数据库,最常用于支持以下用例:实时摄取、快速查询和高运行时长。例如,Druid一般用于支持分析型应用程序的GUI,或是需要快速聚合的高并发API后台。Druid最适合用于面向事件的数据。Druid常见的应用领域包括:点击流分析(Web和移动分析)网...

2019-10-23 11:08:12 4384

原创 Golang的值接收者与指针接收者

背景Go语言中有着面向对象的思想,当我们创建了一个类型之后,可以给这个类型添加不同的方法,给类型添加方法的方式类似于创建一个函数,只是在func和函数名中添加一个(类型名 类型)。这个东西就是所谓的接收者,也就是类型作为接收者接收该函数为自己的方法。有时候我们希望可以更改类型中成员变量的值,而有时候我们不希望类型中成员变量的值被改变。这就是Golang中使用值接收者与指针接收者的区别。一个例子...

2019-05-23 08:32:45 810

原创 数据结构之堆

什么是堆堆是一种特殊的树,需要满足两点要求:是完全二叉树每个节点都大于等于(或小于等于)其左右子节点注:每个节点都大于等于其左右子节点的叫做大顶堆,每个节点都小于等于其左右子节点的叫做小顶堆。堆的操作往堆中插入一个元素实现:插入堆的末尾后进行从下往上的堆化删除堆顶元素实现:删除堆顶元素后,将末尾元素放至堆顶,然后进行从上往下的堆化基于堆实现排序建堆建立堆时间复杂度...

2018-11-28 09:37:28 165

原创 数据结构之红黑树

红黑树的由来红黑树的引入是用来解决二叉查找树在频繁的插入、删除操作的情况下,可能会出现的性能快速退化的问题。二叉查找树最坏的情况下可能退化为链表,成为O(n)O(n)O(n)的时间复杂度。用来解决这种问题的二叉查找树叫做平衡二叉查找树,平衡二叉查找树可以保持二叉查找树的高度尽可能的小,以此来使二叉查找树的操作时间复杂度稳定在O(logn)O(logn)O(logn)。接下来看一下平衡二叉查找...

2018-11-21 14:53:52 228

原创 数据结构之二叉树基础

树是什么计算机中的树是一种数据结构,它是由n个有限节点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根在上而叶子在下。树的特点每个节点有零个或多个子节点没有父节点的节点称为根结点每一个非根节点有且只有一个父节点除了根结点外,每个子节点可以分为多个不相交的子树树的术语节点:树中的每一个元素父节点:生出该节点的节点,每一个节点只能有一个父节点...

2018-11-16 11:33:59 933

原创 算法之哈希算法

哈希算法定义将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法。哈希算法实现的要求从哈希出来的值不能反向推导出原始数据。也就是说,哈希算法是单向的。对原始数据十分敏感,输入数据改变一点,输出的数据就会大不相同。散列冲突的概率要非常小。哈希算法的执行效率要十分高。哈希算法的应用安全加密安全加密主要利用哈希算法单向的特点。我们可以对要存储的密码进行哈希...

2018-11-13 10:35:25 946

原创 算法之二分查找

概念二分查找针对的是一个有序的数据集合,查找思想有点类似分治思想,每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到想要查找的元素,或是区间被缩小为0。时间复杂度二分查找的时间复杂度为O(logn)O(logn)O(logn)lognlognlogn是一个非常恐怖的数量级,即使n非常大,对应的lognlognlogn也很小。比如n等于2的32次方,这个数很大,大约42...

2018-11-12 22:30:25 236

原创 算法之排序

排序算法是一种非常基础也非常重要的算法。要选择合适的排序算法为自己的程序做优化,那么就需要了解不同算法优劣的衡量依据。衡量排序算法的依据执行效率1.1 最好时间复杂度、最坏时间复杂度、平均时间复杂度1.2 在数据规模不大时,低阶、系数、常量也需要考虑1.3 时间复杂度相同,需要考虑比较与交换次数空间消耗使用空间复杂度判断,原位排序的时间复杂度为O(1)稳定性排序算法的稳定性:...

2018-11-09 17:13:21 142

原创 算法之递归

何时用递归需满足三个条件:一个问题的解可以分解为几个子问题的解这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样存在递归终止条件使用递归时注意要点要注意避免堆栈溢出要注意不要过量的重复性计算(可以利用map存储计算值)递归与迭代的区别递归是函数调用函数自身迭代是变量自身的数值变化简单例子问题:假如现在有 n 个台阶,每次你可以跨 1 个台阶或者 2 ...

2018-11-08 09:34:33 161

原创 数据结构之散列表

概述散列表的英文名叫“Hash Table”,所以,我们也叫它为哈希表。散列表利用数组支持下标随机访问数据的特性,是数组的一种扩展,由数组演化而来。散列函数我们需要把键值key映射为数组的下标。所以需要一个映射的函数,这个映射的函数就是散列函数。散列函数有三个基本要求:散列函数计算得到的散列值是一个非负整数如果key1=key2key1=key2key1=key2,那么hash(k...

2018-11-07 09:14:15 375

原创 数据结构之跳表

跳表是什么跳表是一种经过改进的链表。是一种查找效率要比链表更高的带有索引的链表。跳表是怎么出现的我们都知道链表相比于数组在存储上很占优势。不过查询时的时间复杂度为O(n),相比于下标随机查找下的数组的时间复杂度O(1)要逊色很多。所以大家都希望可以对链表的查询时间复杂度做一些提高,就算是要牺牲一些存储空间。跳表是在原始链表的基础上,设置了几层索引链表。通过索引链表进行查询。这样可以计算得...

2018-11-06 08:27:27 1481

原创 数据结构之队列

概念可以把队列想象成排队买票,先来的人先买,后来的人站在队尾排队后买,不允许插队,先进者先出,这就是典型的“队列”。特点先进者先出,后进者后出,不允许在中间进行插入、删除操作。基本操作入队:在队列的末尾插入元素出队:在队列的头部取出元素常见队列普通队列、循环队列、阻塞队列、并发队列队列的实现数组实现:要注意选择数组的长度链表实现:无限长队列,可能会出现过长等待时间循环队列的...

2018-11-05 13:11:11 176

原创 数据结构之栈

什么是栈从栈的操作特性上来看,栈是一种 “操作受限”的线性表,只允许在一端插入和删除数据,且满足先进后出、后进先出的特性。实现一个栈栈可以用数组或链表来实现,数组实现的叫顺序栈,链表实现的叫链式栈。栈的时间复杂度入栈与出栈的时间复杂度均为O(1)动态扩容的顺序栈与数组动态扩容类似,用数组实现的栈也可以动态扩容。申请一个扩容后的内存区域将数组迁移过去。栈的应用函数调用存储局部变量...

2018-10-31 10:19:15 206

原创 数据结构之链表

数组和链表对比数组是连续的内存区域、链表不是连续的内存区域。因此,数组在通过下标查询时的时间复杂度低,而链表在查询时需要遍历链表,所以时间复杂度较高。对于插入和删除,因为数组是连续的内存区域,所以每次插入和删除都需要做数据的迁移,因此时间复杂度较高。而链表因为在内存区域本身就不是连续的,所以时间复杂度比数组低。链表分类常见的有:单向链表、循环链表、双向链表、双向循环链表。链表时间复杂度...

2018-10-30 08:09:24 194

原创 数据结构之数组

数组的三种操作时间复杂度按下标随机查找时间复杂度:O(1)插入时间复杂度:O(n)删除时间复杂度:O(n)查找操作因为数组是一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据。所以,我们在通过下标i查找某个元素的时候,通过计算a[i]_address = base_address + i * data_type_size就可以查到该元素的偏移地址了。因为只需要经过有...

2018-10-29 11:19:11 621

原创 算法的复杂度分析

复杂度分析是什么代码的复杂度分为时间复杂度与空间复杂度。数据结构与算法解决的核心问题就是让代码更“快”、更“省”。具体来说,就是执行的时间尽可能的短,占用的空间尽可能的少。而代码到底有多“快”、有多“省”,需要对应的衡量标准,时间复杂度就作为代码有多“快”的衡量标准,空间复杂度就作为有多“省”的衡量标准。对时间复杂度与空间复杂度的计算分析就是复杂度分析了。为什么需要复杂度分析我记得我刚...

2018-10-27 10:06:03 565

原创 数据结构与算法学习背景概述

为什么要学习数据结构与算法?1. 面试必备站在一个比较现实且功利的角度来看,做计算机技术的大公司,如BAT、Google、Facebook,它们在招聘技术人员时,数据结构与算法是必考查的知识点。如果想要进入这样的大公司,那么掌握数据结构与算法就是必不可少的。这点作为正在秋招时期的我深有感触。完全不问数据结构与算法的技术面试是非常少的,基本上每个公司在技术面都会考查数据结构与算法(就算是小公司...

2018-10-26 22:41:00 2230 1

原创 python中的if __name__=='__main__'

背景初学者在学习Python的过程中,一定都遇到过if __name__ == '__main__'这样的语句。那么,这样的一个语句有什么作用呢?在什么时候需要使用这个判断语句呢?举个例子执行:def main(): print "hello world!" print __name__if __name__ == '__main__': main()...

2018-09-10 15:28:25 647

原创 计算广告基础

背景我们都知道,互联网最重要的就是流量与数据。有了流量与数据就有了变现的基础。我们都知道互联网变现大部分要依靠广告,于是近些年在线广告发展突飞猛进。所谓在线广告,指的就是在互联网平台上投放的广告。那么,计算广告又是什么呢?本文大致对计算广告的基础进行讲述。广告要说到计算广告是什么,那么肯定得先聊聊最普通意义上的广告。在有互联网之前,广告都是实体广告,也就是线下广告。就是我们会经常看到的...

2018-06-04 17:48:02 395

原创 搭建docker镜像私有仓库碰到的问题

之前我有过一篇博客是专门讲如何搭建docker镜像私有仓库的。《搭建docker镜像私有仓库》 最近将docker升级到1.12版本后又搭建了私有仓库。当镜像仓库的容器运行起来之后,我在其它节点上想要拉取该仓库中的镜像,遇到了如下报错: 该报错的原因在于: docker从1.3版本以后对Registry的访问都是用的https。这是基于安全的考虑的。而我的私有仓库容器使用http协议。所...

2018-05-17 10:29:44 1835 1

原创 Docker底层的内核知识——cgroups

概述我的上一篇博客Docker底层的内核知识——namespace讲解了内核中支持Docker作资源隔离的机制namespace。本篇文章主要讲述Docker背后内核的另一机制——cgourps。cgroups不仅可以用来限制被namespace隔离的资源,还可以为资源设置权重、计算使用量、操控任务启停等。从Linux系统中看cgroups我们依然先从操作系统中直观的看一下cgro...

2018-05-08 12:25:19 1186

原创 Docker底层的内核知识——namespace

概述用过Docker的开发者都知道,Docker容器在本质上是宿主机上的一个进程。也就是常说的容器是操作系统级的虚拟化。容器与容器之间做了资源的隔离,所以在一个容器内部的各种操作会给人一种仿佛在独立的系统环境中的感觉。外部应用对容器进行访问时,也会有这种感觉。而做这种容器资源隔离的Linux内核机制就是namespace。感受一下namespace的存在在具体了解namespace之前...

2018-04-15 14:36:39 4778

原创 Kubernetes的调度器

(本文基于Kubernetes v1.7)概述调度器Scheduler是Kubernetes的重要组件之一。其作用是要将待调度的Pod依据某调度策略调度到最适合它运行的节点上运行。这里就涉及到三个对象:待调度的Pod、调度策略、待部署的节点队列。 我们先来看下Scheduler及其相关联组件的框架图。然后再聊下Scheduler的调度策略。Scheduler及相关联组件框架图...

2018-03-29 11:19:50 1704

空空如也

空空如也

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

TA关注的人

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