标签:memcached redis cassandra nosql
本篇文章共分为四个章节,会陆续整理下 Memcached、Redis、tair、mongodb、hbase、SequoiaDB、 Cassandra的相关知识。 本文为第一个章节,先简介下memcached、reids,有理解不到位的地方,请不吝赐教。
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) 服务端的连接管理基于libevent 异步事件引擎,能在能在Linux、BSD、Solaris等操作系统上发挥其高性能。能支撑高并发的请求。
(2) 数据不能持久化,常用作数据的加速缓冲。
(3) 通讯协议简单,客户端丰富(C/C++、PHP、Java、Python、Ruby、Perl、Windows/.NET、MySQL、PostgreSQL、Erlang、Lua、Lisp dialects等)
性能这块官方文档这么说: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是一个支持丰富数据结构的类似memcached的KV分布式存储系统。其开发工作由Redis的开发工作由VMware主持。
(1) 数据存储到内存,并通过配置也可以持久化到磁盘。如果仅存储在内存,则其功能和Memcached类似;而持久化到磁盘则可以保证数据即使因为掉电也不会丢失,目前支持的持久化方式如下两种:RDB持久化方式和AOF持久化方式。
RDB持久化方式: 在指定的时间间隔能对你的数据进行快照存储.
AOF持久化方式:则是以与更新命令同步追加的方式实时更新数据文件。
根据以上两种持久化策略可以看出,RDB定时快照的方式在遇到掉电等突发情况下,会丢失当前和最近一次快照时间间隔内的操作数据。而AOF持久化方式通过后台线程fsync的方式通过内存出具和磁盘数据,因为是异步,也会丢失一定的数据,但是因为设置的fsync的策略不同,丢失的数据会很少,同时性能较比RDB也会差一些。
Redis是一个使用客户端/服务器模型(也被称作请求/响应协议)的TCP服务器:
Redis集群结点间的协议采用的是二进制协议(binary protocol)
客户端与集群通信采用的是文本协议(ascii protocol)
在最新的3.0版本的Redis中,新增了集群部署的结构,集群各个节点可以通过gossip协议进行数据同步。
而3.0以前的版本测试采用Redis Sentinel利用单双MS的结构来管理集群。
集群结点间通信采用gossip协议。
(1) 具有157个操作命令
(2) 支持管道(一次发送多个命令)
(3) 支持消息Pub/sub 机制。
(4) 批量操作的事物机制。
Redis的benchmark,从测试结果来看,单纯的get/set命令可以达到10w+每秒,而pipeline的批量执行命令,已经达到了50w+的水准。其性能和memcached相比一点都不差。
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:memcached redis cassandra nosql
原文地址:http://blog.csdn.net/lantian0802/article/details/46662939