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 的:請點這裡
本文永久更新連結地址: