前一天簡單學習了下 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.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]); // 按秒缓存 } }
這樣就OK了。
好了,今天分享這些,明後天會說下 yii2-redis 的 Connection 和 ActiveRecord 以及小坑。
以上就介紹了Yii2-Redis使用小記 - Cache,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。