Redis 最简单的用法就是直接存储字符串,Redis 写入和读取性能远高于 MySQL。所以我们经常使用 Redis 作为缓存层为 MySQL 数据库保驾护航。
![](https://box.kancloud.cn/db37547f8b271a76dad552992d00cfdd_532x388.jpg)
> Cache 方法默认使用的是文件缓存,需要自行去 config.php 配置文件中修改缓存存储方式
## 修改配置文件
默认配置\[文件缓存\]
~~~
'cache' => [
// 驱动方式
'type' => 'File',
// 缓存保存目录
'path' => CACHE_PATH,
// 缓存前缀
'prefix' => '',
// 缓存有效期 0表示永久缓存
'expire' => 0,
],
~~~
Redis 缓存配置
~~~
'cache' => [
// 驱动方式
'type' => 'Redis',
// 缓存前缀
'prefix' => '',
// 缓存有效期 0表示永久缓存
'expire' => 0,
// redis 主机
'host' => '127.0.0.1',
// redis 端口
'port' => 6379,
// redis 密码
'password' => '',
],
~~~
建议不使用缓存前缀,避免浪费内存空间。如果同一台服务器上的 Redis 实例同时存储多个项目的缓存,建议启动多个 Redis 实例,每个实例使用不同端口,存储不同项目的数据,避免操作阻塞影响其他项目的读取时间。
## 使用 ThinkPHP5 Cache类控制缓存代码
~~~
public function getUserData($user_id)
{
if (!$data = Cache::get("user:{$user_id}")) {
$data = Db::name('user')->where('id', $user_id)->find();
Cache::set('user:{$user_id}', $data);
}
return $data;
}
~~~
## 使用 PHP Redis 控制缓存代码
~~~
public function getUserData($user_id)
{
$redis = $this->redis;
if (!$data = $redis->get("user:{$user_id}")) {
$data = Db::name('user')->where('id', $user_id)->find();
$redis->set('user:{$user_id}', $data);
}
return $data;
}
~~~
首先查询缓存是否存在,如果存在直接返回缓存内容。不存在的话,取数据库读取内容后存入缓存中,下次就会直接从缓存中读取内容。
如果项目只是存储在 Redis 中,减轻 MySQL 压力。建议不要设置缓存时间,由手动控制更新缓存。
示例为查询时建立缓存,应该同时在创建数据和修改数据时也建立缓存。避免高并发下缓存没命中,导致流量瞬间进入 MySQL 查询。建议使用 ThinkPHP5 的模型事件`after_write`控制缓存的创建和更新。
本文示例直接使用字符串来存储缓存,实际项目中更多的是使用哈希或者列表来实现。