Go语言中文网 为您找到相关结果 239

Go 性能优化技巧 8/10

尽管反射(reflect)存在性能问题,但依然被频繁使用,以弥补静态语言在动态行为上的不足。只是某些时候,我们须对此做些变通,以提升性能。 为便于阅读,以下示例均做了最大程度精简。 ![reflect1](http://studygolang.qiniudn.com/160607/116ce59acc17ca3eb189fcf74dadca3b.jpg) 如果是 reflect.Type,可将其缓存,避免重复操作耗时。但 Value 显然不行,因为它和具体对象绑定,内部存储实例指针。换个思路,字段相对于结构,除名称(name)外,还有偏移量(offset)这个唯一属性。利用偏移量,将 FieldByName 变为普通指针操作,就可以实现性能提升。 ![reflect2...阅读全文

Golang同步:条件变量和锁组合使用

条件变量的作用并不是保证在同一时刻仅有一个线程访问某一个共享数据,而是在对应的共享数据的状态发生变化时,通知其他因此而被阻塞的线程。 条件变量与互斥量组合使用 互斥量为共享数据的访问提供互斥支持 条件变量就状态的变化向相关线程发出通知 三种操作方法 等待通知: wait 阻塞当前线程,直到收到该条件变量发来的通知 单发通知: signal 让该条件变量向至少一个正在等待它的通知的线程发送通知,表示共享数据的状态已经改变。 广播通知: broadcast 让条件变量给正在等待它的通知的所有线程都发送通知。 声明 func NewCond(l Locker) *Cond 示例 改造上一节的锁使用代码 Golang同步:锁的使用案例详解 传送门:http://blog.csdn.net/liuxi...阅读全文

博文 2016-01-19 14:00:01 grassroots2011

Go-unsafe详解

package unsafe // ArbitraryType is here for the purposes of documentation only and is not actually // part of the unsafe package. It represents the type of an arbitrary Go expression. type ArbitraryType int // Pointer represents a pointer to an arbitrary type. There are four special operations // available for ty...阅读全文

博文 2016-02-05 04:00:01 shuanger_

B站日志系统的前世今生

作者简介王翔宇Bilibili资深运维研发工程师。曾就职于百度、饿了么,2017年加入B站,负责B站日志平台的设计和开发工作。B站的日志系统(Billions)从2017年5月份开始建设,基于elastic stack,面向全站提供统一的日志采集、检索、监控服务。目前集群规模20台机器,接入业务200+,单日日志量10T+。借此机会跟大家分享一些B站在日志系统的建设、演进以及优化的经历。由于经验尚少,抛砖引玉,欢迎大家一起交流讨论。文章主要分为三个部分:原有日志系统,现有系统演进,未来的展望。原有日志系统在Billions之前,B站内部并没有统一的日志平台,基本是业务之间各自为战,既有基于ELK的比较前瞻的方式,又有服务器上使用tail/grep比较基本原始的方式,水平参差不齐。在了解各个产...阅读全文

博文 2017-10-21 08:06:41 王翔宇

Golang并发工具包之信号量(Semaphore)

Go虽然天生的支持高并发,但是有些场景下我们还是需要控制协程同时并发处理的数量,在Java的juc包中已经提供了类似功能的工具类-信号量(Semaphore),它是基于AQS实现的。Go的SDK中并没有提供类似的API,我们通过goroutine和channel实现一个简单的Semaphore,并提供:获取许可(Acquire())、指定时间内获取许可(TryAcquireOnTime)、释放许可(Release())等方法,具体实现如下: type Semaphore struct { permits int // 许可数量 channel chan int // 通道 } /* 创建信号量 */ func NewSemaphore(permits int) *Semaphore { re...阅读全文

博文 2019-12-16 03:32:39 _男猪脚

Kubernetes 落地案例|将 Pokémon Go 运行到谷歌云上

背景知识: 《Pokémon Go》是由任天堂、Pokémon 公司和谷歌 Niantic Labs 公司联合制作开发的现实增强(AR)宠物养成对战类 RPG 手游。——百度百科 这些年的工程师生涯中,我参与过很多产品的发布,这些产品一般都是慢慢地拥有了上百万的用户。通常,产品在发布几个月后,产品新功能发布和架构都进行了调整,用户量才会渐渐上升。但是在谷歌云客户 Niantic 发布 Pokémon Go 时,一切好像都没有按照常理出牌,从中我体验到前所未有的成长。 在技术社区,同行曾经询问过支撑起 Pokémon Go 如此庞大用户量的系统采用了什么基础设施。希望将 Pokémon Go 运行起来。所以,Niantic 和 Google 的团队将支撑起 Pokémon Go(目前世界上最流...阅读全文

博文 2016-10-27 04:00:02 Caicloud

直击DTCC2018 阿里数据库技术干货全面解析

摘要: DTCC2018将如约而至。阿里数据库的核心团队将亮相此会,并与国内数据库专业人士交流过去9年在数据库领域的经验。一起来看看在DTCC2018上阿里数据库团队都给你准备了哪些你最关心的主题吧。 如果你是一个技术人的话,就一定听过中国数据库技术大会(简称DTCC)。作为国内数据库及大数据领域规模最大、最受欢迎的技术交流盛会,云集了国内外顶尖专家,共同探讨MySQL、NoSQL、Oracle、缓存技术、云数据库、智能数据平台、大数据安全、大数据和开源、大数据创业、大数据深度学习等领域的前瞻性热点话题与技术。自2010年以来,迄今已成功举办了八届,累计参与人次达到20000+。 2018 年 5 月 10日,DTCC2018将如约而至。阿里数据库的核心团队将亮相此会,并与国内数...阅读全文

MySQL 亿级数据量水平分库实践

需求背景 水平拆分和垂直拆分一直是最常见的数据库优化方式,笔者所在的部门所使用的数据库一直是主从热备的架构,但数据量在一年前就已经破亿,并以飞快的增长速度不断增加。为了减小数据库的负担,提高数据库的效率,缩短查询时间,水平拆分的工作已经必不可免。 水平拆分带来的问题 而水平拆分必然会带来一些问题,例如原本依赖于数据库自增 id 的主键在分库的场景下,多个分库下 id 做不到全局唯一;引入了分布式事务的问题,如果同一个逻辑事务里,涉及的数据跨多个数据库实例,本地事务将不生效;需要将原本的源库做拆分迁移,如果数据量很大的情况下,不停机的数据迁移也将成为一个难点;引入了跨库聚合的问题,分库分表后,表之间的关联操作将受到限制,就无法 join 位于不同数据库实例的表,结果原本一次查询能够完成的业务,...阅读全文

博文 2019-09-02 10:32:45 Philomon

基于 MySQL 的 ID 生成器 idgo

idgo是一个利用MySQL批量生成ID的ID生成器, 主要有以下特点: * 每次通过事务批量取ID,性能较高,且不会对MySQL造成压力. * 当ID生成器服务崩溃后,可以继续生成有效ID,避免了ID回绕的风险. 业界已经有利于MySQL生成ID的方案,都是通过:

REPLACE INTO Tickets64 (stub) VALUES ('a');
SELECT LAST_INSERT_ID();
这种方式生成ID的弊端就是每生成一个ID都需要查询一下MySQL,当ID生成过快时会对MySQL造成很大的压力. 这正是我写这个lib库的原因...阅读全文

开源项目 2015-12-24 16:00:00 flike

GO語言基礎教程:流程控制

在開始一個新的章節之前先來回顧上一篇文章的部份,首先我們來看這段代碼: package main import ( "fmt" ) func main(){ var x,y int=1,2 { var x int=2 { var x int=3 fmt.Println(x,y) //首先輸出3,2 如果我把這行輸出語句注解掉,大家猜猜會如何? } fmt.Println(x,y) //其次輸出2,2 } fmt.Println(x,y) //最後輸出1,2 } 執行結果我已經加到註釋內了,其實沒必要好奇,GO語言就是如此,這種突然出現的大括號構成了複合語句,大括號內的變量作用範圍只能在變量內部,這就涉及到變量的作用域了,在PHP中變量也是有作用域的,但是PHP遇到這種突然出現的大括號時不會構...阅读全文

深度分析:高频交易软件在硬件是怎么架构的?

首先,高频交易不一定是套利算法。事实上HFT做的最多的业务是做市(market making),可以是把商品从一个交易所倒卖到另一个交易所,也可以是在同一个交易所内部提供某种商品的流动性。这两种方式的共同点都是让人们可以特定地点买到本来买不到的商品,所以本身就是有价值的,收服务费就可以盈利。   二,延迟和流量是不同的概念。低延迟不等于高数据量,事实上大部分时间交易数据流量并不大,一个market一天最多也就几个GB。但HFT系统需要在流量高峰时也能快速响应,所以更看重延迟。这也是HFT系统和互联网系统最大的区别所在,HFT系统的精髓在于把单机的软硬件系统的性能发挥到极致,而不是像互联网那样强调高负载和延展性,动辄用几千台机器搭集群的做法在这里是不适用的。用互联网系统的性能指标来认知H...阅读全文

Gevent中信号量的使用

  greenlet间同步方法:信号量   1.为什么引入信号量;   2.gevent信号量有哪些;   3.编程实现。   为何引入信号量   信号量是一个允许Greenlet相互合作,限制并发访问或运行的低层次的同步原语。   什么是信号量   1.信号量有两个方法   acquire和release。在信号量是否已经被 acquire或release,和拥有资源的数量之间不同,被称为此信号量的范围。如果一个信号量的范围已经降低到0,它会阻塞acquire操作直到另一个已经获得信号量的greenlet作出释放。   2.Gevent信号量   1)Semaphore(也被称为锁);   2)BoundedSemaphor...阅读全文

Go小技巧(一)— 获取channel属性

概述 这里一个介绍一个方法,可以在不取channel里的数据的前提下,查看channel是否关闭,是否阻塞,缓冲大小,通道内当前缓冲数据量等。 在这里需要了解一下golang的内存模型,然后通过指针取出相应的值。 channel的结构体在chan.go中: type hchan struct { qcount uint // total data in the queue dataqsiz uint // size of the circular queue buf unsafe.Pointer // points to an array of dataqsiz elements elemsize uint16 closed uint32 //... 以下字段没有用上,先省略 } 从上面可以...阅读全文

千万级消息设计-思考(一)

说明 第一次写,也不知道写成什么样,喜欢的给个赞,不喜欢的给我留言。—— 蚂蚁爬树不怕高,有心学习不怕老。 场景 消息对于用户和平台来说,就是平台和用户之间的桥梁。特别是将消息看的很重的平台。 查询消息记录返回,响应时间问题? 现在都流行消息个数展示,未读消息个数问题?某某平台改变,小公司都要忙活了,忙坏了产品,累死了开发... 上面的两个看似简单的问题,在特定的场合,会给平台带来严重的结果,下面谈谈两种特殊的场合。 场合 1.用户到百万时,数据量到千万级后; 2.已经满足第一个条件后,平台再来几个推广活动。用户同时上线,参加活动会给用户发消息的时候(平台对用户进行推送消息,进行促销时,参加活动,活动奖励等使用消息通知的。 引发的问题 数据量过大时,查询速度变慢,导致数据库吃不消; 并发量高...阅读全文

博文 2018-06-10 10:34:37 antyiwei

Spark可以处理什么样的数据?

Spark 是一种与 Hadoop 相似的开源集群计算环境,是专为大规模数据处理而设计的快速通用的计算引擎,现已形成一个高速发展应用广泛的生态系统,主要应用场景如下: **1. Spark是基于内存的迭代计算框架,适用于需要多次操作特定数据集的应用场合。**需要反复操作的次数越多,所需读取的数据量越大,受益越大,数据量小但是计算密集度较大的场合,受益就相对较小; **2. 由于RDD的特性,Spark不适用那种异步细粒度更新状态的应用**,例如web服务的存储或者是增量的web爬虫和索引。就是对于那种增量修改的应用模型不适合; **3. 数据量不是特别大,但是要求实时统计分析需求。** 满足以上条件的均可采用Spark技术进行处理,在实际应用中,目前大数据在互联网公司...阅读全文

基于Consul的分布式锁实现

我们在构建分布式系统的时候,经常需要控制对共享资源的互斥访问。这个时候我们就涉及到分布式锁(也称为全局锁)的实现,基于目前的各种工具,我们已经有了大量的实现方式,比如:基于Redis的实现、基于Zookeeper的实现。本文将介绍一种基于Consul 的Key/Value存储来实现分布式锁以及信号量的方法。 http://blog.didispace.com/spring-cloud-consul-lock-and-semphore-2...阅读全文

GO語言基礎教程:數據類型,變量,常量

GO類似PHP,每行的結尾要加分號來結束,不同點在於GO對此並不強制,這一點又像javascript,另外GO的語句塊是用一對大括號來包裹的,但是go要求左大括號必須要在語句的結尾處,不能在行首出現左大括號,這是一個新的特性,至少在我接觸的編程語言中第一次遇到這種狀況.還有就是GO對大小寫敏感,這一點相信大家不會有什麽爭議. GO語言的註釋方法和PHP是相同的,單行註釋用//,而多行註釋用/*註釋內容*/,這一點是沒差別的. Go有眾所周知的數據類型int,這個類型很特殊,他會自動根據您的硬件決定適當的長度,在32位的硬件上他的長度是32位,在64位的硬件上,他的長度就是64位,當然了,您也可以強制定義某個變量的長度,例如int8,int16,int32,int64 和 byte,uint8...阅读全文

[golang] 数据结构-希尔排序

除了上篇介绍的二分插入排序,还有这次介绍的希尔排序(Shell's Sort),也是对直接插入排序算法的优化。 原理希尔排序,就是按某个增量值对数据进行分组,每组单独排序好后,再缩小这个增量,然后按新增量对数据分组后每个分组再各自排序。最终增加缩小到1的时候,排序结束。所以希尔排序又叫缩小增量排序(Diminishing Increment Sort) 关于增量最佳增量值的选择其实是个数学难题,有兴趣的可以自己搜下相关资料。常用的增量有 n/2(这个又叫希尔增量)、n/3、2^k-1(hibbard增量)等,实际使用中稍微改版增量也可能使排序的性能产生很大的波动。比如使用n/2的增量,就是初始增量就是 length/2 ,第二轮分组时就再除2:length/4,直至增量值变成1 流程假设有个...阅读全文

博文 2018-07-28 00:35:48 NicoChen

Go 的快速键值存储Badger-go

一个可嵌入,持久,简单,快速的键值(KV)存储,纯 Go 编写。 Badger 在进行随机读取时比 RocksDB 快至少 3.5 倍。 对于 128B 到 16KB 之间的数据量,数据加载速度是 RocksDB 的 0.86x - 14 倍,随着数字大小的增加,Badger 获得了很大的发展。 另一方面,Badger 在范围键值迭代方面目前较慢,但是这有很大的优化空间。 纯 Go 编写 使用最新的研究来构建最快的键值存储。 简单 以 SSD 为中心的设计 ![image](https://static.oschina.net/uploads/space/2017/1006/082139_Japn_2903254.png) ![image](https://static.os...阅读全文

开源项目 2017-10-06 01:30:02 网友

实现指定概率的随机事件

在开发中,经常遇到一个需求,给一些事件,并指定这些事件出现的概率。例如:A:10%,B:20%, C:30%,D:40% 按照事件的概率随机选择一个其中一个事件。 实现思路: 根据大学概率论所学的知识(啥,概率论课你睡觉了,我也睡觉了。那就我吹你听吧),这是一个典型的均匀分布问题。不扯那些复杂的公式了,我的概率论知识也差不多都还给老师了,直接画图来解释一下。 图中,A,B,C,D四种颜色画出了四个事件出现的概率,也就是在[0,100]数轴上所占的长度。只要我们在[0-100]中取一个随机数,看这个随机数落在A,B,C,D哪个区间中,就取哪个事件。 用代码实现一下,现在主要写golang,先用golang实现一下: package main import ( "fmt" "math/rand"...阅读全文

博文 2019-08-25 17:32:51 紫葡萄0

开发如何避免redis集群访问倾斜和数据倾斜

[TOC] 概述 redis 集群部署方式大部分采用类 Twemproxy 的方式进行部署。即通过 Twemproxy 对 redis key 进行分片计算,将 redis key 进行分片计算,分配到多个 redis 实例中的其中一个。tewmproxy 架构图如下: 由于 Twemproxy 背后的多个 redis 实例在内存配置和 cpu 配置上都是一致的,所以一旦出现访问量倾斜或者数据量倾斜,则可能会导致某个 redis 实例达到性能瓶颈,从而使整个集群达到性能瓶颈。 hot key出现造成集群访问量倾斜 Hot key,即热点 key,指的是在一段时间内,该 key 的访问量远远高于其他的 redis key, 导致大部分的访问流量在经过 proxy 分片之后,都集中访问到某一个 ...阅读全文

用Golang写一个搜索引擎(0x02)--- 倒排索引技术

这一篇,我们来说说搜索引擎最核心的技术,倒排索引技术,倒排索引可能需要分成几篇文章才说得完,我们先会说说倒排索引的技术原理,然后会讲讲怎么用一些数据结构和算法来实现一个倒排索引,然后会说一个索引器怎么通过文档来生成一个倒排索引。 倒排索引 什么是倒排索引呢?索引我们都知道,就是为了能更快的找到文档的数据结构,比如给文档编个号,那么通过这个号就可以很快的找到某一篇文档,而倒排索引不是根据文档编号,而是通过文档中的某些个词而找到文档的索引结构。 倒排索引技术简单,高效,简直是为搜索引擎这种东西量身定做的,就是靠这个技术,实现一个搜索引擎才成为可能,我们也才能在海量的文章中通过一个关键词找到我们想要的内容。 我们看个例子,有下面的几个文档: 文档编号 文档内容 1 这是一个Go语言实现的搜索引擎 ...阅读全文

博文 2016-07-20 11:10:55 吴yh坚

听云数据库管理平台NetopGO简介

➠更多技术干货请戳:听云博客 断断续续写了将近一个月,听云第一版数据库管理平台终于写完了,期间来来回回的改了好多次小毛病,现在已经部署到生产环境上去了。 在刚开始的时候,后端的数据库集群只有10多个节点组,日常的巡检工作并不会花费太多的时间和精力。随着业务的增长,在较短时间内后端集群扩展到数百节点时,这时的日常巡检如果还是人肉完成,讲道理,最终可能就是不做巡检或者是缘分巡检,哪天想起来了搞一下。显然这不是我们的风格。那么如何解放我们花在巡检上的时间和精力,我们决定写一个工具来帮我们完成巡检工作,我们要做的就是登陆上这个系统,look and check。 在这个版本中实现的功能并不是很多,大都是针对目前工作中的痛点来开发的,架构也很简单,分为报表和数据收集两个部分,数据收集程序主要从两个地方...阅读全文

博文 2016-05-26 15:00:01 TingyunAPM

go语言之beego框架orm的使用(二)

package main import ( "fmt" "github.com/astaxie/beego/orm" _ "github.com/go-sql-driver/mysql" ) type User struct { Id int `orm:"auto"` Name string Profile_id int } func init() { orm.RegisterModel(new(User)) orm.RegisterDataBase("default", "mysql", "ta3:ta3@/ta3?charset=utf8") orm.RunSyncdb("default", false, true) } func main() { var ( sSql string e...阅读全文

博文 2015-06-17 23:03:07 zistxym

剖析Go的读写锁

源码级剖析Go标准库中的sync.RWMutex。 概述RWMutex,读写锁,又称“读写互斥锁”。读写锁简单来说就是可以由任意数量的读者同时使用,或者只由一个写者使用的锁。 读写锁和互斥量(Mutex)类似,但是比起互斥量有着更高的并行性,它允许多个读者同时读取,因此有一些特殊的应用场景。在并发编程的很多场景下,数据的读取可能比写入更加频繁,这时就要允许多个线程同时读取一块内容。 用例Go中,RWMutex的零值是一个未加锁的互斥量。 RWMutex使用起来相对比较简单,这里举一个简单的例子: 12345678910111213141516171819202122232425262728293031package mainimport ( "fmt" "sync" "time")func ...阅读全文

博文 2017-09-28 03:32:13 zablog.me

golang利用reflect包实现struct与params自动绑定

前言 因为 golang 静态强类型语言特性以及没有很好的泛型支持导致在用 go 写 web 服务的时候,总会因为要对 http params 的解析和类型转换上要花很多时间,并且这会让代码显得很冗余,那有什么办法可以解决这一苦痛呢?答案当然是有的,这里我讲会到如何用 reflect 包写一个工具类实现 model 层 struct 与 http params 的自动映射绑定。 具体实现其实很简单,主要用到的就是通过 reflect.TypeOf() 获取字段的类型(包括字段名,类型,Tag描述等相关信息),以及 reflect.ValueOf() 来获取字段的值类型用于复写从params获取到的数据, 同时还要注意不同类型数值在 Set 时的差别。 用料 首先我们设计一个struct来储存...阅读全文

博文 2018-05-19 20:48:29 音風の部屋

基于Consul的分布式信号量实现

本文将继续讨论基于Consul的分布式锁实现。信号量是我们在实现并发控制时会经常使用的手段,主要用来限制同时并发线程或进程的数量,比如:Zuul默认情况下就使用信号量来限制每个路由的并发数,以实现不同路由间的资源隔离。http://blog.didispace.com/spring-cloud-consul-lock-and-semphore-2...阅读全文

一个信号量与定时器的例子(Golang)

程序可用来定时执行一些任务,并通过信号量处理,在被强制中断时,也能做相应警告及清理处理. package main //信号量与定时器 //author: Xiong Chuan Liang //date: 2015-2-25 import "fmt" import "os" import "os/signal" import "time" func main() { sigs := make(chan os.Signal, 1) done := make(chan bool, 1) signal.Notify(sigs, os.Interrupt, os.Kill) go func() { sig := <-sigs switch sig { case os.Interrupt: fmt....阅读全文

博文 2015-06-17 20:23:11 xcltapestry

Golang在大数据领域中的应用之唯品会高吞吐量Access Log存储的实现

潘卫华 / 唯品会基础架构部架构师,唯品会Dragonfly日志系统负责人。对 Elasticsearch 和大数据流式处理有丰富经验,对Golang及其程序的性能优化也有较多研究。前言大家下午好!我是来自唯品会基础架构部的潘卫华。今天我们来跟大家一起看看在大数据领域里面,Golang的应用。我们知道在大数据领域里,Java 和 Scala 语言基本是处于统治地位的,主要是因为像 Hadoop 以及基于 Hadoop 的一些工具栈,比如 HBase/Hive/Spark/Flink 等等,这些都是基于 Java 或者 Scala开发,他们提供 的api 也是主要给 Java 系的语言来使用的。不过实际在项目过程中,我认为还是在一些地方Golang是可以有用武之地的。我将从以下几个方面作分享:...阅读全文

博文 2019-01-24 22:17:35 Go中国

Golang 笔记之深入浮点数

引言 下面的一段简单程序 0.3 + 0.6 结果是什么? var f1 float64 = 0.3 有人会天真的认为是0.9,但实际输出却是0.8999999999999999(go 1.13.5)问题在于大多数小数表示成二进制之后是近似且无限的。 以0.1为例。它可能是你能想到的最简单的十进制之一,但是二进制看起来却非常复杂:0.0001100110011001100… 其是一串连续循环无限的数字(涉及到10进制转换为2进制,暂不介绍)。 结果的荒诞性告诉我们,必须深入理解浮点数在计算机中的存储方式及其性质,才能正确处理数字的计算。 golang 与其他很多语言(C、C++、Python…)一样,使用了IEEE-754标准存储浮点数。 IEEE-754 如何存储浮点数 IEEE-754规...阅读全文

博文 2020-02-13 09:32:48 唯识相链2

golang的httpserver优雅重启

去年在做golangserver的时候,内部比较头疼的就是在线服务发布的时候,大量用户的请求在发布时候会被重连,在那时候也想了n多的方法,最后还是落在一个github上的项目,facebook的一个golang项目grace,那时候简单研究测试了一下可以就直接在内部使用了起来,这段时间突然想起来,又想仔细研究一下这个项目了。 从原理上来说是这样一个过程: 1)发布新的bin文件去覆盖老的bin文件 2)发送一个信号量,告诉正在运行的进程,进行重启 3)正在运行的进程收到信号后,会以子进程的方式启动新的bin文件 4)新进程接受新请求,并处理 5)老进程不再接受请求,但是要等正在处理的请求处理完成,所有在处理的请求处理完之后,便自动退出 6)新进程在老进程退出之后,由init进程收养,但是会继...阅读全文

博文 2018-03-05 14:22:15 helight

从数据库导出大量数据的处理方式

需求:将商户订单或交易记录导出到文件中,便于分析文件格式:Type 1: xlsx office 2003: 数据行不能超过 65535行 office 2007 及以后: 数据量可以保持在 1 百万行左右 内存占用严重,效率低下Type 2: csv 效率高,格式简单,对大数字需要进行特殊的处理以防止格式改变 office 软件支持csv插件导出方式:一次性导出 内存占用严重,响应时间长分批导出 程序逻辑脚复杂,效率较高; 可以使用多协程的方式就行并发操作展示方式:直接从页面下载 用户需要等待,并可能长时间得不到响应,导致浏览器取消请求通过生成url以邮件的方式进行发送,并通过短信通知用户 减少用户无意义的一只空等待,利于一步并发操作,同时可正常通知用户结果和错误信息提...阅读全文

发:知乎基于Kubernetes的kafka平台的设计和实现

发:知乎基于Kubernetes的kafka平台的设计和实现我是知乎技术中台工程师,负责知乎存储相关的组件。我的分享主要基于三个,第一,简单介绍一下Kafka在知乎的应用,第二,为什么做基于Kubernetes的Kafka平台。第三,我们如何去实现基于Kubernetes的kafka平台。Kafka在知乎的应用Kafka是一个非常优秀的消息或者数据流的组件,在知乎承载了日志、数据收集、消息队列等服务,包括运行的DEBUG日志关键性日志。比如我们在浏览知乎的时候,有些用户行为或者内容特征,会通过我们这个平台做数据的流失处理。 关于Kafka实现对消息服务。简单地来说,我关注的A用户,是不是应该基于关注用户行为上做很多事情,而是应该关注更多的消息队列。我们平台现在部署有超过有40个Kafka集群...阅读全文

博文 2019-05-25 22:34:43 meng_philip123

算法篇03:排序算法

排序算法是接触最多也是考察最多的一个知识点,最常用的:冒泡排序、插入排序、选择排序、归并排序、快速排序、计数排序、基数排序、桶排序。其中可以按照时间复杂度把冒泡和插入归并为O(n^2)一类,归并和快排归并为O(n*log(n))一类,后三者归为O(n)一类。 分析排序算法主要从执行效率、内存消耗和稳定性三个角度去衡量,执行效率就是常说的时间复杂度,内存消耗主要说的是空间复杂度,这里还引入了一个原地排序概念(就是特指空间复杂度是 O(1) 的排序算法,可以理解为就在原内存空间上做数值交换),稳定性则是考虑待排序的序列中存在值相等的元素,经过排序之后,相等元素之间原有的先后顺序不变。 一、冒泡or插入 1.冒泡排序 冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否...阅读全文

博文 2018-11-04 22:34:40 YitaiCloud

运维架构服务监控Open-Falcon

摘要:监控系统是整个运维环节,乃至整个产品生命周期中最重要的一环,事前及时预警发现故障,事后提供翔实的数据用于追查定位问题。监控系统作为一个成熟的运维产品,业界有很多开源的实现可供选择。当公司刚刚起步,业务规模较小,运维团队也刚刚建立的初期,选择一款开源的监控系统,是一个省时省力,效率最高的方案。一、 介绍监控系统是整个运维环节,乃至整个产品生命周期中最重要的一环,事前及时预警发现故障,事后提供翔实的数据用于追查定位问题。监控系统作为一个成熟的运维产品,业界有很多开源的实现可供选择。当公司刚刚起步,业务规模较小,运维团队也刚刚建立的初期,选择一款开源的监控系统,是一个省时省力,效率最高的方案。之后,随着业务规模的持续快速增长,监控的对象也越来越多,越来越复杂,监控系统的使用对象也从最初少数的...阅读全文

博文 2017-10-12 08:38:14 肆虐的悲傷

golang中的unsafe详解

一、unsafe 作用 从golang的定义来看,unsafe 是类型安全的操作。顾名思义,它应该非常谨慎地使用; unsafe可能很危险,但也可能非常有用。例如,当使用系统调用和Go结构必须具有与C结构相同的内存布局时,您可能别无选择,只能使用unsafe。关于指针操作,在unsafe包官方定义里有四个描述: 任何类型的指针都可以被转化为Pointer Pointer可以被转化为任何类型的指针 uintptr可以被转化为Pointer Pointer可以被转化为uintptr 额外在加上一个规则:指向不同类型数据的指针,是无法直接相互转换的,必须借助unsafe.Pointer(类似于C的 void指针)代理一下再转换也就是利用上述的1,2规则。 举例: func Float64bits(...阅读全文

博文 2019-02-22 21:34:42 yushu1987

zstd,未来可期的数据压缩算法

tl;dr(太长不读): zstd是Facebook在2016年开源的新无损压缩算法,优点是压缩率和压缩/解压缩性能都很突出。 在我们测试的文本日志压缩场景中,压缩率比gzip提高一倍,压缩性能与lz4、snappy相当甚至更好,是gzip的10倍以上。 zstd还有一个特别的功能,支持以训练方式生成字典文件,相比传统压缩方式能大大的提高小数据包的压缩率。 在过去的两年里,新版本的Linux内核、HTTP协议、以及一系列的大数据工具(包括Hadoop 3.0.0,HBase 2.0.0,Spark 2.3.0,Kafka 2.1.0)等都已经加入了对zstd的支持。 可以预见,zstd将是未来几年里会被广泛关注和应用的压缩算法。 最近了解到了zstd这种新的压缩算法。不像lz4,lzo,sn...阅读全文

boltdb 源码分析-MVCC/持久化-3

boltdb 持久化 在前面简介部分已经描述了一部分持久化相关的内容 boltdb采用单个文件来将数据存储在磁盘上,该文件的前4个page是固定的: 第1个page为meta 第2个page为meta 第3个page是freelist,存储了一个int数组, 第4个page是leaf page page page是boltdb持久化时,与磁盘相关的数据结构。page的大小采用操作系统内存页的大小,即getpagesize系统调用 的返回值,通常是4k大小。 每个page开始的几个字节存储的是page 的raw data: type page struct { id pgid // page的序号 flags uint16 // page的类型,有branchPageFlag/leafPage...阅读全文

golang的一些试验小程序

golang的Map程序: package main import "fmt" type e interface{} func mult2(t e) e { switch t.(type) { case int: return t.(int) * 2 case string: return t.(string) + t.(string) } return t } func add3(t e) e { switch t.(type) { case int: return t.(int) + t.(int) + t.(int) case string: return t.(string) + t.(string) + t.(string) } return t } func localmap(s...阅读全文

博文 2014-10-04 19:27:19 壬癸甲乙

golang 数据库事务坑

事件 在做访问量比较高的gin web服务的时候,经常发现莫名的服务器有去无回,查看数据库连接sleep占用比较过高,而且time时间过长,确定了是数据库连接没有及时的回收,或者没有释放,所以根据这块查看到下面类似的代码 tx.Exec("") if(a = 1){ //未进行tx提交或者回滚导致 return err } tx.Commit(...阅读全文

博文 2019-12-17 21:32:43 dingking

虚拟主机“流量”是指什么?与日常手机流量有什么区别

想必有很多朋友都有使用过虚拟主机建站的经历。不过在建站之前,大家可能都需要选购虚拟主机,而在选择虚拟主机的时候,我们一般都会在主机配置中看到有“流量”的选项。国内虚拟主机一般是几个G,而国外虚拟主机一般是不限制流量。那么,这里的虚拟主机流量是指什么呢? 对于虚拟主机流量来说,与咱们常常说的网站流量可能不大一样。这里的虚拟主机流量,主要是指用户可以从服务器传输进和输出数据总量(类似咱们用手机上网产生流量)。简而言之,就是当用户在访问网站时,产生数据量的总和。 目前,大多虚拟主机商都是按照月为单位来计算的,比如每月3G,每月5G限制这样的月流量。 为了让大家更直观地理解,这里简单的举个例子:假设一个网站每个网页+图片的大小是20K,当月总共累计被访问了4000次网页,那么网站这个月所需...阅读全文

golang的sync.mutex

文章计划分为以下几部分: 1.什么是锁,锁的粒度,一般锁的实现,常见锁的类型 并发下的同步和互斥 原子操作、信号量、互斥量、读写信号量、自旋锁 2.golang锁的设计思想与演进 3.golang锁设计的底层基础简介 4.golang锁的代码实现与一些流程图 5.吐槽~ 参考资料: 设计演进http://www.cnblogs.com/niniwzw/archive/2013/06/24/3153955.html 一、什么是并发锁 高并发下,如何保证并行的多线程同时访问一片共享内存时不出现问题,加锁就是最简单的一种解决方案,通过保证上锁的原子操作来保证对资源访问权限的控制,其余的内存屏障等途径留待后续整理。 锁在不同场景下可以有很多分类,比如,分为乐观锁(读写锁)和悲观锁(互斥锁) 分为自旋...阅读全文

博文 2019-03-11 19:34:46 黑魔术师

聊一聊高并发高可用那些事 - Kafka篇

目录 为什么需要消息队列 1.异步 :一个下单流程,你需要扣积分,扣优惠卷,发短信等,有些耗时又不需要立即处理的事,可以丢到队列里异步处理。 2.削峰 :按平常的流量,服务器刚好可以正常负载。偶尔推出一个优惠活动时,请求量极速上升。由于服务器 Redis,MySQL 承受能力不一样,如果请求全部接收,服务器负载不了会导致宕机。加机器嘛,需要去调整配置,活动结束后用不到了,即麻烦又浪费。这时可以将请求放到队列里,按照服务器的能力去消费。 3.解耦 :一个订单流程,需要扣积分,优惠券,发短信等调用多个接口,出现问题时不好排查。像发短信有很多地方需要用到, 如果哪天修改了短信接口参数,用到的地方都得修改。这时可以将要发送的内容放到队列里,起一个服务去消费, 统一发送短信。 高吞吐、高可用 MQ 对...阅读全文

博文 2020-06-07 16:32:43 伟洪winnie

强一致性的分布式内存缓存version_cache

# version_cache version_cache是一个分步式一致性缓存解决方案。 原理:job 将数据打包成版本到redis,实例将存在redis的版本load到本地内存并计算最新版本的生效时间,使所有实例的缓存在同一时间生效来达到所有实例数据的一致。 实用场景:数据量少、非及时生效数据、高并发强一致的场景。如:配置服务,门店服务等 优点: 1. 轻松实现水平扩展,服务支持千万并发不是梦 2. 数据强一至性,不论启动多少实例,同一时间的数据绝对是一致的(服务器时间一致情况下) 3. 使用简单,实现数据生成接口后就可以像使用缓存一样方便,轻松实现高性能服务 缺点: 1. 数据按版本生效,变更的数据会延迟生效(原则上数据量越小处理越快) 2. 不适合...阅读全文

分享一门大数据的课程《新一代大数据计算引擎 Flink从入门到实战》相当不错,推荐学习!!

​课程简介:随着云计算和大数据的快速发展,在企业中需要处理和分析的数据量越来越大,随着Flink社区的快速发展,很多公司采用以Flink为核心技术栈来打造统一的大数据处理平台 ,Flink正变得越来越火,此时学习,正当其时。课程中从核心知识的多语言(Java-Scala)讲解到部署实战,循序渐进,助力系统入门Flink企业级应用适合人群大数据领域从业者或想转型大数据开发的工程师符合技术储备要求即可学习技术储备要求了解Linux基础操作,熟悉Java SE或Scala的基本使用熟悉Hadoop基础应用点击进入资源下...阅读全文

博文 2019-08-13 01:22:00 tomcat