Redis

未匹配的标注

Redis

Yii2 框架的官方 yii2-redis 扩展为我们提供了 redis 键值(key-value)存储的支持,也包含了一个 CacheSession 存储处理器,并且实现了 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

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
zhuzixian520
讨论数量: 0
发起讨论 只看当前版本


暂无话题~