<commit_before>Cache
=====

缓存数据管理,可设定Memcached,Redis,APC,文件等作为缓存驱动

案例
----

### 设置和获取缓存

```php
// 设置缓存,返回true
widget()->cache('key', 'value');

// 获取缓存,返回'value'
widget()->cache('key');
```

### 设置60秒后就过期的缓存

```php
widget()->cache('key', 'value', 60);
```

### 配置缓存驱动为`Redis`

```php

// 配置缓存驱动为`redis`,同时配置redis的服务器地址
widget(array(
	'cache' => array(
		'driver' => 'redis'
	),
	'redis' => array(
		'host' => '127.0.0.1',
	)
));

// 获取缓存对象
$cache = widget()->cache;

// 输出缓存驱动, 输出为`redis`
echo $cache->getDriver();
```

### 缓存数据库查询,如缓存用户总数,每30秒更新一次

```php
$totalUsers = widget()->cache->get('totalUsers', 30, function($widget){
	return $widget->db->fetchColumn("SELECT COUNT(1) FROM user");
});
```

### 将缓存作为计数器,记录文章访问次数

```php
$cache = widget()->cache;

// 设置文章访问次数增加1,返回增加后的总次数
// 注意: 开发人员无需预先判断该键名的缓存是否存在,如果缓存不存在,将自动从0开始计算
$hits = $cache->inc('article-1', 1);

echo '该文章已被访问' . $hits . '次';
```

### 批量设置和获取缓存

**注意:** 目前只有`redis`和`couchbase`支持原生的批量设置,其他的缓存实际都是通过`foreach`语句逐个设置.

```php
$cache = widget()->cache;

// 批量设置缓存
$result = $cache->setMulti(array(
	'array' 	=> array(),
	'bool'		=> true,
	'float'		=> 1.2,
	'int'		=> 1,<commit_msg>added example that using key prefix to avoid cache data conflict<commit_after>Cache
=====

缓存数据管理,可设定Memcached,Redis,APC,文件等作为缓存驱动

案例
----

### 设置和获取缓存

```php
// 设置缓存,返回true
widget()->cache('key', 'value');

// 获取缓存,返回'value'
widget()->cache('key');
```

### 设置60秒后就过期的缓存

```php
widget()->cache('key', 'value', 60);
```

### 配置缓存驱动为`Redis`

```php

// 配置缓存驱动为`redis`,同时配置redis的服务器地址
widget(array(
	'cache' => array(
		'driver' => 'redis'
	),
	'redis' => array(
		'host' => '127.0.0.1',
	)
));

// 获取缓存对象
$cache = widget()->cache;

// 输出缓存驱动, 输出为`redis`
echo $cache->getDriver();
```

### 缓存数据库查询,如缓存用户总数,每30秒更新一次

```php
$totalUsers = widget()->cache->get('totalUsers', 30, function($widget){
	return $widget->db->fetchColumn("SELECT COUNT(1) FROM user");
});
```

### 将缓存作为计数器,记录文章访问次数

```php
$cache = widget()->cache;

// 设置文章访问次数增加1,返回增加后的总次数
// 注意: 开发人员无需预先判断该键名的缓存是否存在,如果缓存不存在,将自动从0开始计算
$hits = $cache->inc('article-1', 1);

echo '该文章已被访问' . $hits . '次';
```

### 使用缓存前缀来避免缓存名称冲突

有些时候,我们会共享同一个memcched服务,共享同一个APC,这时可以通过设置缓存名称前缀,避免数据冲突

```php
// 设置APC缓存的键名前缀
widget(array(
    'memcached' => array(
        'keyPrefix' => 'project-'
    )
));

// 缓存键名将自动转换为'project-key'
widget()->memcached->set('key', 'value');
```

### 批量设置和获取缓存

**注意:** 目前只有`redis`和`couchbase`支持原生的批量设置,其他的缓存实际都是通过`foreach`语句逐个设置.

```php
$cache = widget()->cache;

// 批量设置缓存
$result = $cache->setMulti(array(
	'array' 	=> array(),
	'bool'		=> true,
	'float'		=> 1.2,
	'int'		=> 1,
{'fraction_non_alphanumeric': 0.2433052792654935, 'fraction_numerical': 0.016832440703902066, 'mean_word_length': 4.798226164079822, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 49, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 2, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '202046', 'n_tokens_mistral': 1507, 'n_tokens_neox': 1597, 'n_words': 173}