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

用TP框架咋快速搞定Redis信息,省事又方便你试试

行,直接用ThinkPHP搞Redis,确实有那种“省事又方便”的路子,你别看Redis听起来像个高大上的东西,在TP框架里,它其实就是个藏在后台的“万能小本本”,你往里存东西、取东西,比操作数据库简单多了,咱不扯那些复杂的概念,就说说怎么快速上手,把活儿干完。

第一步:先把Redis这个“工具”拿到手

ThinkPHP框架自己不带Redis,但它提供了一个超级好用的门面(就是个快捷方式)叫Cache,你得先确保你服务器上已经安装了Redis服务,就像你要用微波炉,得先插上电一样,在你的项目里,通过Composer安装Redis的PHP扩展,打开命令行,到你项目的根目录,输入:composer require topthink/think-redis,这个命令就是从ThinkPHP的官方GitHub仓库(来源:ThinkPHP官方GitHub仓库)把连接Redis的驱动拉下来,等它噼里啪啦执行完,工具就算备好了。

第二步:告诉TP框架:“喂,我要用Redis了!”

光有工具还不行,你得告诉框架怎么用,这个配置写在项目的 config 目录下的 cache.php 文件里,你用编辑器打开这个文件,会看到里面已经有了一些设置,你需要关注的是 defaultstores 部分。

找到 stores 数组,里面应该已经有一个叫 redis 的配置项,如果没有,你就自己加一个,它大概长这样:

'redis' => [
    'type' => 'redis',
    'host' => '127.0.0.1', // 你Redis服务器的IP,本地就是127.0.0.1
    'port' => 6379, // 端口,默认一般是6379
    'password' => '', // 密码,如果你设了密码就填上,没设就是空字符串
    'select' => 0, // 选择哪个数据库,Redis默认有16个库,从0到15
    'timeout' => 0, // 超时时间,0就是不超时
    'persistent' => false, // 是否使用长连接
],

(来源:ThinkPHP官方文档关于缓存配置的说明)

你把 default 的值改成 redis,就像这样:'default' => 'redis',这意思就是,框架默认的缓存方式就使用Redis了,这下,框架就知道你要用它来当“小本本”了。

第三步:开搞!存、取、删、清空

用TP框架咋快速搞定Redis信息,省事又方便你试试

配置好了,用起来就简单得跟喝水一样,ThinkPHP提供了一个叫 Cache 的助手函数(也叫门面),几个常用的方法就能搞定大部分需求。

  1. 存数据(Cache::set):这是最常用的,用户登录后,你把他的信息存到Redis里,设置个10分钟过期。

    use think\facade\Cache;
    // 存一个简单的值
    Cache::set('user_name', '张三', 600); // 键是user_name,值是张三,600秒后过期
    // 存一个数组也行,框架会自动帮你序列化(就是转换成字符串存进去)
    $userInfo = ['id' => 1, 'name' => '李四', 'email' => 'lisi@example.com'];
    Cache::set('user_info_1', $userInfo, 3600); // 存一个小时

    这比你往数据库里插一条记录快多了,而且Redis读写速度极快。

  2. 取数据(Cache::get):存进去就是为了取出来用的。

    $name = Cache::get('user_name');
    if ($name) {
        echo "欢迎回来," . $name;
    } else {
        echo "用户信息不存在或已过期";
    }
    $info = Cache::get('user_info_1');
    if ($info) {
        // $info 直接就是数组,可以直接用
        echo $info['email'];
    }
  3. 删数据(Cache::delete):比如用户修改了信息,或者注销登录了,你就得把旧数据清掉。

    用TP框架咋快速搞定Redis信息,省事又方便你试试

    // 删除单个
    Cache::delete('user_name');
    // 删除多个,传数组
    Cache::delete(['user_name', 'user_info_1']);
  4. 清空所有缓存(Cache::clear):这个要小心用!一下就把Redis里这个数据库(就是你前面select配置的那个)的所有用TP框架存的缓存都清空了,一般在项目大更新或者测试的时候用。

    Cache::clear();
  5. 其他好用的小功能

    • 记得住就取,记不住就存(Cache::remember):这个特别省事,比如你要查一个复杂的排行榜数据,计算起来很耗时间,你可以用这个方法,它先看看Redis里有没有这个排行榜,如果有就直接返回;如果没有,就去执行你写的那个复杂的计算函数,然后把结果存到Redis里,再返回给你,一举两得。
      $hotList = Cache::remember('hot_post_list', function(){
          // 这里是模拟一个很耗时的数据库查询
          return Db::name('post')->order('views', 'desc')->limit(10)->select();
      }, 3600); // 缓存一小时
    • 判断存不存在(Cache::has):有时候你想先判断一下再决定干嘛。
      if (Cache::has('user_token')) {
          // 执行某些操作
      }

啥时候用这个“小本本”最划算?

你别什么都往Redis里塞,它虽然快,但内存是有限的,下面这些场景用起来特别爽:

  • 会话管理(Session):用户登录状态存Redis,比存文件或数据库快得多,尤其是在集群部署时,所有服务器都能读到同一个Session。
  • 频繁访问但又不常变的数据:比如网站的分类列表、配置项、热门文章榜,从数据库查一次扔Redis里,后面全从Redis读,数据库压力瞬间小很多。
  • 缓存查询结果:就像上面 remember 的例子,复杂的SQL查询结果缓存一下,页面打开速度嗖嗖的。
  • 简单的队列:虽然专业的队列用RabbitMQ、Kafka更好,但如果需求不复杂,比如只是发个邮件通知,可以用Redis的列表结构简单实现个队列,TP框架也支持。

最后提醒一句

用完Redis,别忘了它是在内存里的,所以你重启Redis服务,或者服务器断电,里面的数据就全没了(除非你配置了持久化),它叫“缓存”,意思是“丢了也能从数据库再来的数据”,千万别把最重要的、绝对不能丢的核心数据只放在Redis里。

在ThinkPHP里用Redis,你就把它当成一个速度超快的、简单的键值对字典来用。Cache::setCache::get 这两个方法能解决你80%的问题,remember 方法能再帮你省掉不少判断代码,这样一套组合拳打下来,搞点缓存提升性能,确实省事又方便,你试试,就知道有多爽了。