Redis是一个基于内存的且支持持久化的key-value的NoSQL数据库, 通过持久化机制把内存中的数据同步到硬盘文件来保证数据持久化,当Redis重启后通过把硬盘文件重新加载到内存,以达到恢复数据的目的。因此Redis读取数据更快,并被普遍应用到 大型项目的高并发业务系统中。
在ShopWind系统中,我们已经集成了Redis组件(即:yii2-redis),yii2-redis 扩展为 Yii2 框架提供了 redis 键值存储支持。包括缓存(Cache)、会话存储处理(Session),并实现了 ActiveRecord 模式,允许您将活动记录存储在 redis 中。要启用Redis您需要:
1、先在服务器安装Redis服务,安装请参考《Redis 安装》,如果觉得手动安装麻烦,推荐Web服务器使用宝塔面板,宝塔提供一键安装Redis服务。也可以使用云端服务,如阿里云的【云数据库Redis】产品,配置好Redis服务之后,需要开放6379端口(或6380)及设置好白名单。
'components' => [
'redis' => [
'class' => 'yii\redis\Connection',
'hostname' => 'localhost',
'port' => 6379,
'database' => 0,
],
]
'components' => [
'redis' => [
'class' => 'yii\redis\Connection',
'hostname' => 'localhost',
'port' => 6380,
'database' => 0,
'useSSL' => true,
],
]
// 获取 redis 组件
$redis = Yii::$app->redis;
// 判断 key 为 cacheid 的是否有值,有则打印,没有则赋值
$key = 'cacheid';
if ($data = $redis->get($key)) {
print_r($data);
} else {
$redis->set($key, 'marko');
$redis->expire($key, 3600);
}
'components' => [
'cache' => [
// 'class' => 'yii\caching\FileCache',
'class' => 'yii\redis\Cache',
],
]
'components' => [
'cache' => [
// 'class' => 'yii\caching\FileCache',
'class' => 'yii\redis\Cache',
'redis' => [
'hostname' => 'localhost',
'port' => 6379, // 如果是SSL连接,请配置为6380
'database' => 0,
]
]
]
// 获取缓存对象
$cache = Yii::$app->cache;
// 读取缓存中的数据
$data = $cache->get($key);
// 保存数据到缓存
$cache->set($key, $data, 3600);
// 删除一个缓存
$cache->delete($key);
// 清除所有缓存
$cache->flush();
1、修改组件 session 的配置,指定 class 为 yii\redis\Session 即可,配置如下:
'components' => [
'session' => [
'name' => 'advanced-frontend',
'class' => 'yii\redis\Session'
]
]
'components' => [
'session' => [
'name' => 'advanced-backend',
'class' => 'yii\redis\Session'
]
]
$session = Yii::$app->session;
namespace common\models;
use Yii;
use yii\redis\ActiveRecord;
class CustomerModel extends ActiveRecord
{
/**
* 主键 默认为 id
*
* @return array|string[]
*/
public static function primaryKey()
{
return ['id'];
}
/**
* 模型对应记录的属性列表
*
* @return array
*/
public function attributes()
{
return ['id', 'name', 'age', 'phone', 'status'];
}
/**
* 定义和其它模型的关系
*
* @return \yii\db\ActiveQueryInterface
*/
public function getOrders()
{
return $this->hasMany(Order::className(), ['customer_id' => 'id']);
}
}
// 使用 AR 方式新增一条记录
$customer = new CustomerModel();
$customer->name = 'marko';
$customer->age = 18;
$customer->phone = 13888888888;
$customer->status = 1;
$customer->save();
echo $customer->id;
// 使用 AR 查询
$customer = CustomerModel::findOne($customer->id);
$customer = CustomerModel::find()->where(['status' => 1])->all();
1、由于 redis 不支持 sql,查询方法仅限于使用以下方法:where(),limit(),offset(), indexBy(),不支持 orderBy()
2、由于 redis 没有表的概念,因此不能通过表定义关联关系,只能通过其它记录来定义关系。