Couchbase I
Couchbase第一印象(架构特性)
面向文档 保存的字节流总有一个 DOCUMENT ID(Object_ID)
高并发性,高灵活性,高拓展性,容错性好
面向文档的集群存储系统
每个文档用一个唯一的Doc ID
均衡负载
Buckets vs vBuckets
1. Buckets
couchbase的存储逻辑单元叫Bucket
每个bucket有个名字
couchbase 一个节点当前限制10及以下buckets
bucket 有两种类型 couchbase和memcached
bucket有可选的密码控权 SASL authentication
每个bucket有可控的内存配额和复制策略设定,独立可监控和管理
2. vBuckets
主要用来管理维护集群节点之间的bucket分布和路由
doc id的算法使分布式成为可能
Time To Live (TTL)
可用于控制过期时间(默认为一小时)
可用于seesion缓存等功能
后台管理过期,自动删除过期数据,释放内存和硬盘
数据一致性
并发性
Views, Indexs, Queries
Views
这里的views概念完全和SQL的view概念不同
views作为数据翻译转换层,将数据转换为特定格式结构的数据形式如JSON
views 通过 map/reduce功能完成, map将文档结构转换为表输出结构, reduce用来做计数,统计等聚集功能
indexes
每当views建立时, 就会建立indexes, index的更新和以往的数据库索引更新区别很大。 比如现在有1W数据,更新了200条,索引只需要更新200条,而不需要更新所有数据,map/reduce功能基于index的懒更新行为,大大得益。
建立views和index后可以用来Queries
用户用例
替代memcached的缓存层, 提供兼容memcached协议接口
Amazon S3类似服务
session
安装、管理 与客户端接口
三思而后行(安装初始化)
数据存储的路径
Couchbase数据需要持久化到硬盘,需要分配硬盘空间和路径,在Linux与Windows默认是couchbase安装路径
Server Quota(服务缓存层的内存分配)
Couchbase的数据会被缓存,服务层的缓存内存配额配置被各个节点所共享。 如是:现在有一个节点(Node)分配的是2G RAM,那么在加三个节点后,就增加6G RAM来还缓存数据了 ,故一共有8G RAM被分配用来缓存了。
Bucket Quota
集群可以用多个bucket,bucket用来保存一组特别数据或应用,如一个bucket用来做session,另一个bucket用来做做副本。bucket RAM quota的策略,对server quota设定是相辅相成的莲藕关系,很大程度影响cache的内存配额。
安装与管理
Memory Size
Replicas
默认bucket副本是3个。 index replica 开启选项 默认的选项,couchbase的策略比较灵活。只有当数据和节点足够多时,才会开始备份。
Flush
禁用或开启(默认禁用),用于清空bucket的数据
Auto-compaction
持久化的数据和view,index,长期会产生碎片,开启功能时,会自动整理硬盘数据碎片
客户端接口
-
> pip install couchbase
PHP
$servers = array("192.168.0.72:8091","127.0.0.1:8091");
foreach($servers as $server) {
$cb = new Couchbase($server, "", "", "default");
if ($cb) {
echo "Connected to $server";
break;
}
}
C
JAVA
基于面向文档的设计开发
Model
JSON
Number (either integer or floating-point).
Boolean
{'value' : true}
String
"hello world"
Array
[1, 4, 5]
Object
{ 'title' : 'google',
'url' : 'https://www.google.com/'
}
实体之间的关联
内嵌
{ 'author' : 'Matin',
'books' : [ {'title' : 'Refactor' , 'IBSN' : '485-566'},...]
}
外部文档,引用其docment id
{ 'author' : 'Matin',
'books' : [ 'AD3D63D6-2FE0-11E2-93F9-898688C79046_book',...]
}
事务
存储操作伊始
CURD
- add(id, document [, expiry]) Add an item if ID doesn’t already exist
- set(id, document [, expiry]) Store a document with ID
- replace(id, document [, expiry]) Update the document for an existing ID
- cas(id, document, check [, expiry]) Update the document for an existing ID providing the check matches
- get(id) :Get the specified document
- incr(id [, offset])Increment the document value by offset
- decr(id [, offset] Decrement the document value by offset
- append(id, value) Append the content to the end of the current document
- prepend(id, value) Prepend the content to the beginning of the current document
- delete(id) Delete the specified document
Document Indentifer
与Mongodb相比,Couchbase的存储方式为Key/Value,Value的类型很为单一, 不支持数组。另外也不会自动创建doc id, couchbase需要为每一docment指定一个用于存储的Document Indentifer。
为document创建标示符:
使用唯一的字段做标示符
如在session中,可以使用用户的email, username作为唯一标示符
对象与自增策略
单独创建一自增数据(Document Indentifer),如 add('user',0) 每次创建一个用户时,可以自增'user', 然后得到 'user:1233'等
使用uuid
标示符的命名规范与最佳实践
使用couchbase的bucket策略 自定义方式 (加前缀)
实践列举:
1. 网站访问量(PAGE VIW)
若我们需要用couchbase统计网站PV
那么命名如 'pv:index', 'pv:blog', 'pv:about'。
2. 用户朋友圈
为用户建立一个朋友圈
apend('user#1233','user#444,user#666,')
Time To Live (TTL)
常用来做cache,session,购物车使用,验证码等。ttl通过传入一个数字表示, couchbase会对数字作如下的判断:
小于30天(606024*30)的一秒为单位的数字,如600表示10分钟过期。
大于三十天的数字(秒),采用从公元开始的计数,如1381921696表示16th October 2013。
为0的表示永不过期。
保存数据
set和add都是原子性操作,是多线程环境安全的操作。
set(docid, docdata [, expiry])
set不存在docid数据时会创建,存在时替换存在的docid的内容。 过期设定expiry是可选的。
$cb->set('message', 'Hello World!');
$cb->set('message', 'Hello World!', 10); /*设定过期时限*/
if ($cb->set("spoon", "Hello World!", 10)) {
/*操作结果决断*/
echo "Message stored!";
}
add(docid, docdata [, expiry])
与set不同的是,如果docid内容存在时会,会更新失败。
$cb->add('message', 'Hello World!');
/*下面语句会失败*/
$cb->add('message', 'I pushed the button, but nothing happened!');
获取数据 get(docid)
单文档返回
在php中如果docid不存在会返回undef:
$message = $cb->get('message')
多文档返回 (Retrieving in Bulk)
不同库的多文档返回实现不同,多文档返回比单独返回要快,因为请求和响应有延迟。 php的会返回一个关联数组:
$ret = $cb->getMulti(array('recipe1','recipe2'));
更新数据 replace(id, document [, expiry])
在set,add后可以使用replace更新数据:
$message = $cb->get('message');
$message = $message . " How are you today?";
$cb->replace('message',$message);
并发更新 cas(id, document, check [, expiry])
在并发环境中,有必要保证并发更新
情景一:
1.A 获取了文档'樱花盛开'
2.B 也获取了文档'樱花盛开'
3.A 向文档加入信息并更新。
4.之后,B 也向文档修改并更新'樱花盛开'
这样A的努力完全被B给覆盖了
为了防止以上情况,需要使用cas功能做版本检查
情景 cas版:
1.音 获取了文档'樱花盛开'并加入自己的cas id
2.暧 也获取了文档'樱花盛开', 并加入自己的cas id
3.音 向文档做修改,并使用自己的cas id检查后成功更新。
4.之后,暧 也向文档修改并更新'樱花盛开'。使用自己的cas id检查后更新失败,因为 音已经更新了,使cas id不一样。
cas如是:检查要更新的文档是不是“原来的版本”(使用get换取的原本)。
$value = client->get("customer", NULL, $casvalue);
$response = client->cas($casvalue, "customer", "new string value");
cas的缺点是数据更新比起set要慢很多,做大量更新事务并发版本控制并非很完美。另外如果有用户使用set或replace操作不带cas,会使cas失效。
强制锁
cas虽有锁的一些性质,但不能防止期间有不带cas设置的set,replace打乱cas版本。故需要强锁 使用强制锁时,其他用户可以获取数据,但如果没有相应的cas是不能更新文档。
$article = $ai->getAndLock('樱花盛开', &$cas);
$article = '樱花飘落的速度是每秒五厘米哦';
# This will fail, because we are not supplying the CAS value
$ai->set('樱花盛开', $article);
# This will succeed and then unlock document
$ai->set('樱花盛开', $article, 0, $cas);
锁也可以设定过期时间,另外也可以释放锁:
$ai->unlock('recipe1',$cas);
艺术与文学同在(异步)
不同的客户端接口实现不同:
/*使用异步*/
$format_recipe = function($key, $value) {
return ('<li>' . $value['title'] . '</li>');
};
$ret = $cb->getDelayed(array('recipe1','recipe2'),0,$format_recipe);
/*单独迭代获取*/
$ret = $cb->getDelayed(array('recipe1','recipe2'),0,$format_recipe);
while ($ret = $cb->fetch()) {
echo('<li>' . $ret[value]['title'] . '</li>');
}
服务端更新 (Server-side Updates)
Increment And Decrement
用于页面访问量更新,数据统计等功能:
/*To increment by 1*/
$cb->set('counter',10);
$cb->increment('counter');
/*To increment by 10:*/
$cb->set('counter',10);
$cb->increment('counter', 10);
Append And Perpend
向文档首尾追加内容:
$user->set('userlist','martin,');
$user->append('userlist', 'stuart,');
$user->append('userlist', 'sharon,');
删除数据
当数据存在时,可以使用delete删除:
$cb->delete('message');
Couchbase I的更多相关文章
- Couchbase 环境搭建与使用(C#)
Couchbase Couchbase Server (前身是 Membase) 是一个分布式的面向文档的 NoSQL 数据库管理系统,该系统联合了 CouchDB 的简单和可靠以及 Memcache ...
- 由Memcached升级到 Couchbase的 Java 客户端的过程记录(三)
采用之前的源码运行后,我们发现 只有一个配置信息 即servers=127.0.0.1:11211,即 Couchbase Server的服务所在ip 和端口,此时数据直接存在 default 中 根 ...
- 由Memcached升级到 Couchbase的 Java 客户端的过程记录(二)
Shiro提供了类似于Spring的Cache抽象,即Shiro本身不实现Cache,但是对Cache进行了又抽象,方便更换不同的底层Cache实现. shiro对缓存的支持 shiro并没有实现缓存 ...
- 由Memcached升级到 Couchbase的 Java 客户端的过程记录(一)
背景: 在项目启动的选用了Memcached 作为缓存服务器,采用了Xmemcached作为客户端.在项目中使用了Shiro,为了给 Shiro 配置缓存的时候,采用了开源代码 https://g ...
- Couchbase的安装步骤
本指南将在几分钟内让你上手,探索关联APP,在命令行shell 中删除一些实例查询,并尝试查询工作台. 下载Couchbase Server 下载地址:http://www.couchbase.com ...
- PHP store session with couchbase
如何用couchbase存储session 有两种常见方式:1.采用memcache模式连接couchbase 只需两句修改: ini_set('session.save_handler', 'mem ...
- YCSB测试Mysql,MongoDB,TokuMX,Couchbase性能
测试是由同事完成的,这里只做收藏. 测试说明: 1.数据量为3kw记录,每条记录11个字段,一个为主键,主键为字符类型,类似:user****,后续为数值 其他10字段为字符类型,100字符,记录长度 ...
- Couchbase N1QL
Couchbase的 N1QL已经DP4了,在官方的文档中,Select * From like-table 这个like-table实际上指的是Couchbase中Bucket,那么对于早起版本Co ...
- C#调用Couchbase中的Memcached缓存
安装服务端 服务端下载地址:http://www.couchbase.com/download 选择适合自己的进行下载安装就可以了,我这里选择的是Win7 64. 服务端安装完后,如果成功了,那么在浏 ...
- 安装 Couchbase 服务器
一. 下载安装包 首先,到官网下载安装包:http://www.couchbase.com/ 下载的地址:http://www.couchbase.com/download 选择 Windows 的版 ...
随机推荐
- git push 使用教程
git push命令用于将本地分支的更新,推送到远程主机.它的格式与git pull命令相仿. $ git push <远程主机名> <本地分支名>:<远程分支名> ...
- python基础-字符串操作
输出高亮 语法: 显示方式.前景色.背景色至少一个存在即可. 显示方式:0(关闭所有效果),1(高亮),4(下划线),5(闪烁),7(反色),8(不可见). 前景色以3开头,背景色以4开头,具体颜 ...
- java 多线程的经验总结
什么是线程? 线程是操作系统所能运算调度的最小单元,包含于进程之中,作为进程的实际运作单位:线程与进程的区别,线程是进程的子集,一个进程可以有多个线程,每个线程并行执行不同的任务,不同的进程使用不同的 ...
- 【MFC】获取文件大小的方法
[转载]原文地址:http://blog.csdn.net/coderwu/article/details/5652056 MFC 下可以通过 CFileStatus 获取文件大小. ULONGLON ...
- 服网LNMP集群 w/ MySQL PaaS-1.0
平台: arm 类型: ARM 模板 软件包: haproxy linux mysql nginx application server arm basic software fuwang infra ...
- 新客户上云 - 来自 Azure 技术支持部门的忠告
本课程内容是来自 Azure 中国技术支持团队对新客户上云的忠告. 对于上云的新用户,Azure 技术支持部门有如下忠告: 1. 时刻关注并理解以下网站的变动来优化资源配置,更新设计方案. Azure ...
- jeesite应用实战(数据增删改查),认真读完后10分钟就能开发一个模块
jeesite配置指南(官方文档有坑,我把坑填了!)这篇文章里,我主要把jeesite官方给出的帮助文档的坑填了,按照里面的方法可以搭建起来jeesite的站点.系统可以运行以后,就可以进入开发模块了 ...
- Win7系统如何设置FTP详细过程
1.安装FTP组件 点击:控制面板—>程序和功能—>打开或关闭Windows功能.勾选“FTP服务器”及“FTP服务”“FTP扩展性”,点击“确定”,安装FTP组件. 2.添加FTP站点 ...
- hihocoder 第四十周 三分求极值
题目链接:http://hihocoder.com/contest/hiho40/problem/1 ,一道简单的三分. 题目是在直角坐标系中有一条抛物线y=ax^2+bx+c和一个点P(x,y),求 ...
- [VC]vc中socket编程步骤
sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW): 基于TCP的socket编程是采用的流式套接字.在这个 ...