taoCMS是基于php+sqlite/mysql的国内最小(100Kb左右)的功能完善的CMS管理系统

浅谈分布式存储的路由设置

2011-01-16

原文地址:http://blog.leezhong.com/tech/2010/12/14/distributed-storage-route.html

膜拜原创作者之.....

程序设计中很重要的一个思想是:隔离变化的部分。在开发之前就应该想到哪些部分在不远的将来是可能会变的或一定会变的,开发时,就应该将这些部分隔离出来,同时可以优雅地进行控制。

对于大数据量高并发的网站,存储经常会有变动:添加/移除数据库服务器、分表分库、添加/移除缓存服务器、添加/移除文件存储服务器等等。怎样才能在这些存储设施调整后,代码上只要进行局部的修改就行了,这就是本文要探讨的主题:分布式存储的路由设置。

文件存储路由

平时我们操作文件时,一般都会用file_put_contents/file_get_contents/fopen之类的文件操作函数,这就需要给出文件的路径,如

<?php
file_get_contents(dirname(__FILE__).DIRECTORY_SEPARATOR.'destfile.txt');
file_put_contents(dirname(__FILE__).DIRECTORY_SEPARATOR.'destfile.txt','hello world');

确实挺方便,但随着文件数的增多,需要对文件重新规划,如原来是’dir/abcd.txt’,要调整为’dir/ab /abcd.txt’。这时就只能去手动修改代码,结果很有可能改了这,忘了那。比如有些是通过file_put_contents方法;有些是通过 fopen方法;有些不需要调整,有些需要调整等等。

如果有文件路由机制,事情就好办了,看看下面的使用代码

<?php
$file=newFile(array(
'basepath'=>DATA_PATH.'file'.DIRECTORY_SEPARATOR,
));
$file->open('test.txt')->write('hello world')->execute();
echo$file->open('test.txt')->get()->execute();

实例化File类后,只需传入文件名,加上要执行的操作,最后execute()一下就行了,不必关心文件的存储状态。如果要重新调整文件的存储结构,对客户端是透明的,也就是说不用对代码进行任何调整。

调整的规则写在File类里

<?php
classFileextendsCore_File
{
/**
* 自定义文件存储规则,对使用者是透明的。
*/
protectedfunction_route()
{
// 将abcd.txt保存为ab/cd/abcd.txt
$pathinfo=pathinfo($this->_filename);
$extension=empty($pathinfo['extension'])?'':'.'.$pathinfo['extension'];
$fhn=md5($pathinfo['filename']);
$filepath=$this->_config['basepath'].$fhn[0].$fhn[1].DIRECTORY_SEPARATOR.$fhn[2].$fhn[3].DIRECTORY_SEPARATOR;
if(!is_dir($filepath))
{
mkdir($filepath,0777,true);
}
$this->_filename=$filepath.$fhn.$extension;
}
}

如果要改规则,只要修改_route方法就行了。

缓存路由

以memcached为例,可能会有多个memcached服务器,每个memcached服务器的职责可能还不一样,还可能经常变动。如果在代码 里强行指定连接某台memcached服务器,一旦变动,事情就麻烦了。这时可以做个memcached路由,如果业务逻辑或memcached服务器有 变,就在这个路由里做文章。

使用方式

<?php
$cache=newCache_Adapter_Memcache(array(
'servers'=>array(
'server1'=>array(
'host'=>'localhost',
'port'=>11211,
'persistent'=>false,
),
//array ('server2' => array(
// 'host' => '192.168.1.100',
// 'port' => 11211,
// 'persistent' => false,
//),
)
));

$cache->set('bar','foo');
echo$cache->get('bar');

自定义路由

<?php
classCache_Adapter_MemcacheextendsCore_Cache_Adapter_Memcache
{
/**
* 自定义规则,根据key来指定memcache服务器,如果不指定的话,memcache会自动从连接池中取一个连接。
*/
protectedfunction_route($key)
{
// demo
if(substr($key,0,4)=='sess')
{
$server1=$this->

类别:技术文章 | 阅读:155296 | 评论:0 | 标签:

想收藏或者和大家分享这篇好文章→

“浅谈分布式存储的路由设置”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

taoCMS发布taoCMS 3.0.2(最后更新21年03月15日),请大家速速升级,欢迎大家试用和提出您宝贵的意见建议。

捐助与联系

☟请使用新浪微博联系我☟

☟在github上follow我☟

标签云