首頁  >  文章  >  後端開發  >  Yii2-Redis使用小記 - Cache

Yii2-Redis使用小記 - Cache

WBOY
WBOY原創
2016-08-08 09:19:521202瀏覽

前一天簡單學習了下 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,
],

OK,現在已經用redis 接管了yii的緩存,緩存的使用和以前一樣,以前怎麼用現在還是怎麼用,但是有個bugbug的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";

來看下測試結果。

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

但剛才我說過了有個不算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.php133 行,修改為下列程式碼。

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-redis 的 Connection 和 ActiveRecord 以及小坑。

以上就介紹了Yii2-Redis使用小記 - Cache,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn