Yii2: Redis as Database in Yii2

redisGara2 mbaca slide controversial yang membandingkan MongoDB vs Redis yang dimenangkan secara telak oleh Redis, saya jadi kepincut nyobain redis. http://www.redis.io

Btw, bentar, apa itu redis? bukankah itu berkaitan dengan cache? mengapa dibandingkan dengan mongodb yang jelas2 database. Nah ternyata saya salah, redis kedepan mungkin benar2 sebagai database tidak hanya cache, mengingat performanya yang menyilaukan mata.

Alhamdulillah super high performance PHP Framework, telah membuat class untuk menjembatani apa yang ingin saya lakukan.. Class ActiveRecord for Redis, wow!.. ini special..

Berhubung saya hanya pake windows 7 32bit maka inilah yang saya lakukan.

1) Install redist

https://cloud.github.com/downloads/rgl/redis/redis-2.4.6-setup-32-bit.exe

pake yang bawah ini gagal

https://codeload.github.com/MSOpenTech/redis/zip/win-2.8.19

2) Install redis client (redis manager)

http://redisdesktop.com/

3) Belajar bentar dari sini

http://try.redis.io/

saya ngikutin via RedisClient (Terminal atau cmd), work fine, bikin macem2 OK
4) Install yii2-redis
“yiisoft/yii2-redis”: “~2.0.0″
5) Config di Yii2 basic

'components' => [	
		'redis' => [
            'class' => 'yii\redis\Connection',
            'hostname' => 'localhost',
            'port' => 6379,
            'database' => 0,
        ],
		...

6) Create

<?php
namespace app\models;
class Employee extends \yii\redis\ActiveRecord
{
    public function attributes()
    {
        return ['id', 'name', 'gender', 'address', 'status'];
    }
	
	public function rules()
    {
        return [
            [['name'], 'required'],
            [['gender','status'], 'integer'],
            [['address'], 'safe'],
            [['name'], 'string', 'max' => 255]
        ];
    }
}

7) Bikin CRUD, nyontek aja dari CRUD Gii
8) Modify EmployeeController actionIndex (gara2 pake redis versi lama)

	public function actionIndex()
    {
		$db = \Yii::$app->redis;	
		$count = $db->executeCommand('LLEN',['employee']);	
		$employees = [];
		for($i=1;$i<=$count;$i++){
			$employee = $db->executeCommand('HGETALL', ['employee:a:'.$i]);	
			$last_field = "";
			foreach($employee as $num=>$val){
				if($num%2==0){
					$last_field = $val;					
				}	
				if($num%2==1){
					$employees[$i][$last_field]=$val;
				}
			}
		}
		
		$dataProvider = new ArrayDataProvider([
			'allModels' => $employees,
			'sort' => [
				'attributes' => ['id', 'name'],
			],
			'pagination' => [
				'pageSize' => 10,
			],
		]);
        return $this->render('index', [
            'dataProvider' => $dataProvider,
        ]);
    }

9) Entah kenapa actionColumn jadi salah makanya harus diupdate

<?= GridView::widget([
	'dataProvider' => $dataProvider,
	'columns' => [
		['class' => 'yii\grid\SerialColumn'],
		'name',
		[
			'attribute'=>'gender',
			'value'=>function($model){
				return $model['gender']?'Pria':'Wanita';
			}
		],
		'address:ntext',
		[
			'attribute'=>'status',
			'value'=>function($model){
				return $model['status']?'On':'Off';
			}
		],
		[
			'class' => 'yii\grid\ActionColumn',
			'header' => 'Aksi',
			'options'=>['width'=>'100px;'],
			'template'=> '{view} {update} {delete}',
			'buttons'=> [
				'view'=> function ($url, $model) {						
					$icon='<span class="glyphicon glyphicon-eye-open"></span>';
					return Html::a($icon,['view','id'=>$model['id']],['data-pjax'=>'0']);
				},
				'update'=> function ($url, $model) {						
					$icon='<span class="glyphicon glyphicon-pencil"></span>';
					return Html::a($icon,['update','id'=>$model['id']],['data-pjax'=>'0']);
				},
				'delete'=> function ($url, $model) {						
					$icon='<span class="glyphicon glyphicon-trash"></span>';
					return Html::a($icon,['delete','id'=>$model['id']],[
						'data-pjax'=>'0',
						'data-confirm'=>'Are you sure delete!',
						'data-method' => 'post',
					]);
				},
			]
		],
	],
]); ?>

10) Testing CRUD

Seharusnya jika kita menggunakan versi terakhir dari redis, maka itu harusnya jalan dengan baik tanpa ada perubahan seperti yang saya lakukan.

Jangan batasi imaginasimu!

Tags:,
2 Comments
  1. Adi Priyanto
  2. Adi Priyanto

Leave a Reply

Your email address will not be published. Required fields are marked *