Yii::$app->redis 一共包含哪些部分?
·
1. Yii::$app->redis 包含哪些部分?
想象一下,你在一家咖啡店:
- 你需要一个“共享储物柜”来存取文件(比如菜单),这个储物柜可以同时被前台(宿主机)和后厨(容器)访问。
- 在 Yii2 中,
Yii::$app->redis就像这个“共享储物柜”,用于与 Redis 数据库交互。
(1) 核心组成部分
-
Yii::$app:- 这是 Yii2 框架的全局应用对象,代表整个应用程序。
- 示例:
Yii::$app; // 获取全局应用对象
-
redis组件:redis是在config/web.php或config/main.php中配置的一个组件,用于与 Redis 数据库通信。- 示例配置:
'components' => [ 'redis' => [ 'class' => 'yii\redis\Connection', 'hostname' => 'localhost', 'port' => 6379, 'database' => 0, ], ],
-
Redis 客户端:
yii\redis\Connection是 Yii2 提供的 Redis 客户端类,封装了与 Redis 的交互方法。- 示例:
$redis = Yii::$app->redis;
-
核心方法:
Yii::$app->redis提供了一系列方法,如set、get、del等,用于操作 Redis 数据。- 示例:
Yii::$app->redis->set('key', 'value'); // 设置键值对 Yii::$app->redis->get('key'); // 获取键值 Yii::$app->redis->del('key'); // 删除键
-
连接池:
- Redis 组件支持连接池机制,确保高效管理 Redis 连接。
- 示例:
Yii::$app->redis->open(); // 打开连接 Yii::$app->redis->close(); // 关闭连接
2. 词法分析是什么?
词法分析是指将代码拆解为一个个“单词”或“符号”,并解析它们的含义。对于 Yii::$app->redis,词法分析的过程如下:
(1) 命令拆解
Yii::$app->redis;
Yii:Yii2 框架的全局命名空间。$app:Yii2 应用程序的核心对象。redis:从$app中获取的 Redis 组件实例。
(2) 参数解析
-
$app:- 表示当前运行的应用程序实例。
- 可以通过它访问所有已注册的组件。
-
redis:- 是在配置文件中定义的组件名称。
- 实际上是一个
yii\redis\Connection对象。
(3) 方法调用
set、get、del等方法:- 调用 Redis 客户端的方法,执行具体的 Redis 操作。
3. 使用场景是什么?
(1) 缓存管理
- 场景:使用 Redis 作为缓存存储,提高数据访问速度。
- 示例:
Yii::$app->redis->set('user:1', json_encode($userData)); $userData = json_decode(Yii::$app->redis->get('user:1'), true);
(2) 分布式锁
- 场景:在分布式系统中,多个进程需要协调访问共享资源。
- 示例:
$lockKey = "product_lock_{$productId}"; $lock = Yii::$app->redis->set($lockKey, 1, ['NX', 'EX' => 5]); if ($lock) { // 执行关键操作 Yii::$app->redis->del($lockKey); // 释放锁 }
(3) 消息队列
- 场景:使用 Redis 的列表或发布/订阅功能实现消息队列。
- 示例:
Yii::$app->redis->lpush('queue', json_encode($message)); $message = Yii::$app->redis->rpop('queue');
(4) 计数器
- 场景:使用 Redis 的原子操作实现计数器功能。
- 示例:
Yii::$app->redis->incr('page_views'); // 计数器加 1 $views = Yii::$app->redis->get('page_views');
(5) 会话存储
- 场景:将用户会话存储在 Redis 中,支持分布式部署。
- 示例:
Yii::$app->redis->set("session:{$sessionId}", $sessionData); $sessionData = Yii::$app->redis->get("session:{$sessionId}");
4. 底层原理是什么?
(1) Redis 客户端
yii\redis\Connection类:- 封装了 PHP 的 Redis 扩展(如
phpredis)或纯 PHP 实现的 Redis 客户端。 - 示例:
class Connection extends \yii\base\Component { public function set($key, $value, $options = []) { // 调用 Redis 的 SET 命令 } }
- 封装了 PHP 的 Redis 扩展(如
(2) Redis 协议
- RESP 协议:
- Redis 使用 RESP(REdis Serialization Protocol)协议进行通信。
- 示例:
*3\r\n$3\r\nSET\r\n$3\r\nkey\r\n$5\r\nvalue\r\n
(3) 单线程模型
- Redis 的单线程特性:
- Redis 是单线程的,所有操作按顺序执行,保证了原子性。
- 示例:
- 多个客户端同时调用
SET key value NX,只有一个客户端能成功。
- 多个客户端同时调用
(4) 高性能
- 内存存储:
- Redis 将数据存储在内存中,读写速度极快。
- 示例:
- 查询缓存时,Redis 的响应时间通常在微秒级别。
(5) 持久化机制
- RDB 和 AOF:
- Redis 支持两种持久化方式:
- RDB:定期生成数据快照。
- AOF:记录每个写操作的日志。
- 示例:
- 配置文件中启用 AOF:
appendonly yes
- 配置文件中启用 AOF:
- Redis 支持两种持久化方式:
5. 图示说明
(1) Yii2 与 Redis 的关系
+--------------------------+
| Yii2 应用 | (Yii::$app)
+--------------------------+
|
v
+--------------------------+
| Redis 组件 | (yii\redis\Connection)
+--------------------------+
|
v
+--------------------------+
| Redis 数据库 | (内存存储)
+--------------------------+
(2) Redis 客户端的工作流程
+--------------------------+
| Yii2 调用 Redis 方法 | (set/get/del)
+--------------------------+
|
v
+--------------------------+
| Redis 客户端发送命令 | (RESP 协议)
+--------------------------+
|
v
+--------------------------+
| Redis 数据库处理请求 | (单线程模型)
+--------------------------+
6. 总结
(1) 核心组成部分
Yii::$app:全局应用对象。redis组件:Redis 客户端实例。- 核心方法:
set、get、del等。 - 连接池:高效管理 Redis 连接。
(2) 词法分析
- 将代码拆解为关键词、变量和方法调用,并解析其含义。
(3) 使用场景
- 缓存管理。
- 分布式锁。
- 消息队列。
- 计数器。
- 会话存储。
(4) 底层原理
- Redis 客户端:封装 Redis 操作。
- Redis 协议:使用 RESP 协议通信。
- 单线程模型:保证操作的原子性。
- 高性能:基于内存存储。
- 持久化机制:支持 RDB 和 AOF。
更多推荐


所有评论(0)