缓存配置
缓存操作使用的是入口文件里面配置的程序使用的缓存处理类,配置位于入口文件index.php里面,
在入口文件里面我们看到下面这个一行:
/**
* 配置缓存
* 1.setCacheHandle可以直接传入缓存配置数组。
* 2.setCacheHandle也可以传入配置文件名称,配置文件里面要返回一个缓存配置数组。
* 缓存配置数组可以参考缓存配置文件:application/config/default/cache.php里面return的数组。
* 3.如果这里不设置(保留注释),Sr::cache()默认使用的是文件缓存,缓存数据默认存储在application/storage/cache
*/
//->setCacheConfig('cache')
1.传入缓存配置数组
比如传入缓存配置数组$config,即->setCacheConfig($config),$config数组结构如下:
/**
* 缓存配置
*/
array(
'default_type' => 'file', //默认的缓存类型,值是下面drivers关联数组的键名称。
'drivers' => array(
//自定义缓存示例
'my_cache' => array(
'class' => 'Cache_MyCache', //缓存类名称
'config' => null//需要传递给缓存类构造方法的第一个参数,一般是配置信息数组,不需要就保持null
),
'file' => array(
'class' => 'Soter_Cache_File',
//缓存文件保存路径
'config' => Sr::config()->getPrimaryApplicationDir() . 'storage/cache/'
),
'memcache' => array(
'class' => 'Soter_Cache_Memcache',
'config' => array(//memcache服务器信息,支持多个
array("127.0.0.1", 11211),
//array("new.host.ip",11211),
)
),
'memcached' => array(
'class' => 'Soter_Cache_Memcached',
'config' => array(//memcached服务器信息,支持多个
array("127.0.0.1", 11211),
//array("new.host.ip",11211),
)
),
'apc' => array(
'class' => 'Soter_Cache_Apc',
'config' => NULL//apc缓存不需要配置信息,保持null即可
),
'redis' => array(
'class' => 'Soter_Cache_Redis',
'config' =>array(
//redis服务器信息,支持集群。
//原理是:读写的时候根据算法sprintf('%u',crc32($key))%count($nodeCount)
//把$key分散到下面不同的master服务器上,负载均衡,而且还支持单个key的主从负载均衡。
array(
'master' => array(
//sock,tcp;连接类型,tcp:使用host port连接,sock:本地sock文件连接
'type' => 'tcp',
//key的前缀,便于管理查看,在set和get的时候会自动加上和去除前缀,无前缀请保持null
'prefix' => null, //Sr::server('HTTP_HOST')
//type是sock的时候,需要在这里指定sock文件的完整路径
'sock' => '',
//type是tcp的时候,需要在这里指定host,port,password,timeout,retry
//主机地址
'host' => '127.0.0.1',
//端口
'port' => 6379,
//密码,如果没有,保持null
'password' => NULL,
//0意味着没有超时限制,单位秒
'timeout' => 3000,
//连接失败后的重试时间间隔,单位毫秒
'retry' => 100,
// 数据库序号,默认0, 参考 http://redis.io/commands/select
'db' => 0,
),
'slaves' => array(
array('type' => 'tcp','prefix' => null,'sock' => '','host' => '127.0.0.1','port' => 6380,'password' => NULL,'timeout' => 3000,'retry' => 100,'db' => 0,),
)
),
array(
'master' => array('type' => 'tcp','prefix' => null,'sock' => '','host' => '10.69.112.34','port' => 6379,'password' => NULL,'timeout' => 3000,'retry' => 100,'db' => 0,),
'slaves' => array()
),
)
),
);
观察上面配置数组,很容易发现drivers数组的键就是缓存类型名称,也就是我们要传递给Sr::cache()的类型名称,
我们也可以直接把drivers数组的键对应的值传递给Sr::cache()。
drivers数组的键对应的值是一个缓存类型的具体配置信息,用class指定缓存类名称,config指定配置信息,
Soter实例化缓存类的时候把config作为参数传递给构造方法。
看上面的配置我们可以发现Soter默认提供了五个缓存类:
1.Soter_Cache_File
2.Soter_Cache_Memcache
3.Soter_Cache_Memcached
4.Soter_Cache_Apc
5.Soter_Cache_Redis
Redis缓存配置示例:
1、如果只有一个redis那么只设置一个master即可,示例如下:
'redis' => array(
'class' => 'Soter_Cache_Redis',
'config' =>array(
array(
'master' => array('type' => 'tcp','prefix' => null,'sock' => '','host' => '127.0.0.1','port' => 6379,'password' => NULL,'timeout' => 3000,'retry' => 100,'db' => 0,),
'slaves' => array()
),
)
2、如果是主从那么设置一个master,一个或者多个slaves即可,示例如下:
'redis' => array(
'class' => 'Soter_Cache_Redis',
'config' =>array(
array(
'master' => array('type' => 'tcp','prefix' => null,'sock' => '','host' => '127.0.0.1','port' => 6379,'password' => NULL,'timeout' => 3000,'retry' => 100,'db' => 0,),
'slaves' => array(
array('type' => 'tcp','prefix' => null,'sock' => '','host' => '127.0.0.2','port' => 6379,'password' => NULL,'timeout' => 3000,'retry' => 100,'db' => 0,),
array('type' => 'tcp','prefix' => null,'sock' => '','host' => '127.0.0.3','port' => 6379,'password' => NULL,'timeout' => 3000,'retry' => 100,'db' => 0,)
)
),
)
3、如果是多个独立的master,分摊key的存储,那么配置多个master即可,配置示例如下:
'redis' => array(
'class' => 'Soter_Cache_Redis',
'config' =>array(
array(
'master' => array('type' => 'tcp','prefix' => null,'sock' => '','host' => '127.0.0.1','port' => 6379,'password' => NULL,'timeout' => 3000,'retry' => 100,'db' => 0,),
'slaves' => array(
array('type' => 'tcp','prefix' => null,'sock' => '','host' => '127.0.0.2','port' => 6379,'password' => NULL,'timeout' => 3000,'retry' => 100,'db' => 0,),
array('type' => 'tcp','prefix' => null,'sock' => '','host' => '127.0.0.3','port' => 6379,'password' => NULL,'timeout' => 3000,'retry' => 100,'db' => 0,)
)
),
array(
'master' => array('type' => 'tcp','prefix' => null,'sock' => '','host' => '127.0.0.4','port' => 6379,'password' => NULL,'timeout' => 3000,'retry' => 100,'db' => 0,),
'slaves' => array()
),
)
2.传入配置文件名称
传入配置文件名称时我们就可以做到不同环境下面自动使用不同的缓存类型。
比如:
本地开发环境使用文件缓存,产品环境使用redis缓存。
假设我们传入配置文件名称cache,即->setCacheConfig('cache')
a.development开发环境下使用的就是文件:config/development/cache.php
内容如下(为了方便展示,省略具体细节):
/**
* 缓存配置
*/
return array(
'default_type' => 'file', //默认的缓存类型,值是下面drivers关联数组的键名称。
'drivers' => array(
'file' => array(
...
),
'memcache' => array(
...
),
'memcached' => array(
...
),
'apc' => array(
...
),
'redis' => array(
...
)
),
)
);
可以看到development开发环境的配置里面我们default_type是file文件类型缓存。
那么我们使用Sr::cache()操作缓存数据,用的就是file文件类型缓存。
b.production产品环境下使用的就是文件:config/production/cache.php
文件:config/production/cache.php内容如下:
/**
* 缓存配置
*/
return array(
'default_type' => 'redis', //默认的缓存类型,值是下面drivers关联数组的键名称。
'drivers' => array(
'file' => array(
...
),
'memcache' => array(
...
),
'memcached' => array(
...
),
'apc' => array(
...
),
'redis' => array(
...
)
),
)
);
可以看到production产品环境的配置里面我们default_type是redis文件类型缓存。
那么我们使用Sr::cache()操作缓存数据,用的就是redis类型缓存。