`
gemantic
  • 浏览: 337796 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

数据量很大和很小的情况下编程有什么区别?

 
阅读更多
09年刚进搜狐的时候,只有半年多的工作经验,完全不懂什么叫做高并发,什么叫做大数据。
入职产品技术中心,接手视频的模块,就做了一个最简单的功能。

用户点击视频的时候,视频点击次数+1.
用Memcache做缓存。

这TMD已经是简单的不能再简单的操作了,但是改完发布上线之后,他们发现视频的点播次数会出现倒退的情况。
就是本来点播次数已经是18834了,点击一次播放,没有变成18835,反而变成了18830.

心都碎了。完全看不出代码错在哪里。
后来各种调试,看日志,慢慢看出点门道来。

第一次感受到什么叫做并发。当时每秒并发好像有100多还是200多?不太记得了,一些热门的视频播放次数比较多,而且当时还支持转到QQ空间什么的播放。

就看到日志里记录的点播次数完全是乱的。
完全是乱的!

想了好久才想明白,NND,从Memcache里取数据是需要时间的,这个时间是几MS我不记得了。
我最恨画图:
总之单个用户访问的时候是这样的


1.用户A点击了一次视频==》从Memcache取数据,如10086
2.用户A做+1操作=》10087
3.用户A保存进Memcache=》10087


不要问我为什么用Memcache,而不是直接用DB。

这是一个非常非常简单的逻辑。



多个用户访问的时候是这样的。

1.用户A点击了一次视频=》从Memcache取数据,如10086
2.用户A做+1操作=》10087
3.用户B点击了一次视频=》从Memcache取数据,仍然是10086
4.用户C点击了一次视频=》从Memcache取数据,仍然是10086
5.用户D点击了一次视频=》从Memcache取数据,仍然是10086
6.用户E点击了一次视频=》从Memcache取数据,仍然是10086
7.用户F点击了一次视频=》从Memcache取数据,仍然是10086
8.用户G点击了一次视频=》从Memcache取数据,仍然是10086
9.用户H点击了一次视频=》从Memcache取数据,仍然是10086
10.用户A保存进Memcache=》10087
11.用户B做+1操作=》10087
12.用户C做+1操作=》10087
13.用户B保存进了Memcache=》10087
14.用户I点击了一次视频=》从memcache取数据,数据是10087
15.用户I做+1操作=》10088
16.用户I保存进Memcache=》10088
17.用户C保存进Memcacche=10087


你们看明白没?
坦诚的说,我是一脸的懵逼,完全不知道该怎么处理,后来是申总教我用锁。
嗯。说起来那个时候Memcache如果直接有原子+1操作就好了。

还用到了concurrentHashMap等等。



马丹,传不了图。就这么着吧。
求也没用,渣渣网络传不上去图。


简单来说就是在把数据取出来,又回写进去的时间里,恰巧有其他的用户也获取数据,写进去。
出错就在这几MS的网络传输上。


这就是所谓并发的含义。在单个线程里不会出错的逻辑,在并发的情况下成为了一个明确的漏洞。
这也是为毛要加各种锁的原因。



除此之外,没过多久,我需要对数据库建索引,DB也不大,也就是几千万条数据。
马丹我年少无知,压根不知道那是线上数据库。

用了Navicat连上之后直接点了建索引。

So。剩下的事就不说了,瞬间公司全炸了,视频下面的页面都打不开。

我仍然一脸懵逼,后来才知道原来TMD几千万条数据建索引跟几十条数据建索引的时间根本不是一个量级的。

也根本没考虑过不锁表建索引的方案。

后来鹏哥过来了问我怎么能大白天在线建索引,我一脸无辜的说我不知道这是线上数据库。
还在心里默默的补了句我也不知道建索引要这么久。


一个是很简单的视频播放数+1,一个是很简单的DB建索引。
小数据量, 无并发的情况下随便你玩儿。


这两件事都是差不多我入职一两个月的时候发生的,也非常感谢搜狐的包容,做为当时三大门户网站之一,搜狐当时的同事非常非常赞,跟他们学到了很多很多东西。

不过那时候搜狐没有QA,没有运维,全靠工程师自觉搞定。
到后来做白社会的时候更是神一样的速度和效率。

离开搜狐之后,根本就找不到像当前的同事一样有职业素养,技术好,又负责的同事。
没办法只好通过各种流程来确保线上故障不发生。

所以我一直都在想,有多少程序员有幸能接触到这些顶级的工程师?能接触到大数据,高并发的业务场景?

我见过3~5年工作经验的人都不知道日志如何打,出了线上故障不看日志纯靠猜。
互联网之所以能推动技术快速发展,应用场景是非常非常重要的因素。


这就是自己做练习和真正做项目的差别吧?
代码要求严格的时候,项目名,函数命名,包路径,哪些要写单元测试,哪些不要写,都是要统一的。
自己写的时候哪会注意这个?



==========再补充一段====================
1.08年的搜狐产品技术中心,确实是没有QA,没有运维的。在白社会项目开始了一年之后,似乎都没有QA和运维,我不记得了。白社会的是一个60多人的产品技术团队协作项目,现在我都很钦佩能够带领这么多工程师在3个月之内内测上线,6个月之内正式上线的Mark。没有QA去做验证,我只能说当时的搜狐工程师很强很强很强很强。在之后我带的团队中,没有QA的话。。。

2.我进去的时候不是实习生,是正式员工。
3.进去的时候只有7个月的工作经验,等会列一下当时会了什么东西就进了搜狐。
4.搜狐当时的很多牛人,最佩服的元涛,中兵,小刚,胡伟,吉子,琳姐,申总,都是我见过的最优秀的工程师,根本不存在各种各样的现在纠结的问题。现在可惜都散落在各家公司做高级架构师和CTO去了,还有经常在百度,新浪,阿里,滴滴,腾讯,京东等各家公司打转的。
5.那个时候memcache用的是比较多的,MQ是后来在白社会里才用到,也是踩了不少坑。


简单说一下当时我的技术水准,也给你们一个参考。

硕士期间基本上没怎么写过代码,全部是去写论文了,加上本科是计算机网络,又是自考,跟写代码基本上不沾边。

所以,基本上所有的编码经验都来自于毕业之后的,当时我只做过两个项目,一个是内部的CRM系统,做了差不多3个月,学会点皮毛,Spring,Mysql,JDBC,hibernate,jsp,js,html,eclipse,tomcat。
跟着做了一个短彩Wap的项目,学会了Maven,WebService,shell,memcache。

那个项目是电信项目,每个省一套独立的版本,每个省都有自己的接口,每次改东西特别麻烦。
当时做的时候就觉得这么做不对,之前看书的时候,看到过一点点设计模式,所以就尝试跟主管沟通。

可不可以我们在内部统一用一套Model,将所有外部各省不统一的名字,都映射到我们自己内部统一的Model里来。

这样,如果再变的话,也只是变外面的接口部分,这部分代码无论未来有多少省变更或者是接入都可以。

我们自己内部的处理流程基本上不变了,就不用在一个项目上打30多个分支,每次修Bug的时候都不知道哪个分支该修复。

但是当时的主管完全不理我,也是因为这件事儿,怒而辞职的,都不知道搜狐怎么找到的我。
反正当时也是海投和瞎投。

面试的时候我记得很清楚,琳姐和Mark分别见了我,问我期望薪水多少。我说我当前的薪水是5K,期望是6K。琳姐和mark都没说啥,刚面试完,HR打电话跟我说,给你6.5K,另外还有绩效奖,比你的预期要高很多。

当时瞬间就明白了自己好傻,马丹一定是我要求的薪水太低拉低了说出去太丢人了。
琳姐说,当时有很多人经验比我丰富,水平比我高,但是琳姐说我讲东西的时候条理清楚,思路清楚,所以才让我进来。

嗯。还记得琳姐说了,基本上搜狐的工程师都是一年左右成长起来的,她也希望我能够在一年之内能独挡一面,然而一年之后因为各种原因我走掉了。
现在想想,还有哪家一线公司的Leader愿意拿出一年的时间去培养一个新人?只是当时太不懂事儿,根本理解不了。直到后来自己花了很多心思去带团队,看到自己带起来的人一个个的离开,一个个的成长,才慢慢体会到一点点在当时,决定让一个新人去搜狐意味着什么。

当时一个组是6个人,我是最菜的,嗯。
所以业界一直在说搜狐是IT界的黄浦军校,我是百分百赞成这一点的。

只是,可惜,嗯。
搜狐的白社会也是我见过的效率最高,代码质量最高,Bug几乎没有,引入新技术最多,产品体验最好的产品。

现在已经被抛弃掉了,登上去之后基本上各种功能都不能用了,还是会偶尔登一下,偶尔会跟朋友说,看到没,这个是我做的,这个是我做的,这个还是我做的。

==========再补充一段==============

后来我在自己搭建团队的时候,基本上都很注意带新人。
我一直都觉得,水平有高有低,基础有强有弱,态度必须好。

如果你是一个新人,你自己都没有一个想要去努力,成为一个技术大牛的心愿,别人怎么可能帮你做这些事?
很多时候,并不是别人逼着你做东西,而是你感受到他们职业的态度。

多数公司都是架构师来说这个项目怎么做,然而搜狐产品技术中心的策略就是所有的方案设计都是由工程师发起,谁负责这个模块,谁来负责这个模块的所有设计,从DB到缓存到架构,到技术方案的细节,leader们只负责做评审。

所以当时的氛围是,身边的技术大牛们特别High的说我要用这个方案那个技术来解决这个问题,你看Facebook他们就用了这个,Myspace用了这个,Twitter用了这个,为毛我们不能用?

再不然就是这个开源框架不好,有缺陷,我们要自己来一套,很简单,很容易,没什么风险,你看我Demo都做出来了。

其实之前的贴子中也写过一些细节了,毕竟时间太久了,我自己也可能会记错。
这次回答的时候,也是刚好前几天跟知乎的一群{XX}骂了街,多写点平静一下,顺便也给那些新入门的程序员提个醒。

项目很重要,说一个项目成就一批人根本不为过。
无论是微信,还是微博,还是滴滴,或者是京东,都是靠着解决的应用场景成长起来的。

然而大部分应用都很难有大数据或者是高并发的场景,其实解决方案都是大同小异的,只是你能不能真正上手感触一下。

比如说,之前足迹服务器瘫痪的时候,金山云的朱桦带队支持,印象中是两三周就对整体架构做了优化和调整。

这些东西说难不难,就看你能否真实的接触到。

这想,这就是我希望能够对这个问题贡献的价值。
分享到:
评论

相关推荐

    Sqlserver大数据量插入速度慢或丢失数据的解决方法

    面对SQL Server在大数据量插入时出现的速度慢及数据丢失的问题,可以通过使用函数进行批量插入或采用BULK INSERT等命令来提高插入效率和数据完整性。这两种方法各有优缺点,根据实际情况选择合适的方案可以有效提升...

    C# Access 大数据量 批量 效率 快速 导入

    在C#编程环境中,处理大数据量的导入任务时,效率是非常关键的一环。"C# Access 大数据量 批量 效率 快速 导入"这个主题聚焦于如何利用C#语言高效地将大量数据批量导入到Access数据库中。Access作为一个小型数据库...

    小数据量法计算Lyapunov

    小数据量法则是针对实际应用中数据有限的情况,提供了一种有效处理和分析的方法。在本文中,我们将深入探讨如何利用LabVIEW这一可视化编程平台,结合小数据量法来计算Lyapunov指数,以评估系统的稳定性。 首先,让...

    AJAX大数据量处理

    c#的性能优化和Web API设计对AJAX数据处理的效率有很大影响。 10. **安全性**:处理大量数据时,必须注意数据安全,防止SQL注入、跨站脚本攻击(XSS)等。c#中的验证机制和安全编码实践在此过程中扮演关键角色。 ...

    07丨编程语言原理:面向对象编程是编程的终极形态吗?.pdf

    综上所述,虽然面向对象编程在很多情况下表现出强大的能力和广泛的适用性,但它并不是编程的终极形态。编程语言和范式的选取取决于具体的应用场景、团队背景和项目需求。随着技术的不断进步,可能会有新的编程理念和...

    单片机编程语言_学习哪种编程语言好?

    但它在单片机编程中的应用相对较少,主要是因为它缺乏高级语言的一些特性,如复杂的数据处理能力和丰富的库支持。 ###### 2.3.3 PL/M语言 PL/M语言具有良好的可读性和可靠性,但在单片机编程中也存在局限性,如不...

    深入理解并发编程

    并行编程可能很困难,因为程序员必须考虑如何合理地分配任务到不同的处理单元,并确保线程间的同步与协作,同时处理好数据竞争和死锁等问题。为了解决这些问题,程序员可以采取一些措施,比如使用同步原语、设计合理...

    狮岛编程软件

    用户可以事先在有网络连接的环境中准备好所有必要的程序和数据,然后在没有网络的条件下进行控制器编程工作,这一点对提高消防工作效率以及确保系统的稳定运行来说至关重要。 我们注意到,在提供的文件信息中,...

    编程新手真言绝对实用

    1. **C与C++是两种不同的语言**:尽管两者之间存在联系,但它们的设计理念和使用场景有很大区别。 2. **C的数组、指针、字符串**:C语言中的数组、指针和字符串是其基础数据类型,了解它们的用法对于编写高效的C...

    小数据量法计算 Lyapunov 指数的 matlab

    在计算Lyapunov指数时,由于涉及大量的浮点运算和迭代,使用mex函数可以显著提高执行速度,这对于处理大数据量或者需要快速响应的实时应用来说尤其重要。 `LargestLyapunov.m`文件很可能是MATLAB程序,用于计算最大...

    C# 数据图表编程之饼图

    另一方面,纯代码绘制饼图是在没有使用预定义控件的情况下,通过编程逻辑直接在图形画布上绘制出饼图。这种方法更适合于轻量级的应用或者需要在非标准环境中显示图表的场合。文件"数据图表之手工饼图"可能提供了示例...

    C语言编程在大学物理实验中处理数据的研究.pdf

    根据提供的文件内容,虽然存在OCR扫描识别误差和信息的不完整,但仍然能够从中提取出关键知识点,并据此形成一个关于"C语言编程在大学物理实验中处理数据的研究"的详细解释。 C语言是一种广泛使用的高级编程语言,...

    Qt中tableWidget和tableView的使用

    而当数据量较大、需要高效处理或高度定制时,`QTableView`结合数据模型和视图模型的分离模式会更有优势。 在名为`workForm`的压缩包文件中,可能包含了使用`QTableWidget`或`QTableView`创建的工作表样例代码,通过...

    成为编程高手的八大奥秘

    编程高手之所以能够在众多程序员中脱颖而出,很大程度上归功于他们坚实的基础知识。数据结构、离散数学、编译原理等基础知识是计算机科学的核心,也是高效编程的基石。这些理论不仅仅是理论知识,更是解决实际问题的...

    迷茫?为你解答学习编程几个常见的疑问

    - **数学基础**:虽然编程并不一定需要非常深入的数学知识,但对于初学者而言,具备基本的数学知识(如高中数学)是非常有帮助的,特别是在理解算法和数据结构方面。 - **逻辑思维能力**:逻辑思维能力对于编程至关...

    精彩编程与编程技巧-用VB开发多通道仪表数据采集程序...

    - **数据读取**: 通过设置`InputLen`属性,可以控制每次读取的数据量。 - **事件处理**: 使用`OnComm`事件来响应数据到达的情况,这是实现数据实时处理的关键。 - **数据解析**: 对接收到的原始数据进行解析,转换成...

    linux网络编程和code

    在这个压缩包“linux网络编程和code”中,很可能是包含了一些关于Linux网络编程的源代码示例,帮助学习者深入理解和实践相关概念。 一、套接字编程 套接字(Socket)是网络通信的基本接口,它是进程间通信的一种...

    编程挑战 习题1.6.1

    标题 "编程挑战 习题1.6.1" 指向的是一个具体的编程问题,很可能是来自一本关于算法或编程竞赛的书籍。这道题目是第一章中的第六个练习,通常这类挑战旨在训练读者的逻辑思维能力和编程技巧。ACM(国际大学生程序...

Global site tag (gtag.js) - Google Analytics