先解释一下软件编程中常见的一些概念:
抽象先于具象。这个抽象并非虚无的抽象,而是指事物尚未分化为具象之前的那个前体存在。当那个前体存在分化成具象存在之后,前体存在就退化为背景,成为一种抽象。
结构是关联与互动的复合体。
接口是结构的耦合点。
架构是从无结构到有结构的过程。
重构是从旧结构到新结构的过程。
也就是说,结构是架构的结果,架构是结构化的过程。
常听人说语言是工具,这是错误的。语言不是工具,但它和工具都是大脑的延伸。语言是介于智力与工具之间的衔接物。
就好比,人类语言是人与人之间的沟通媒介,是人与工具之间的衔接物,而编程语言,不过是将人类语言换成了另外一种符号系统,故编程语言可以看成是人脑与电脑的沟通媒介。
世界万物,皆有层次性。
最开始只有程序员。架构师、项目经理、产品经理都是从程序员逐步分化出来的,架构师是项目最顶层的那个人,必须熟悉各个层次的需求,而不再仅仅是程序层面的。而凡高层次存在者,皆以对结构的调控与整合为其核心能力。这里的结构调整,涉及各个层次,比如人员结构,成本结构,技术结构,语言结构等等。即是说,复杂的工程项目架构不仅仅只是程序的架构,还会涉及人员、流程、管理等各层次的架构。
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,不用 Memcache 和 MongoDB?
##### 1.4 为什么使用Redis? - **高并发读写需求**:随着Web2.0网站的发展,数据库面临着每秒数万次读写请求的压力。Redis凭借其出色的内存存储方式,能够在不增加硬件成本的情况下大幅提升系统性能。 - **高容量...
windows中使用Redis 里面包含Redis在页面中的使用说明和dll的代码引用说明
Redis 使用教程详解 Redis 是一个高性能的 NoSQL 键值存储数据库,广泛应用于缓存、任务列表、网站访问统计数据、过期处理、应用排行榜、分布式集群架构中的 session 分离等领域。下面是 Redis 的详细使用教程。 ...
"Redis++使用说明,windows下编译Redis-Plus-Plus" 在这篇文章中,我们将详细介绍如何在Windows平台下编译Redis++,包括编译hiredis.lib和Win32_Interop.lib静态库文件的过程,然后安装Cmake并编译Redis++,最后...
8. **性能优化**: 为提高性能,可以使用`DatabaseAsync`接口进行异步操作,利用.NET的async/await特性。此外,合理设置连接池大小和超时时间,避免频繁创建和销毁连接。 9. **异常处理**: 使用Redis时,需要注意...
在代码中,使用`StackExchange.Redis`创建连接实例: ```csharp using StackExchange.Redis; var connection = ConnectionMultiplexer.Connect(ConfigurationManager.ConnectionStrings["RedisConnection"]....
在Delphi环境下使用Redis,开发者可以利用Redis的强大功能来存储和操作数据,提高应用程序的性能。Redis是一个开源的、基于内存的数据结构存储系统,它可以用作数据库、缓存和消息中间件,支持丰富的数据类型,如...
ASP.NET Core 使用 Redis 基于 StackExchange.Redis ASP.NET Core 是一个开源的、跨平台的框架,使用 C# 语言开发。Redis 是一个基于内存的数据存储系统,可以用来存储和处理大量数据。StackExchange.Redis 是一个...
"阿里巴巴Redis使用规范" 本文将详细介绍阿里巴巴28条Redis使用规范,涵盖了Redis性能优化、数据存储、安全、实例管理等方面的内容。 规范一:控制key的长度 为了避免Redis中的keys过长,阿里巴巴建议控制key的...
**标签关联:** "C#操作Redis Redis学习" 这两个标签进一步强调了我们将会探讨如何使用C#语言进行Redis的读写操作,并且对于初学者来说,这是一个很好的学习资源。 **文件名称列表:** "C#操作Redis" 这个文件名...
这将启动一个名为 redis 的容器,并将其端口 6379 映射到宿主机的端口 6379,同时将宿主机的 /media/redis/data 文件夹映射到容器中的 /data 文件夹,并将宿主机的 /media/redis/conf/redis.conf 文件映射到容器中的...
使用redis构建简单的社交网站使用redis构建简单的社交网站项目源码.zip使用redis构建简单的社交网站项目源码.zip使用redis构建简单的社交网站项目源码.zip使用redis构建简单的社交网站项目源码.zip使用redis构建简单...
4)应用场景广泛:常作为缓存使用,分布式锁、数据共享等 Redis 支持的数据类型有哪些?1)String(字符类型) 2)Hash(散列类型) 3)List(列表类型) 4)Set(集合类型) 5)SortedSet(有序集合类型,简称zset) 6)...
基于前后端分离的应用,无论是否使用Redis,都需要考虑如何进行数据的存储和缓存。下面我将分别介绍基于Redis和无Redis的两种版本的特点。 基于Redis的版本 特点 缓存处理:Redis作为内存数据库可以用来缓存频繁访问...
使用Redis存放Session RedisManager
在Qt应用中集成Redis,我们通常会使用第三方库如`QRedis`,这是一个基于Qt的Redis客户端库,它提供了一系列方便的API来操作Redis。首先,你需要将`QRedis`库添加到你的Qt项目中,可以通过配置项目文件.pro或使用...
在IT行业中,C++与Redis的结合使用是一个常见的实践,特别是在需要高性能数据存储和处理的场景下。Redis是一个开源的、基于内存的数据结构存储系统,它支持多种数据类型,如字符串、哈希、列表、集合、有序集合等,...
在Windows系统中使用Redis,虽然不如在Linux环境下常见,但也有多种方式来部署和管理。以下是一些关于"windows系统下的redis"的重要知识点: 1. **Redis的安装**: - Redis官方并未直接提供Windows版本,但可以...
1. 下载Redis:Redis通常为源码形式,但针对Windows,官方提供了一个预编译的二进制版本,如`Redis-x64-3.2.100.zip`。下载后,解压缩到你希望安装的目录。 2. 安装服务:运行`redis-server.exe`,配置你的Redis...