原文地址:http://igoder.iteye.com/blog/1969848

先解释一下软件编程中常见的一些概念: 
抽象先于具象。这个抽象并非虚无的抽象,而是指事物尚未分化为具象之前的那个前体存在。当那个前体存在分化成具象存在之后,前体存在就退化为背景,成为一种抽象。 
结构是关联与互动的复合体。 
接口是结构的耦合点。 
架构是从无结构到有结构的过程。 
重构是从旧结构到新结构的过程。 
也就是说,结构是架构的结果,架构是结构化的过程。 
常听人说语言是工具,这是错误的。语言不是工具,但它和工具都是大脑的延伸。语言是介于智力与工具之间的衔接物。 
就好比,人类语言是人与人之间的沟通媒介,是人与工具之间的衔接物,而编程语言,不过是将人类语言换成了另外一种符号系统,故编程语言可以看成是人脑与电脑的沟通媒介。

世界万物,皆有层次性。 
最开始只有程序员。架构师、项目经理、产品经理都是从程序员逐步分化出来的,架构师是项目最顶层的那个人,必须熟悉各个层次的需求,而不再仅仅是程序层面的。而凡高层次存在者,皆以对结构的调控与整合为其核心能力。这里的结构调整,涉及各个层次,比如人员结构,成本结构,技术结构,语言结构等等。即是说,复杂的工程项目架构不仅仅只是程序的架构,还会涉及人员、流程、管理等各层次的架构。

cap理论指的是三个层面事物的性质,三个层面指数据、系统、网络,简述如下: 
一致性:指数据的一致性。 
可用性:指系统的可用性。 
容错性:指网络的容错性。 
此三层层层嵌套包含,环环相扣,稳定性依次降低,而灵活性与复杂性依次上扬,因此出错率也依次提升。越底层的越简单,也越重要,越具有决定性。网络和系统错了,还可以修补,而数据要是错了,就没法挽回了。这其实和数据库的发展史也是一致和同步的。所以分布式的系统,允许偶尔存在网络问题,但需要保证可用性。集中式系统,允许偶尔存在可用性问题,但需要保证一致性。

话说天下大势,合久必分分久必合。 
而这世间的事物,也是以一种分化与构合的方式逐步交替演化而来。

nosql的出现,源于数据存储空间与数据访问时间的矛盾。 
传统数据库的存储与访问是集中在一起的。 
即是说,数据存在什么地方,就去什么地方访问。 
集中模式的优点是数据稳定,生命周期长,可靠,强关系,缺点是空间扩展性有限。 
集中模式的代表是关系数据库。

社会的进一步分化,使得IT系统也开始分化。 
数据库也逐渐从关系数据库向不同领域不同层次分化。 
网民的行为从最开始的只读模式,逐渐分化为读多写少的模式。 
随着访问量提升,出现了IO密集型访问(此时主要是读取密集型),从而导致读取时间变慢。 
为提升性能,发展了数据库缓存技术,主要是对数据库的读取操作进行分离。

而随着web2.0的进一步发展,网民的生产力进一步提升,存储总量开始增加。 
此时虽然仍然是读多写少的模式,但写入量已经大大提升。 
原有的缓存技术不能缓解写入压力,而且原有的空间也受硬盘限制,因此开始出现分库分表,实现读写分离。

集中模式的数据库就这样开始逐渐分化:由一个集中的、稳定的、强关系的结构,朝一个分化的、容错的、弱关系的结构发展。 
数据的存储空间与数据访问时间也进一步分离。 
即原来是数据存在什么地方,就去什么地方访问。现在是数据还是存在老地方(硬盘),但是访问却在另一个地方(比如内存,或另一个服务器)。其目的,就在于缩短IO路径或分离IO,实现高效访问。

存储空间的分化,导致写入的分化,实现空间换时间的效果。这种扩展分为两种模式: 
如果横向分离(同一层次,空间分离),则可实现诸如主从复制、分库分表等效果,使得读写分离,IO提升。 
如果纵向分离(不同层次,过程分离),则可实现数据库缓存、分布式缓存等效果,也能读写分离,IO提升。

redis首先是一个整体,其次是纵向分离的产物(由硬盘分离成硬盘+内存),然后才是横向分离(分布式)。 
它从内部是一分为二,将存储空间分为两块,将存储过程分为两步。 
而memcached+mysql是两个东西,从外部将两者合二为一。因此在契合度上,redis必然更有优势。 
由于空间分离,数据也开始分离。冷数据下沉,热数据上浮,而为了保持数据的一致和同步,必须保证在分离的同时,使得两者保持联系,以便于即时更新数据。 
从整体上来说,redis是一个整体,其整体效果和连贯性要大于M+M的组合效果。redis的数据同步在内部完成,是直接同步;而M+M必须借助中间件完成,是间接同步。 
从结构上来说,redis的磁盘存储数据要比mysql简单,而内存结构却比memcached多样和灵活。 
从扩展性来说,由于redis的底盘简单而稳定,使其有着良好的扩展性,而上层的复杂性使redis可以适应于更多复杂的业务场景。

原来业内认为M+M的问题是: 
1,扩展时维护麻烦; 
2,存在数据不一致现象; 
3,大容量数据下命中率下降。

而redis基本没有上述问题,因此,redis有逐渐取代memcached的趋势。

mysql后来推出了一个memcached插件,对外提供与memcached协议兼容的接口,使得两者终于结为一个统一的整体了。 
可以把memcached插件看成是mysql的一部分,因此我们从nosql的角度来看,mysql也可以视为是nosql的一种。 
由于memcached插件朝mysql靠拢,使得memcached插件同时还得受制于mysql,即:memcached插件和mysql更紧密更统一的同时,其生命周期和生存空间受到mysql的制约,一荣俱荣一损俱损,一旦mysql挂了它也得挂。因此memcached插件的推出,使得memcached呈现一种收缩的态势,扩展性受到mysql的限制。 
从整体上来说,memcached插件的整体性和连贯性使得redis的优势已经被削弱。 
从结构上来说,memcached插件可以天然的利用mysql自身的存储和复制,因此存储方面要强于redis,而上层的内存结构和操作方式等依然弱于redis。 
从扩展性来说,memcached插件和mysql结合紧密,由于底盘mysql本身的厚重性,扩展性受限制,使得memcached插件的分布式能力弱化了一些。

综上: 
越集中的系统,架构越保守越封闭,稳定性越高,联系越紧密,伸缩性和扩展性必然受到制约。 
越开放的系统,架构越分化越创新,稳定性越低,联系越松散,伸缩性和扩展性必然逐步扩大。 
系统在开放和分离的同时,为了保证子系统内部的统一和连贯,必然要求子系统内部之间保持联系。 
这使得现代系统和架构朝分布式和网络化的方向发展,以一种整体的多系统的连续的方式朝外扩散,一如宇宙的膨胀一般。 
从逻辑结构上(而非诞生先后)来说,这种扩展趋势可以简单示例如下:

mysql --> mysql+handlersocket插件 --> mysql+memcached插件 --> mysql+memcachedb --> mysql+memcached

由上可见,系统存储架构从一个强联系的整体,朝一个弱联系的个体分化开去,内存应用一步一步朝独立的方向发展,逐步摆脱mysql的制约,向往极端的自由和灵活,直到memcached完全和mysql隔离,时间和空间不再受mysql限制,必须靠第三方工具进行间接联系,使得扩展性达到极致。 
由于系统分化使系统之间的联系进一步弱化,势必要求系统之间采用更加复杂的联系方式。 
分化的越厉害,中间节点越多,联系方式就越加复杂,稳定性越低,故障自然越多,维护成本越大。

而redis则以一种相对简单和分散的方式,使得这一过程得以继续延续下去。 
因此为什么redis能比M+M更好用,原因是:一是结构简单,二是硬盘与内存合为一体。 
由于结构简单,所以方便扩展;又由于硬盘与内存合为一体,所以使数据也能同步扩展,维护更简单。

...

以后会不定时更新该文章,陆续把这个分化过程编的逻辑完整和连贯一些。

为什么使用Redis的更多相关文章

  1. 使用redis构建可靠分布式锁

    关于分布式锁的概念,具体实现方式,直接参阅下面两个帖子,这里就不多介绍了. 分布式锁的多种实现方式 分布式锁总结 对于分布式锁的几种实现方式的优劣,这里再列举下 1. 数据库实现方式 优点:易理解 缺 ...

  2. Ignite性能测试以及对redis的对比

    测试方法 为了对Ignite做一个基本了解,做了一个性能测试,测试方法也比较简单主要是针对client模式,因为这种方法和使用redis的方式特别像.测试方法很简单主要是下面几点: 不作参数优化,默认 ...

  3. mac osx 安装redis扩展

    1 php -v查看php版本 2 brew search php|grep redis 搜索对应的redis   ps:如果没有brew 就根据http://brew.sh安装 3 brew ins ...

  4. Redis/HBase/Tair比较

    KV系统对比表 对比维度 Redis Redis Cluster Medis Hbase Tair 访问模式    支持Value大小 理论上不超过1GB(建议不超过1MB) 理论上可配置(默认配置1 ...

  5. Redis数据库

    Redis是k-v型数据库的典范,设计思想及数据结构实现都值得学习. 1.数据类型 value支持五种数据类型:1.字符串(strings)2.字符串列表(lists)3.字符串集合(sets)4.有 ...

  6. redis 学习笔记(2)

    redis-cluster 简介 redis-cluster是一个分布式.容错的redis实现,redis-cluster通过将各个单独的redis实例通过特定的协议连接到一起实现了分布式.集群化的目 ...

  7. redis 学习笔记(1)

    redis持久化 snapshot数据快照(rdb) 这是一种定时将redis内存中的数据写入磁盘文件的一种方案,这样保留这一时刻redis中的数据镜像,用于意外回滚.redis的snapshot的格 ...

  8. python+uwsgi导致redis无法长链接引起性能下降问题记录

    今天在部署python代码到预生产环境时,web站老是出现redis链接未初始化,无法连接到服务的提示,比对了一下开发环境与测试环境代码,完全一致,然后就是查看各种日志,排查了半天也没有查明是什么原因 ...

  9. nginx+iis+redis+Task.MainForm构建分布式架构 之 (redis存储分布式共享的session及共享session运作流程)

    本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,上一篇分享文章制作是在windows上使用的nginx,一般正式发布的时候是在linux来配 ...

  10. windows+nginx+iis+redis+Task.MainForm构建分布式架构 之 (nginx+iis构建服务集群)

    本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,由标题就能看出此内容不是一篇分享文章能说完的,所以我打算分几篇分享文章来讲解,一步一步实现分 ...

随机推荐

  1. UIKit和Core Graphics绘图(一)——字符串,线条,矩形,渐变

    概述 CoreGraphics也称为Quartz 2D 是UIKit下的主要绘图系统,频繁的用于绘制自定义视图.Core Graphics是高度集成于UIView和其他UIKit部分的.Core Gr ...

  2. Collection子接口(List/Set/Queue/SortedSet)

    Collection基本的子接口: List:能够存放反复内容 Set:不能存放反复内容,全部反复的内容靠hashCode()和equals()两个方法区分 Queue:队列接口 SortedSet: ...

  3. java环境下的数据库读写分离

    方案很多:阿里的中间件cobar.aop注解方式.com.mysql.jdbc.ReplicationDriver读写分离驱动MySQL数据库的同步. MySQL是开源的关系型数据库系统.主从同步复制 ...

  4. shell 判断文件、目录是否存在

    shell判断文件是否存在   1. shell判断文件,目录是否存在或者具有权限 2. #!/bin/sh 3. 4. myPath="/var/log/httpd/" 5. m ...

  5. Winform Textbox实现滚动条始终在最下面

    在用textbox时,实现一些信息追加时,要使滚动条始终呆在最下面的实现方法. 以textbox1为例,事件TextChanged中执行以下代码即可 private void textBox1_Tex ...

  6. 【转】iOS实时卡顿监控

    转自http://www.tanhao.me/code/151113.html/ 在移动设备上开发软件,性能一直是我们最为关心的话题之一,我们作为程序员除了需要努力提高代码质量之外,及时发现和监控软件 ...

  7. ASP.NET-FineUI开发实践-9

    用了FineUI有一段时间了,还是分享下我咋改的吧,没想的那么难,我也是从小白来的. 基础是要懂JQ和EXTJS,主要是要懂JQ和EXTJS能干啥,这里有两个网站 http://www.w3schoo ...

  8. python 下的数据结构与算法---8:哈希一下【dict与set的实现】

    少年,不知道你好记不记得第三篇文章讲python内建数据结构的方法及其时间复杂度时里面关于dict与set的时间复杂度[为何访问元素为O(1)]原理我说后面讲吗?其实就是这篇文章讲啦. 目录: 一:H ...

  9. AppCanCSS背景图片的属性

    最近在用AppCan框架技术做跨平台移动应用开发,碰到界面布局设计中图片平铺.拉伸效果. 我们用到的是CSS 3中Background-size属性. 网上查了下这个属性,小记下: 取值: backg ...

  10. 关于数据库中varchar/nvarchar类型数据的获取注意事项

    当在页面后台获取数据库表中某字段的数据时,需注意该数据的类型.防止因实际数据的字符长度因达不到指定数据类型规定的字符长度而导致空格的占位符. 比如: MSSQL中某一表的结构如下:   表中的数据: ...