NoSQL 数据库产品学习总结(一)

Nosql 数据库产品学习总结(一)

本篇文章共分为四个章节,会陆续整理下 Memcached、Redis、tair、mongodb、hbase、SequoiaDB、 Cassandra的相关知识。 本文为第一个章节,先简介下memcached、reids,有理解不到位的地方,请不吝赐教。

Memcached

1.简介

Memcached 是临时性建值存储的Nosql产品(官网:memcached.org),可以用它搭建一套高速的分布式缓冲系统,数据采用LRU算法存储在内存中,数据不会持久化到磁盘,即当内存掉电或内存空间不够,数据会全部释放或LRU部分释放。常被用来做像MysqL这类产品的前面的加速缓冲系统。产品由Danga Interactive公司研发,服务端部分是C写的,客户端部分只要实现Memcached的网络协议,理论上任何语言都可以。

2.数据存储

(1) memcached的内存单元,它的对应关系是:一个Slabclass包含多个slab,一个slab包含多个大小相等的chunk,真正存放memcached数据的最小单元item就放在chunk中。

Memcached 内存结构图:

参考:http://brionas.github.io/2014/01/06/memcached-manage/

(2) memcached的数据只会存储在内存中,并不会持久化到磁盘,内存撑满则启动LRU策略。

3.通讯协议

服务端进程采用TCP或UDP通道来链接Memcached的服务端和客户端,具体通信的内容在1.4版本以前仅支持普通的文本协议,1.4版本以后支持了高效的二进制协议。

4.部署结构

Memcached的单机部署方案很简单,单机启动后,在客户端通过TCP或UDP端口连接上来,然后就可以通过Memcached协议使用Memcached了。而集群部署方案,则是针对存在多台Memcached的场景,多台Memcached在通用的方案当中,他们彼此是独立,即互相不感知的。具体的数据Sharding逻辑全部封装在Memcached的客户端中。大致示意图如下:

存储一个KV:

读取一个KV:

由图可见数据的Sharding逻辑全部写在了客户端里面。

Repcached:

在memcached的解决方案中,分布的不同memcached结点彼此是不能通信的,要实现memcached结点的之间的Master/Slave结构,有一个日本同学开发了一个第三方的工具Recached,可以实现Memcached的主备结构。从结点可以实时的同步主结点的数据,当主节点挂掉,从结点可以热备的提供服务。

  1. 特性

(1) 服务端的连接管理基于libevent 异步事件引擎,能在能在Linux、BSD、Solaris等操作系统上发挥其高性能。能支撑高并发的请求。 @H_502_61@ (2) 数据不能持久化,常用作数据的加速缓冲。 @H_502_61@ (3) 通讯协议简单,客户端丰富(C/C++、PHP、Java、Python、Ruby、Perl、Windows/.NET、MysqL、Postgresql、Erlang、Lua、Lisp dialects等)

  1. 性能指标

性能这块官方文档这么说:On a fast machine with very high speed networking,memcached can easily handle 200,000+ requests per second. With heavy tuning or even faster hardware it can go many times that. Hitting it a few hundred times per second,even on a slow machine,usually isn’t cause for concern.

看来轻轻松松20W+的qps。

Redis

  1. 简介

Redis是一个支持丰富数据结构的类似memcached的KV分布式存储系统。其开发工作由Redis的开发工作由VMware主持。

  1. 数据存储

(1) 数据存储到内存,并通过配置也可以持久化到磁盘。如果仅存储在内存,则其功能和Memcached类似;而持久化到磁盘则可以保证数据即使因为掉电也不会丢失,目前支持的持久化方式如下两种:RDB持久化方式和AOF持久化方式。

RDB持久化方式: 在指定的时间间隔能对你的数据进行快照存储.
    AOF持久化方式:则是以与更新命令同步追加的方式实时更新数据文件

根据以上两种持久化策略可以看出,RDB定时快照的方式在遇到掉电等突发情况下,会丢失当前和最近一次快照时间间隔内的操作数据。而AOF持久化方式通过后台线程fsync的方式通过内存出具和磁盘数据,因为是异步,也会丢失一定的数据,但是因为设置的fsync的策略不同,丢失的数据会很少,同时性能较比RDB也会差一些。

  1. 通讯协议

Redis是一个使用客户端/服务器模型(也被称作请求/响应协议)的TCP服务器:

Redis集群结点间的协议采用的是二进制协议(binary protocol) @H_502_61@ 客户端与集群通信采用的是文本协议(ascii protocol)

  1. 部署结构

在最新的3.0版本的Redis中,新增了集群部署的结构,集群各个节点可以通过gossip协议进行数据同步。 @H_502_61@

而3.0以前的版本测试采用Redis Sentinel利用单双MS的结构来管理集群。

集群结点间通信采用gossip协议。

  1. 特性

(1) 具有157个操作命令 @H_502_61@ (2) 支持管道(一次发送多个命令) @H_502_61@ (3) 支持消息Pub/sub 机制。 @H_502_61@ (4) 批量操作的事物机制。

  1. 性能指标

Redis的benchmark,从测试结果来看,单纯的get/set命令可以达到10w+每秒,而pipeline的批量执行命令,已经达到了50w+的水准。其性能和memcached相比一点都不差。

相关文章

一、引言 学习redis 也有一段时间了,该接触的也差不多了。后来有一天,以前的同事问我,如何向redis中...
一、引言 上一篇文章,我介绍了如何在Linux系统上安装和配置MongoDB,其实都不是很难,不需要安装和编译...
一、介绍 Redis客户端使用RESP(Redis的序列化协议)协议与Redis的服务器端进行通信。 虽然该协议是专门...
一、引言 redis学了一段时间了,基本的东西都没问题了。从今天开始讲写一些redis和lua脚本的相关的东西...
一、介绍 今天继续redis-cli使用的介绍,上一篇文章写了一部分,写到第9个小节,今天就来完成第二部分。...
一、引言 上一篇文章我们已经介绍了MongoDB数据库的查询操作,但是并没有介绍全,随着自己的学习的深入...