背景Redis和Couchbase都是基于内存的数据存储系统。在他们各自的官方描述中,Couchbase是一个高性能、高扩展、高可用的分布式缓存系统;Redis是一个开源的内存数据结构存储系统。Couchbase简介2012年2月,CouchOne与Membase合并,Couchbase开发了基于Membase和CouchDB的新产品。CouchBase是一个开源的、分布式的、面向文档的NoSQL数据库,主要应用于分布式缓存和数据存储领域。Membase是NoSQL家族的重量级新成员。它是一个键/值、持久、可扩展的解决方案,使用memcached有线协议。CouchOne支持CouchDB。CouchDB是一个提供端到端复制方法的文档数据库,这对于在不同位置移动和分布数据中心很有用。CouchBase可以通过管理缓存提供快速的亚毫米级k-v存储操作,并提供快速查询及其强大的查询引擎,可以指定类SQL查询。Couchbase是一种较新且发展迅速的nosql数据库技术。特点Couchbase是一个非关系型数据库,实际上是由couchdb+membase组成的,所以它既可以像couchdb一样存储json文档,又可以像membase一样高速存储键值对。它主要有以下特点:速度快:由于内存优先的高性能设计,所有的读写操作都直接对内存进行操作,所以速度非常快。高可用:主要从两个方面来说,一个是它有自己的集群方案,支持多副本模式,另一个是它有自己的持久化方案,可以设置定时异步向文件系统写入数据间隔。易于配置和使用:安装后自带web管理控制台,可以在管理控制台上对集群、桶、索引、搜索等进行管理和操作,大大减少了运维的工作量,简单易行使用。快速构建:Couchbase使开发人员能够构建可轻松扩展的响应迅速且灵活的云、移动和边缘计算应用程序。数据模型Couchbase数据模型基于JSON,支持数字、字符串等基本数据类型;和复杂类型,例如嵌入式文档和数组。单个文档通常表示应用程序代码中对象的单个实例。Document可以被认为等同于关系数据库中的一行;每个Document属性相当于一个列。然而,Couchbase提供了比关系数据库更大的灵活性,因为它可以存储具有不同模式的JSON文档。文档可以包含嵌套结构,这允许开发人员表达多对多关系而不需要引用或连接表。bucketsBuckets是couchbase中一种组织数据的方式,类似于关系型数据库中的databse,一个集群最多可以创建30个bucket。每个存储桶必须指定为以下三种类型之一。Couchbase存储桶:这些类型的数据永久存储在内存和磁盘中。它们允许使用DCP(数据库更改协议)自动复制数据以实现高可用性;通过XDCR(跨数据中心复制)跨多个集群动态扩展。临时存储桶:这是Couchbase存储桶的替代方案,可在不需要持久性时使用。数据只存在于内存中。Memcachedbuckets:只存储在内存中,遵循Memcached协议,现已弃用。同步协议DCP(DatabaseChangeProtocol),DCP协议是一种高效的二进制协议,主要用于集群中的数据复制、索引复制、备份数据等。主要概念如下:有序复制,基于每个vbucket,有一个顺序序号,同步时根据序号更新。重启恢复,同步连接中断时,重连后恢复冲突数据。一致性,使用快照数据同步数据一致性。内存之间复制。XDCR(CrossDataCenterReplication),XDCR提供多个有效vbuckets的数据复制,主要用于跨数据中心的多个集群之间的复制,可以跨版本复制。主要概念如下:基于桶复制,两个集群中的同一个桶可以实现单向或双向复制。通过DCP协议保持连续复制,一个XDCR连接包含多个DCP数据流。这些流可以根据不同的分区同步复制到目标集群。支持复制多个集群拓扑。集群之间可以使用单向和双向复制。多个集群可以实现1对1、1对多、多对1的集群复制拓扑图。安全复制。数据中心传输数据可以使用SSL加密。最终一致性和解决数据冲突的能力。当数据有冲突时,会使用元数据的序列值、CAS值、文档标签和有效期来解决数据冲突。ServiceCouchbase服务器提供以下服务:数据服务(dataservice):数据服务提供完全集成的内存缓存层,提供高速数据访问,支持key指定数据项的存储、设置和检索。查询服务(queryservice):类SQL查询语言获取结果,也可以发出数据定义(定义索引)和数据操作(增删数据)的查询。索引服务(Indexservice):创建索引供Analytics和Query使用。索引服务支持为存储在Couchbase集群中的项目创建主索引和二级索引。分析服务(Analysisservice):分析服务提供并行数据管理功能,允许运行复杂的分析查询,适用于数量大、运行时间长、资源消耗比较大的情况。搜索服务:搜索服务为集群数据提供全文索引和搜索引擎功能。事件服务:支持近乎实时的数据变化处理:代码可以响应文档变化或由计时器安排执行。备份服务:支持计划的完整和增量数据备份,可以针对特定的单个存储桶,也可以针对集群上的所有存储桶。Redis简介RemoteDIctionaryServer(Redis)是由SalvatoreSanfilippo编写的一个键值存储系统。是一个开源(BSD许可)内存数据存储系统,支持网络、内存、持久化日志类型、Key-Value数据库,提供多语言AP和丰富的数据结构,可作为数据库使用、缓存和消息中间件。并支持事务、发布订阅、lua脚本、lru驱动事件、过期机制、自动故障转移等多种功能。由于Redis是用ANSIC编写的,因此可以在大多数POSIX系统(如Linux、*BSD和OSX)在没有外部依赖的情况下运行。特点In-memorydatabase,速度快,还支持数据持久化,可以将内存中的数据保存到磁盘,重启时可以再次加载使用。Redis不仅支持简单的key-value类型数据,还提供list、set、zset、hash等数据结构的存储。Redis支持数据备份,即主从模式的数据备份。Redis的所有数据都存储在内存中,数据的更新异步保存到磁盘。功能丰富。除了支持五种数据结构外,还支持事务、管道、发布/订阅、消息队列等功能。(服务架构)支持高可用性和分布式。持久化redis提供了两种持久化方式,分别是RDB(RedisDataBase)和AOF(AppendOnlyFile)。RDB,简而言之,就是将存储在redis中的数据生成快照,在不同的时间点存储到磁盘等介质上。AOF是换个角度实现持久化,即记录redis执行的所有写指令。下次redis重启的时候,只要从前到后重复这些写指令,数据就可以实现了。恢复正常。其实RDB和AOF方式也可以同时使用。这种情况下,如果redis重启,会优先使用AOF方式进行数据恢复,因为AOF方式的数据恢复更完整。如果不需要数据持久化,也可以关闭RDB和AOF。这样一来,redis就会变成一个纯内存数据库,就像memcache一样。集群管理Redis在3.0版本之后开始支持集群。经过中间版本的不断更新和优化,最新版本已经具备了非常完善的集群功能。Redis集群是一个提供多个Redis节点间数据共享的程序。集群节点共同构建一个去中心化网络,集群中的每个节点具有平等的身份,每个节点保存自己的数据和集群状态。节点之间使用Gossip协议进行通信,保证节点状态信息的同步。Redis集群数据采用分区管理,每个节点保存集群数据的一个子集。数据以一种称为哈希槽的方式分配,这与传统的一致性哈希不同。Redis集群有16384个哈希槽。每个密钥通过CRC16校验后,它对16384取模以确定放置哪个插槽。为了使集群在部分节点失效或大部分节点无法通信的情况下仍然可用,集群采用了主从复制模型。读取数据时,根据一致性哈希算法从对应的主节点获取数据。如果master挂掉了,就会启动一个对应的slave节点充当master。在redis3.0之前的版本中,要实现集群,一般会使用sentinel工具来监控master节点的状态。如果master节点出现异常,则由master切换为slave,将某个slave作为master。sentinel的配置略显复杂,性能高可用等方面表现一般,尤其是在主从切换瞬间出现瞬时访问中断,sentinel只有一个master节点对外提供服务模式,不能支持高并发,单master节点的内存也不适合。如果设置过大,持久化文件会过大,影响数据恢复或主从同步的效率。小结其实Couchbase在处理大块数据或者说海量数据方面是优于Redis的。许多平台使用Couchbase来管理数千万的热点数据。因此,如果缓存在大多数情况下只需要提供数据的添加和查询操作,那么Couchbase基于文档的存储结构可以始终如一地提供亚毫秒级的查询体验。对于预定义的数据类型,你还可以创建索引来进一步优化性能,在这种情况下,Couchbase无疑是你更好的选择。Redis支持服务端数据操作:与Couchbase相比,Redis拥有更多的数据结构,支持更丰富的数据操作。通常,在Couchbase中,需要拿到数据给客户端做类似的修改,然后再设置回来。(需要先通过get方法从服务端读取数据文档,并将文档反序列化为json对象,然后修改json对象的相应属性,再通过set方法将数据写入服务端,以及序列化后存储)。这大大增加了网络IO的数量和传输的数据量。在Redis中,这些复杂的操作通常与普通的GET/SET一样高效。内存使用效率对比:如果采用简单的key-value存储,Couchbase的内存利用率更高,而Redis采用hash结构进行key-value存储。由于其联合压缩,其内存利用率会高于Couchbase。因此,如果缓存需要支持更复杂的数据结构和更频繁的数据的局部更新操作,那么Redis会是一个不错的选择。(这将在下面结合数据存储模型进行说明)。性能对比:由于Redis只使用单核,而Couchbase可以使用多核,平均而言,每个核上的Redis在存储小数据时的性能要高于Couchbase。在100k以上的数据中,Couchbase的性能要高于Redis。Redis虽然最近对存储大数据的性能进行了优化,但与Couchbase相比还是略逊一筹。
