首先YII的框架包中并不含redis部分,需要自己配置和安装。
第一部分:Mac下YII框架的redis安装与配置
1.安装redis
方法一:
在没有安装YII的时候,可以通过修改composer的json文件实现修改安装的时候的配置。
在cmd(终端)使用,这个是通过composer进行安装。
php composer.phar require --prefer-dist yiisoft/yii2-redis
或者在composer.json文件里添加"yiisoft/yii2-redis": "~2.0.0”文件。在执行YII的安装配置。
方法二:
手动安装,先下载yii2.0-redis拓展的安装,把下载的拓展文件放到vendor/yiisoft下。确认命名:yii2-redis
修改vender/yiisoft/下的extensions.php,加入redis扩展
'yiisoft/yii2-redis' =>
array (
'name' => 'yiisoft/yii2-redis',
'version' => '2.2.0.0',
'alias' =>
array (
'@yii/redis' => $vendorDir . '/yiisoft/yii2-redis',
),
),
2.确认环境是否配置。
在终端执行redis-server尝试打开redis服务,如果看到类似:长方体图案和配置信息
表示redis已经成功安装并开启。如果没有这样的页面,需要安装下redis。
对于redis每次打开的操作,认为比较繁琐的时候,可以考虑直接将redis配置在PHP的插件中,这样可以直接在开启服务环境的时候同时开启redis.开启方式参考:http://www.yiichina.com/topic/6557。目前没有在php.ini中配置。
3.在YII中配置redis
一般和数据库配置在一起,在common的config中。main-local.php 中。
'redis' => [
'class' => 'yii\redis\Connection',
'hostname' => 'localhost',
'port' => 6379,
'database' => 0,
],
这里要注意一点,redis存在多个数据库,在database部分可以设置不同的数据库,对于没有该数据库的情况会自动创建。但是这里的数据库名字不可以是字符串,一般默认为0。可以根据自己的配置情况改为1,2,3....
4,redis的基本使用
public function actionIndex()
{
Yii::$app->redis->set('test','111'); //设置redis缓存
echo Yii::$app->redis->get('test'); //读取redis缓存
exit;
return $this->render('index');
}
第二部分:Yii的redis函数
以下是几个简单的小实例
1)设置键值
$source = Yii::$app->redis->set('var1','111');
当成功时会返回布尔值
$source = Yii::$app->redis->get('var1');
删除键
$source = Yii::$app->redis->del('var1');
获取键的值
$var2 = Yii::$app->redis->keys("*");
对于基本的命令都已转化为函数,可以直接通过redis调用到,这里注意下,在命令中每个参数都需要作为一个函数参数穿入。
以排序函数为例:
原命令:
sort DAILY:SCORE LIMIT 0 12 DESC
转化为YII的函数:
Yii::$app->redis->sort(‘DAILY:SCORE’, 'LIMIT', '0', '12','DESC');
原理:
yii\redis\Connection 支持的命令中找到以下注释:
所有的这些命令都会通过下面这个方法执行:
/**
* Allows issuing all supported commands via magic methods. *
* ```php * $redis->hmset(['test_collection', 'key1', 'val1', 'key2', 'val2']) * ``` *
* @param string $name name of the missing method to execute
* @param array $params method call arguments
* @return mixed
*/
public function __call($name, $params) {
$redisCommand = strtoupper(Inflector::camel2words($name, false));
if (in_array($redisCommand, $this->redisCommands)) {
return $this->executeCommand($name, $params);
}
else {
return parent::__call($name, $params);
}
}
public function executeCommand($name, $params = []) {
$this->open();
array_unshift($params, $name); $command = '*' . count($params) . "\r\n";
foreach ($params as $arg) {
$command .= '$' . mb_strlen($arg, '8bit') . "\r\n" . $arg . "\r\n";
}
\Yii::trace("Executing Redis Command: {$name}", __METHOD__);
fwrite($this->_socket, $command);
return $this->parseResponse(implode(' ', $params));
}