Yii2-Redis使用小記 - Cache

來源:互聯網
上載者:User

Yii2-Redis使用小記 - Cache

前些天簡單學習了下 Redis,現在準備在項目上使用它了。我們目前用的是 Yii2 架構,在官網搜尋了下 Redis,就發現了yii2-redis這擴充。

安裝後使用超簡單,開啟 common/config/main.php 檔案,修改如下。

文本
'cache' => [    // 'class' => 'yii\caching\FileCache',    'class' => 'yii\redis\Cache',],'redis' => [    'class' => 'yii\redis\Connection',    'hostname' => 'localhost',    'port' => 6379,    'database' => 0,],
'cache' => [    // 'class' => 'yii\caching\FileCache',    'class' => 'yii\redis\Cache',],'redis' => [    'class' => 'yii\redis\Connection',    'hostname' => 'localhost',    'port' => 6379,    'database' => 0,],

OK,現在已經用 redis 接管了yii的緩衝,緩衝的使用和以前一樣,以前怎麼用現在還是怎麼用,但是有個不算bug的bug,所以算小坑,等會會說。

來測試下 cache 先,

文本
Yii::$app->cache->set('test', 'hehe..');echo Yii::$app->cache->get('test'), "\n";Yii::$app->cache->set('test1', 'haha..', 5);echo '1 ', Yii::$app->cache->get('test1'), "\n";sleep(6);echo '2 ', Yii::$app->cache->get('test1'), "\n";
Yii::$app->cache->set('test', 'hehe..');echo Yii::$app->cache->get('test'), "\n";Yii::$app->cache->set('test1', 'haha..', 5);echo '1 ', Yii::$app->cache->get('test1'), "\n";sleep(6);echo '2 ', Yii::$app->cache->get('test1'), "\n";

來看下測試結果。

和原來一樣的用法,沒問題。。

但是剛才我說過了有個不算bug的bug,所以算小坑,到底是什麼東西呢?
如果你直接用 redis 接管了 cache,如果正常使用是完全沒問題的,但是當 到期時間 的值超過 int 範圍的時候,redis就會報錯。
我使用了 yii2-admin,湊巧讓我踩到坑了,因為他緩衝了30天,也就是2592000秒,並且 redis 緩衝時間精度預設用毫秒,所以時間就是 2592000000 毫秒。
而 redis 的到期時間只能是int類型,Cache.php 裡的 php 強制轉為int,而沒有做其他處理,所以就會變成 -1702967296 然後就報錯了。

但是直接在 redis 命令列下不會負數,。

不過沒關係,修複起來也很簡單,我們修改為秒即可。
開啟 vendor/yiisoft/yii2-redis/Cache.php 第 133 行,修改為如下代碼。

文本
protected function setValue($key, $value, $expire){    if ($expire == 0) {        return (bool) $this->redis->executeCommand('SET', [$key, $value]);    } else {        // $expire = (int) ($expire * 1000); // 單位預設為毫秒        // return (bool) $this->redis->executeCommand('SET', [$key, $value, 'PX', $expire]);        $expire = +$expire > 0 ? $expire : 0; // 防止負數        return (bool) $this->redis->executeCommand('SET', [$key, $value, 'EX', $expire]); // 按秒緩衝    }}
protected function setValue($key, $value, $expire){    if ($expire == 0) {        return (bool) $this->redis->executeCommand('SET', [$key, $value]);    } else {        // $expire = (int) ($expire * 1000); // 單位預設為毫秒        // return (bool) $this->redis->executeCommand('SET', [$key, $value, 'PX', $expire]);        $expire = +$expire > 0 ? $expire : 0; // 防止負數        return (bool) $this->redis->executeCommand('SET', [$key, $value, 'EX', $expire]); // 按秒緩衝    }}


這樣就OK了。

好了,今天分享這些。

在Yii2中使用Pjax導致Yii2內聯指令碼載入失敗的問題

Yii2 實現修改密碼功能

Yii 使用者登陸機制 

Yii中引入js和css檔案 

Yii 不完全解決方案 

Yii CGridView 基本使用

Yii架構分布式緩衝的實現方案

Yii 的詳細介紹:請點這裡
Yii 的:請點這裡

本文永久更新連結地址:

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.