当前位置:首页 > 问答 > 正文

缓存加Redis让TP框架跑得更快,性能提升真明显,试试看吧

最近在折腾一个用ThinkPHP(TP)框架开发的项目,刚开始访问量小还没啥感觉,后来用户慢慢多起来,就发现页面打开速度越来越慢,尤其是那些首页、商品列表页这种每个人都会点开看的页面,数据库的压力特别大,每次用户访问,TP框架都要去数据库里把数据查一遍,再组装成页面,搞得服务器CPU和数据库都嗷嗷叫,后来听一个朋友提到了用Redis做缓存,试了一下,效果真是立竿见影,页面打开速度“嗖”一下就上去了,下面我就把我怎么做的,用大白话分享一下,你要是也遇到同样的问题,真的可以试试看。

为啥要用Redis?它比文件缓存强在哪?

其实TP框架自己就带缓存功能,默认是文件缓存,就是把数据变成文件存在服务器的硬盘上,这招对付小网站还行,但人一多,问题就来了,你想啊,每次读缓存,服务器都得去硬盘里找那个文件,再读出来,硬盘读写速度跟内存比起来,那真是慢太多了,而且文件多了,管理起来也麻烦,找起来也慢。

Redis就不同了,它是个内存数据库,说白了,就是把数据直接放在服务器的内存里,内存的读写速度比硬盘快太多了,根本不是一个量级的,就像是你从桌子上拿一张纸(内存)和从一个大文件柜里翻找一个文件夹(硬盘)的区别,速度差老远了,用Redis做缓存,读取速度非常快,能极大地减轻数据库的压力。

我是怎么在TP框架里接上Redis的?

在TP框架里用Redis特别简单,根本不用大动干戈,TP已经帮我们封装好了,只需要改一下配置文件就行。

  1. 你得确保服务器上安装了Redis服务,这个就像安装MySQL数据库一样,需要先在服务器上装好Redis软件并启动它,这个步骤可以找运维同事帮忙,或者如果你用的是云服务器,很多服务商都提供一键安装。

  2. 修改TP项目的缓存配置文件,通常是 config/cache.php 这个文件,找到它,把里面的配置改一改:

    // 默认缓存驱动改成redis
    'default' => 'redis',
    // 配置redis连接参数
    'stores'  => [
        // 其他缓存配置...
        'redis'   =>  [
            'type'       => 'redis', // 类型就是redis
            'host'       => '127.0.0.1', // 你的Redis服务器IP,一般本机就是127.0.0.1
            'port'       => 6379, // Redis的端口,默认就是6379
            'password'   => '', // 如果你给Redis设置了密码,就填在这里,没设置就空着
            'select'     => 0, // 使用哪个Redis数据库,默认有16个,从0到15,一般用0就行
            'timeout'    => 0, // 连接超时时间
            'persistent' => false, // 是否使用长连接
            'prefix'     => 'tp_', // 缓存键的前缀,加上以防和其他应用冲突
        ],
    ],

    就这么简单,配置一下,TP框架就知道以后缓存数据要往Redis里存了。

具体怎么用?拿缓存文章列表举个栗子

光配置好还不行,关键是要在代码里用起来,我拿网站首页的文章列表举个例子,原来的代码可能是这样的:

public function index()
{
    // 每次请求都直接去数据库查
    $articleList = Db::name('article')->where('status', 1)->order('create_time', 'desc')->limit(10)->select();
    return view('index', ['list' => $articleList]);
}

这种写法,每来一个用户访问首页,数据库就要执行一次查询,如果首页访问量很大,比如一分钟有几百个人访问,数据库就要被查询几百次,肯定慢。

用了Redis缓存之后,我把它改成了这样:

public function index()
{
    // 先定义一个缓存的键名,唯一标识这份数据
    $cacheKey = 'home_article_list';
    // 尝试从Redis缓存中获取数据
    $articleList = Cache::get($cacheKey);
    // 如果缓存里没有数据(比如第一次访问,或者缓存过期了)
    if (empty($articleList)) {
        // 这才去数据库查询
        $articleList = Db::name('article')->where('status', 1)->order('create_time', 'desc')->limit(10)->select();
        // 把查询到的数据存入Redis缓存,设置过期时间为10分钟(600秒)
        Cache::set($cacheKey, $articleList, 600);
    }
    // 返回数据给视图
    return view('index', ['list' => $articleList]);
}

你看,这么一改,逻辑就变了,第一个用户访问的时候,缓存里是空的,所以会去数据库查,查完之后立刻把结果存到Redis里,在接下来的10分钟内,任何一个用户再来访问首页,代码直接从Redis内存里把数据拿出来返回,根本不用麻烦数据库了,只有等到10分钟缓存过期后,下一个用户访问时才会再次查询数据库并更新缓存。

用了之后效果怎么样?

效果非常明显!最直接的感受就是页面加载速度快了很多,原来首页完全打开可能要一两秒,用了Redis之后,基本上都是毫秒级响应,一点就开,服务器的CPU使用率和数据库的负载也肉眼可见地降下来了,因为绝大部分请求都被缓存拦截住了,数据库终于可以“喘口气”了。

需要注意的几个小地方

用缓存也不是一劳永逸的,有几个小问题要注意:

  1. 数据一致性问题:比如后台管理员更新了一篇文章,但前台缓存还是旧的数据,要等10分钟后过期了才会显示新的,解决办法是,在后台更新文章的时候,手动把 'home_article_list' 这个缓存删除掉(用 Cache::delete($cacheKey)),这样下次访问时自然就会重新加载最新数据。
  2. 缓存别乱用:不是所有数据都适合缓存,像一些实时性要求非常高的数据,比如用户余额、股票价格,或者一些很少被访问的冷门数据,就不太适合缓存。
  3. 内存别撑爆:Redis是内存数据库,服务器内存是有限的,不能无限制地往里存数据,要注意给缓存设置合理的过期时间,让不常用的数据自动失效,对于可能增长很快的数据(比如用户行为日志),一般也不适合用Redis缓存。

对于TP框架开发的网站来说,如果遇到性能瓶颈,尤其是数据库读取压力大的情况,用Redis做缓存是一个非常直接、有效且成本较低的优化手段,配置简单,效果显著,真心推荐你试试看,说不定会有惊喜!

缓存加Redis让TP框架跑得更快,性能提升真明显,试试看吧