Redis
Redis
Yii2 框架的官方 yii2-redis
扩展为我们提供了 redis 键值(key-value)存储的支持,也包含了一个 Cache
和 Session
存储处理器,并且实现了 ActiveRecord
模式,允许你在 redis 中存储活动记录等各种功能。
安装
redis >= 2.6.12 版本,这个是该扩展所有部件正常工作所必需的条件。
安装此扩展的首选方式是通过 composer,命令如下:
composer require yiisoft/yii2-redis
或者在 composer.json
文件中的 require 部分增加以下内容:
"yiisoft/yii2-redis": "~2.0.0"
然后执行 composer install
命令即可。
应用组件配置
使用此扩展时,需要在你的应用程序配置中配置 yii\redis\Connection
类:
return [
//....
'components' => [
'redis' => [
'class' => 'yii\redis\Connection',
'hostname' => 'localhost',
'port' => 6379,
'database' => 0,
'username' => null, // 用户名
'password' => null, // 密码
// 当连接失败时,应该重试命令执行的次数
// 要求 yiisoft/yii2-redis >=2.0.7
'retries' => 1,
// ...
],
]
];
活动记录的使用
对于如何使用 Yii 的活动记录一般信息请参阅 指南。
定义一个 redis 活动记录类,你的记录类需要继承自 yii\redis\ActiveRecord
并且至少实现 attributes()
方法来定义记录的属性。一个没有指定默认值,默认为 id
的主键可以通过 [[yii\redis\ActiveRecord::primaryKey()]] 定义。主键是属性中必要的一部分,所以请确保你有一个 id
属性定义的,如果你没有指定自己的主键。
以下是一个 Customer
的实例模型:
class Customer extends \yii\redis\ActiveRecord
{
/**
* @return array 此记录的属性列表
*/
public function attributes()
{
return ['id', 'name', 'address', 'registration_date'];
}
/**
* @return ActiveQuery 定义一个关联到 Order 的记录(可以在其它数据库中,例如 elasticsearch 或者 sql)
*/
public function getOrders()
{
return $this->hasMany(Order::className(), ['customer_id' => 'id']);
}
public static function find()
{
return new CustomerQuery(get_called_class());
}
}
class CustomerQuery extends \yii\redis\ActiveQuery
{
/**
* 定义一个修改 `$query` 的范围返回有效(status = 1)的客户。
*/
public function active()
{
return $this->andWhere(['status' => 1]);
}
}
redis 活动记录的一般用法和数据库活动记录非常相似,正如 指南 中所描述的。它支持相同的界面和功能,除了以下限制:
- 由于 redis 不支持 SQL 查询,因此查询 API 仅限于以下方法:
where()
,limit()
,offset()
,orderBy()
和indexBy()
。(orderBy() 尚未实现:#1305) - 由于 redis 中没有表,因此无法通过
via
表来定义关系。你只能通过其他记录来定义关系。
另外,也可以定义从 redis 的活动记录到普通的活动记录的关系,反之亦然。
使用实例:
$customer = new Customer();
$customer->attributes = ['name' => 'test'];
$customer->save();
echo $customer->id; // 如果没有明确设置 id 会自动递增
$customer = Customer::find()->where(['name' => 'test'])->one(); // 通过 query 查找
$customer = Customer::find()->active()->all(); // 通过 query 查找全部(使用 `active` 范围)
直接使用命令行
Redis 有很多可以直接从连接中使用的有用的命令。在配置应用程序后,如 安装 所示,连接可以像下面这样获取:
$redis = Yii::$app->redis;
完成之后可以执行如下命令。最通用的方法是使用 executeCommand
方法:
$result = $redis->executeCommand('hmset', ['test_collection', 'key1', 'val1', 'key2', 'val2']);
每个命令都有相应的快捷方式支持,所以可以像下面这样代替以上的命令:
$result = $redis->hmset(['test_collection', 'key1', 'val1', 'key2', 'val2']);
可用命令列表和他们的参数可参阅 redis.io/commands。
缓存组件的使用
为了使用 Cache
组件,如 安装 章节中所描述的,除了配置连接, 你也需要配置 [[yii\redis\Cache]] 中的 cache
组件:
return [
//....
'components' => [
// ...
'cache' => [
'class' => 'yii\redis\Cache',
],
]
];
如果你只使用 redis 缓存(即,不使用它的活动记录或者会话),您还可以配置缓存组件内的 连接参数(在这种情况下,不需要配置连接应用程序的组件):
return [
//....
'components' => [
// ...
'cache' => [
'class' => 'yii\redis\Cache',
'redis' => [
'hostname' => 'localhost',
'port' => 6379,
'database' => 0,
],
],
]
];
会话组件的使用
为了使用 Session
组件,如 安装 章节中所描述的,除了配置连接, 你也需要配置 yii\redis\Session
中的 session
组件:
return [
//....
'components' => [
// ...
'session' => [
'class' => 'yii\redis\Session',
],
]
];
如果你只使用 redis 会话(即,不使用它的活动记录或者缓存),您还可以配置会话组件内的 连接参数(在这种情况下,不需要配置连接应用程序的组件):
return [
//....
'components' => [
// ...
'session' => [
'class' => 'yii\redis\Session',
'name' => 'advanced-api', // 当前的会话名称
'timeout' => 3600, // 过期被清理的秒数
'keyPrefix' => 'session:app:', // 缓存键的前缀字符串
'redis' => [
'class' => 'yii\redis\Connection',
'hostname' => 'localhost',
'port' => 6379,
'database' => 0,
],
// 会话cookie参数,可以用于同一级域名下的子域名项目之前共享 session
/*'cookieParams' => [
'path' => '/',
'httpOnly' => true,
'domain' => 'xxx.com',
'lifetime' => 3600,
],*/
],
]
];
💖喜欢本文档的,欢迎点赞、收藏、留言或转发,谢谢支持!
作者邮箱:zhuzixian520@126.com,github地址:github.com/zhuzixian520