Jack:那我要写的这个server用Oracle、mysql中的哪个模型比较合适呢?

我:一个都不合适。准确地说,如果你采用了这两种模式中的一种模式,你的16CPU机器马上就会挂。

Jack:那哪一个会先挂呢?

我:应该是Oracle那种模型的数据库会先挂。因为不断的进程fork()与exit()会消耗大量的操作系统资源,而这些进程其实就做了类似于"select a from b where c=10;"这样的操作(如果有合适的索引,这样的操作是非常快的)。

Jack:这有神马问题吗?

我:这样的SQL重复的频率是很高的,也容易引起latch争用的问题,同时,执行时间很短。

Jack:Oracle如何解决这样的问题呢?

我:Oracle主要通过绑定变量来解决这样的问题。

Jack:Oracle解决得好吗?

我:这是一个伪命题。因为这样的应用是典型的key-value场景,关系型数据库本身就不适合。如果你设计一个nosql数据库它的性能就会非常好。

Jack:好吧。回到正题,我们要如何设计这个Cache Server的网络框架呢?

我:所以,根据上边的讨论,我们可以得出一个结论——一定要采用多进程、多线程。

Jack:到底是多进程还是多线程呢?

我:我建议多进程+多线程。因为多进程模型必然采用共享内存,而共享内存使用起来复杂的同时,有一个明显的优点——进程挂掉之后,共享内存数据不会丢失。也就是说,只要把进程restart一下,就可以正常服务,它的可靠性比多线程要高得多。另外,可以在多进程中的每一个进程里采用多线程。

Jack:了解了。那么,采用多进程/多线程就足够了撒?

我:不够。对于关系型数据库来说,采用多进程或者多线程就完全足够了。但是,你这个是cache server,面对着直接的高并发、非事务的疯狂冲击。简单的多进程、多线程必挂。

Jack:为什么关系型数据库采用更多进程多线程就完全足够了?

我:根本的原因是关系型数据库是面向事务的,它的并发量并没有那么大。如果真有那么大,就只有做业务拆分,用更多的db机器去扛。因为它确实需要顶住这么大的业务量。你想一想,一个sql从用户那里发出后,会经历些什么呢?

Jack:比如Oracle,简单地说,首先把SQL传送到server端,然后把SQL语句解析成ASCII,然后再做yacc语法解析,之后再进行复杂的SQL优化(CBO干的就是这事儿),最后再执行这个SQL语句,执行的对象是一个table,而这个table有可能是几十个GB,甚至上T。

我:关键就在这里。一个关系型数据库的请求需要做很多很多的事情。而最耗费时间的,莫过于执行这个SQL语句。所以,一个请求的生命周期是比较长的。短的几分钟,长的几天甚至几十天都可能。所以,它很少面临因为线程、进程本身的创建、释放而把操作系统搞死的情况。但是,你的Cache Server就不同了。

Jack:明白了。那如何解决这个问题呢?

我:采用IO多路复用是必须的。甚至你可以不考虑多进程、多线程,但是IO多路复用一定需要。

自己写cache server之网络框架处理——Oracle、Mysql都不靠谱儿(中)相关推荐

  1. 自己写cache server之网络框架处理——对比mysql、Oracle(上)

    Jack:hi,淫龙.急救. 我:周末了,在碎懒觉. Jack:老板让我自己写个高性能的Cache数据库.你知道的,这个有多难.一时半会儿哪写得出来. 我:慢慢写吧.这玩意儿一时半会儿写不出来的. J ...

  2. 神了!阿里数据库专家纯手写了这份604页的Oracle+MySQL攻坚指南

    为什么要学习Oracle+MySQL? Oracle在金融.电信.交通.医疗.制造业.能源等诸多领域的使用非常广泛,其拥有完善的生态体系,多样化的数据库选件,在高可用性.高性能.高安全性.高数据服务能 ...

  3. 神了,阿里数据库专家纯手写了这份604页的Oracle+MySQL攻坚指南

    为什么要学习Oracle+MySQL? Oracle在金融.电信.交通.医疗.制造业.能源等诸多领域的使用非常广泛,其拥有完善的生态体系,多样化的数据库选件,在高可用性.高性能.高安全性.高数据服务能 ...

  4. Android常用的网络框架介绍和使用

    一.选择开源框架的原则 1.学习的成本:对该框架学习的时间长短,文档是否齐全的考虑  2.流行的程度:该开源框架是否流行,github 上 start 的个数,都是我们考量的标准  3.是否还在维护: ...

  5. Android 网络框架_常用的网络框架

    看了张哥(stormzhang)的博客之后,深有感触,又让我感慨了一番,而且发现张哥的博客英文跟汉字之间是有空格的,数字跟汉字之间也有空格,看起来很舒服很美观,张哥真的是把每一个细节都做的很好,所以身 ...

  6. 跨平台基础网络框架Mars初探

    前言 对于新派单通知.订单时效变更通知等需要及时反馈给用户的消息,目前点我达骑手的解决方案是定时轮询并通过http请求的方式主动从服务器获取变更,这种方式存在一定的缺陷,如http方式轮询流量消耗较高 ...

  7. Novate 一款Android RxStyle的网络框架

    去年我写了一个Android网络框架Novate, 基于Retrofit和RxJava封装的链式网络框架, 支持okhttp的调用分格,又兼容Retrofit注入方式,并支持RxJava调用的链式操作 ...

  8. Android之对Volley网络框架的一些理解

    转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/50888340 本文出自:[顾林海的博客] ##前言 Volley这个网 ...

  9. python 网络框架twisted基础学习及详细讲解

    twisted网络框架的三个基础模块:Protocol, ProtocolFactory, Transport.这三个模块是构成twisted服务器端与客户端程序的基本. Protocol:Proto ...

最新文章

  1. PO_标准内部请购内部采购单抛转订单模组(流程)
  2. 人脸识别loss加强
  3. 21、深入浅出MFC学习笔记,Application Framework简介
  4. java 中 Object XML 互转,最终选择Xstream
  5. oracle idm_深入了解Oracle IDM审核
  6. 160 - 31 cracking4all.2
  7. hibernate Criteria(条件查询接口)
  8. eureka server配置_springcloud项目搭建第三节:eureka集群
  9. mysql c api example_The MySQL C API 编程实例
  10. python基本对象_python对象之对象基础1
  11. C#LeetCode刷题之#58-最后一个单词的长度(Length of Last Word)
  12. (转载)—— Logistic Regression(逻辑回归)模型实现二分类和多分类
  13. 中国捆矛行业市场供需与战略研究报告
  14. 用Layer.search快速查询图元
  15. vue中的防抖函数写法
  16. 机器学习的应用–大数据
  17. matlab中双引号_在matlab中单引号和双引号各有什么意义?为什么有的函数参数要加单引号,有的要加双引号?...
  18. Stetman读paper小记:Backdoor Learning: A Survey(Yiming Li, Yong Jiang, Zhifeng Li, Shu-Tao Xia)
  19. 基于51单片机之数码管设计#扩展三位数码管电路,完成0-999递增或递减计数功能,递减间隔200ms左右
  20. activemq保证消息顺序原理

热门文章

  1. 剑指offer(C++)-JZ23:链表中环的入口结点(数据结构-链表)
  2. 华为机试HJ30:字符串合并处理
  3. java九九成表发_用EXCEL可多种办法生成99乘法表
  4. mysql 断言,mysql触发器模拟断言
  5. 火狐marquee_火狐不支持marquee解决方案
  6. pylint警告: An attribute defined in json.encoder line 158 hides this methodpylint(method-hidden)
  7. InteliJ IDEA生成可执行jar运行提示没有主清单属性
  8. linux上设置svn账户权限设置密码,Linux:如何在svn中设置“全局”用户/密码/组文件...
  9. 计算机教师招聘试题(汇总集合版),计算机教师招聘试题(汇总集合版)ed.doc
  10. scala解析csv文件写入mysql_scala实战之spark源码修改(能够将DataFrame按字段增量写入mysql数据表)...