# Niushop開源商城緩存設置
---
緩存支持采用驅動方式,所以緩存在使用之前,需要進行連接操作,也就是緩存初始化操作。
```php
$options =[
// 緩存類型為File
'type'=>'File', // 緩存有效期為永久有效
'expire'=>0, //緩存前綴
'prefix'=>'think',// 指定緩存目錄
'path'=> APP_PATH.'runtime/cache/',
];
Cache::connect($options);
```
或者通過定義配置參數的方式,在應用配置文件中添加:
```php
'cache'=>[
'type'=>'File',
'path'=>CACHE_PATH,
'prefix'=>'',
'expire'=>0,
],
```
**支持的緩存類型包括file、memcache、wincache、sqlite、redis和xcache,具體可以查看tinnkphp5手冊。**
緩存參數根據不同的緩存方式會有所區別,通用的緩存參數如下:
| 參數 | 描述 |
| :--- | :--- |
| type | 緩存類型 |
| expire | 緩存有效期 (默認為0 表示永久緩存) |
| prefix | 緩存前綴(默認為空) |
## 使用
緩存初始化之后,就可以進行相關緩存操作了。
> 如果通過配置文件方式定義緩存參數的話,可以無需手動進行緩存初始化操作,可以直接進行緩存讀取和設置等操作。
### 設置緩存
設置緩存(有效期一個小時)
```
Cache::set('name',$value,3600);
```
如果設置成功返回true,否則返回false。
緩存有效期支持指定過期時間,用法:
```
Cache::set('name',$value,newDateTime('2017-10-1 12:00'));
```
表示緩存數據到2017年10月1日中午12點過期。
### 緩存自增
針對數值類型的緩存數據,可以使用自增操作,例如:
```php
// name自增(步進值為1)
Cache::inc('name');// name自增(步進值為3)
Cache::inc('name',3);
```
### 緩存自減
針對數值類型的緩存數據,可以使用自減操作,例如:
```php
// name自減(步進值為1)
Cache::dec('name');// name自減(步進值為3)
Cache::dec('name',3);
```
### 獲取緩存
獲取緩存數據可以使用:
```php
dump(Cache::get('name'));
```
如果`name`值不存在,則默認返回`false`。
支持指定默認值,例如:
```php
dump(Cache::get('name',''));
```
表示如果`name`值不存在,則返回空字符串。
### 刪除緩存
```php
Cache::rm('name');
```
### 獲取并刪除緩存
```php
Cache::pull('name');
```
如果`name`值不存在,則返回`null`。
### 清空緩存
```php
Cache::clear();
```
### 不存在則寫入緩存數據后返回
```php
Cache::remember('name',function(){return time();});
```
### 獲取緩存對象
可以獲取緩存對象,并且調用驅動類的高級方法,例如:
```php
$cache =Cache::init();// 獲取緩存對象句柄
$handler = $cache->handler();
```
### 助手函數
系統對緩存操作提供了助手函數`cache`,用法如下:
```php
$options =[
// 緩存類型為File
'type'=>'File',
// 緩存有效期為永久有效
'expire'=>0,
// 指定緩存目錄
'path'=>APP_PATH .'runtime/cache/',
];
// 緩存初始化
// 不進行緩存初始化的話,默認使用配置文件中的緩存配置
cache($options);
// 設置緩存數據
cache('name', $value,3600);
// 獲取緩存數據
var_dump(cache('name'));
// 刪除緩存數據
cache('name', NULL);
// 設置緩存的同時并且進行參數設置
cache('test', $value, $options);
```
## 緩存標簽
支持給緩存數據打標簽,**niushop統一使用緩存標簽**例如:
```php
Cache::tag('tag')->set('name1','value1');
Cache::tag('tag')->set('name2','value2');
// 或者批量設置緩存標簽
Cache::set('name1','value1');
Cache::set('name2','value2');
Cache::tag('tag',['name1','name2']);
// 清除tag標簽的緩存數據
Cache::clear('tag');
//下面是niushop專用的寫法
/**
* 獲取文章列表,通過查詢緩存數據查詢檢測數據
*/
public function getArticleList($page_index = 1, $page_size = 0, $condition = [], $order = '')
{
$data = array( $page_index, $page_size, $condition, $order );
$data = json_encode($data);
$cache = Cache::tag("article")->get("getArticleList" . $data);
if (empty($cache)) {
$articleview = new NcCmsArticleViewModel();
//查詢該分類以及子分類下的文章列表
if (!empty($condition['nca.class_id'])) {
$article_class = new NcCmsArticleClassModel();
$article_class_array = $article_class->getQuery([
"class_id|pid" => $condition['nca.class_id']
], "class_id");
$new_article_class_array = array();
foreach ($article_class_array as $v) {
$new_article_class_array[] = $v["class_id"];
}
$condition["nca.class_id"] = array( "in", $new_article_class_array );
}
$list = $articleview->getViewList($page_index, $page_size, $condition, $order);
Cache::tag("article")->set("getArticleList" . $data, $list);
return $list;
} else {
return $cache;
}
}
//添加,修改,刪除的時候清除緩存
/**
* 添加文章
*/
public function addArticle($data)
{
Cache::clear("article");
$member = new Member();
$user_info = $member->getUserInfoDetail($data["uid"]);
$article = new NcCmsArticleModel();
$data["publisher_name"] = $user_info["user_name"];
$article->save($data);
$data['article_id'] = $article->article_id;
hook("articleSaveSuccess", $data);
$retval = $article->article_id;
return $retval;
}
/**
* 修改文章
*/
public function updateArticle($data)
{
Cache::clear("article");
$member = new Member();
$user_info = $member->getUserInfoDetail($this->uid);
$data["publisher_name"] = $user_info["user_name"];
$article = new NcCmsArticleModel();
$retval = $article->save($data, [ 'article_id' => $data["article_id"] ]);
$data['article_id'] = $data["article_id"];
hook("articleSaveSuccess", $data);
return $retval;
}
```
## 同時使用多個緩存類型
如果要同時使用多個緩存類型進行操作的話,可以做如下配置:
```
'cache'=>[
// 使用復合緩存類型
'type'=>
'complex',
// 默認使用的緩存
'default'=>[
// 驅動方式
'type'=>'File',
// 緩存保存目錄
'path'=> CACHE_PATH,],
// 文件緩存
'file'=>[
// 驅動方式
'type'=>'file',
// 設置不同的緩存保存目錄
'path'=> RUNTIME_PATH .'file/',
],
// redis緩存
'redis'=>[
// 驅動方式
'type'=>'redis',
// 服務器地址
'host'=>'127.0.0.1',
],
],
```
`cache.type`配置為complex之后,就可以緩存多個緩存類型和緩存配置,每個緩存配置的方法和之前一樣,并且你可以給相同類型的緩存類型(使用不同的緩存標識)配置不同的緩存配置參數。
當使用
```php
Cache::set('name','value');
Cache::get('name');
```
的時候,其實使用的是`default`緩存標識的緩存配置,如果需要切換到其它的緩存標識操作,可以使用:
```php
// 切換到file操作
Cache::store('file')->set('name','value');
Cache::get('name');
// 切換到redis操作
Cache::store('redis')->set('name','value');
Cache::get('name');
```
**系統的驅動類都支持單獨擴展,并且驅動文件的位置和命名空間可以隨意設置,包括緩存、日志、調試和數據庫驅動。**
**以緩存驅動為例,如果我們擴展了一個自己的`redis`驅動,類名為**
`app\driver\cache\Redis`,那么我們只需要設置緩存類型為:
```php
'cache'=>[
// 驅動方式
'type'=>'\app\driver\cache\Redis',
// 緩存前綴
'prefix'=>'',// 緩存有效期 0表示永久緩存
'expire'=>0,
],
```