定制 nailfor/redis 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

nailfor/redis

最新稳定版本:v0.1.7

Composer 安装命令:

composer require nailfor/redis

包简介

Eloquent like library for Redis

README 文档

README

Redis client for Eloquent ORM

Features

All models are inherited from Illuminate\Database\Eloquent\Model so most methods work natively

Model Supports

Method Is Working
CURD Yes
Condition Select yes(HASH)
filling Yes
Limit Not yet
Chunking Not yet
Transaction Not yet
Insert a lot of data Not yet
Delete a lot of data Not yet
Update a lot of data Not yet
Expire Yes
Relationship Yes

Key Supports

Model type Constant
HASH TYPE_HASH
SET TYPE_SET

Key structure

Sample key structure for a Redis model in Laravel:

{config.redis.options.prefix}{model_table_name|class_name}:{primary_key}

  • model_table_name: The name of the current model table which set like 'protected $table = "name"'.
  • primary_key: The primary key of the model (id).

Example key:

rdb_product:1

Installation

The preferred way to install this extension is through composer.

Either run

composer require nailfor/redis

or add

"nailfor/redis" : "*"

to the require section of your application's composer.json file.

Configure

Add config/app.php

    'providers' => [
        ...
        nailfor\Redis\RedisServiceProvider::class,

and config/database.php

    'connections' => [
        ...
        'redis' => [ //the name of connection in your models(default)
            'driver'    => 'redis',
        ],

Usage

Models

├── DbProduct.php
├── RdbBrand.php
├── RdbProduct.php
└── User.php

DbProduct is a regular Eloquent model.

<?php

namespace App\Models;

use App\Models\DbCategory;
use App\Models\RdbBrand;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasOne;

class DbProduct extends Model
{
    protected $table = 'product';

    //sql to sql relationship
    public function Category(): BelongsTo 
    {
        return $this->belongsTo(DbCategory::class, 'category_id');
    }

    //sql to redis relationship
    public function Brand(): HasOne
    {
        return $this->hasOne(RdbBrand::class, 'brand_id');
    }
}

RdbProduct is a redis cache for DbProduct

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Relations\BelongsTo;
use nailfor\Redis\Eloquent\Model;

class RdbProduct extends Model
{
    protected $table = 'product';

    protected $fillable = [
        'id',
        'name',
        'article',
        'brand_id',
        'category_id',
    ];

    //Since the model type is HSET, all fields are stored as a string.
    protected $casts = [
        'id' => 'integer',
        'brand_id' => 'integer',
    ];

    //redis to redis relationship
    public function Brand(): BelongsTo
    {
        return $this->belongsTo(RdbBrand::class, 'brand_id');
    }

    //redis to sql relationship
    public function Category(): BelongsTo
    {
        return $this->belongsTo(DbCategory::class, 'category_id');
    }
}

RdbBrand some Redis model for Brands

<?php

namespace App\Models;

use nailfor\Redis\Eloquent\Model;

class RdbBrand extends Model
{
    //without var $table the key will be "rdb_brand"
}

Insert

    $product = DbProduct::find(1);

    $db              = new RdbProduct();
    $db->id          = $product->id;
    $db->name        = $product->name;
    $db->article     = $product->article;
    $db->brand_id    = $product->brand_id;
    $db->category_id = $product->category_id;
    $db->save();

Or, because we set $fillable

    $product = DbProduct::find(1);

    $db = new RdbProduct();
    $db->fill($product->toArray());
    $db->save();

Retrieving Models

    $product = RdbProduct::find(2);
    //or
    $product = RdbProduct::where('id', 2)
        ->whereIn('brand_id', [1,2,3])
        ->orWhere('article', 'SV-FX-02')
        ->first();
    //get all products
    $products = RdbProduct::with([
            'Brand',
        ])
        ->get()
    ;

    //get only id 1,2,3...
    $products = RdbProduct::with([
            'Brand',
            'Category',
        ])
        ->whereIn('id', [1,2,3])
        ->get()
    ;

    foreach($products as $product) {
        $brand      = $product->Brand;      //relation to Redis model RdbBrand
        $category   = $product->Category;   //relation to SQL model DbCategory

        //of course u can modify this models here
        $brand->type = 'sometype';
        $brand->save();
    }

Delete Models

    //truncate all product:*
    RdbProduct::delete();

    //deleting by condition
    RdbProduct::where('brand_id', 4)->delete();
    RdbProduct::where('id', 2)
        ->orWhere('brand_id', 5)
        ->delete();
    RdbProduct::where('article', 'VGX-01')
        ->whereIn('brand_id', [1,2,4])
        ->delete()
    ;

    //deleting single model
    $model = RdbProduct::find(1);
    $model->delete();

Expire and TTL

    $db = new RdModel;
    $db->id = 'key';
    $db->save();

    $timeInSeconds = 5;
    $db->expire($timeInSeconds);

    $db = new RdModel;
    $db->id = 'key';
    $ttl = $db->ttl(); //this op working w/o save model

Credits

License

The GNU License (GNU). Please see License File for more information.

统计信息

  • 总下载量: 653
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 4
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 1
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2023-12-07