limen/redmodel

让redis操作变得简单。统一所有数据类型的命令。

v2.0.3 2018-11-30 07:11 UTC

README

Build Status Packagist

中文

Wiki

Python版本

特性

  • 所有数据类型的统一命令:字符串、列表、哈希、集合和有序集合。
  • 支持SQL-like查询
  • 使用"eval"以节省网络上的时间消耗。
  • 类似于"set"的命令都支持设置新的ttl或保持当前ttl

统一命令

  • create: 创建键
  • createNotExists: 当键不存在时创建键
  • createExists: 当键存在时创建键
  • insert: 类似于create,但支持多个键
  • insertNotExists: 类似于createNotExists
  • insertExists: 类似于createExists
  • get: 获取键以替代get, lrange, hgetall, smembers和zrange
  • getAndSet: 获取键并设置新值
  • find: 类似于get
  • findBatch: 批量查找
  • update: 更新键
  • destroy: 删除一个键
  • destroyBatch: 删除键
  • delete: 删除键

安装

建议通过 composer 安装。

composer require "limen/redisun"

用法

use Limen\Redisun\Examples\HashModel;
use Limen\Redisun\Examples\StringModel;

$person = [
   'name' => 'martin',
   'age' => '22',
   'height' => '175',
   'nation' => 'China',
];
$hashModel = new HashModel();
$hashModel->create(1, $person);
$hashModel->find(1);                    // return $person
$hashModel->where('id',1)->first();     // return $person
$hashModel->where('id',1)->get();       // return ['redisun:1:hash' => $person]
$hashModel->where('id',1)->delete();    // remove key "redisun:1:hash" from database

$nick = 'martin-walk';

$stringModel = new StringModel();
$stringModel->insert([
    'id' => 1,
    'name' => 'martin'
], $nick);
$stringModel->where('id',1)->first();   // return $nick
$stringModel->where('id',1)->get();     // return ['redisun:1:string:martin' => $nick]

概念

键表示

每个模型都有自己的键表示,这告诉如何构建查询键。例如

school:{schoolId}:class:{classId}:members

我们可以使用where子句查询Redis。

$model->where('schoolId',1)->whereIn('classId',[1,2])->get();

要查询的键是

school:1:class:1:members
school:1:class:2:members

键字段

键字段是键表示的动态部分。

以上键表示有两个字段

  • schoolId
  • classId

完整键

当一个键没有未绑定的字段时,我们将其视为完整键。例如

school:1:class:2:members

相反,不完整的键类似于此

school:1:class:{classId}:members

返回的数据集

返回的数据集将是一个关联数组,其索引是查询键。

当Redis数据库中同时存在两个键时,返回的数据集将是

[
    'school:1:class:1:members' => <item1>,
    'school:1:class:2:members' => <item2>,
]

如果键不存在,则等效的索引将未设置。

返回项的数据类型取决于模型类型,可能是字符串、哈希、列表、集合或有序集合。

  • string: 字符串
  • hash: 关联数组
  • list: 数组
  • set: 数组
  • zset: 数组

方法

create

当模型键表示只有一个动态字段作为其主要字段时可以使用。

项目的ttl是可选的。

具有键表示的哈希类型

user:{id}:info
$model->create(1, [
    'name' => 'maria',
    'age' => 22,
], 10);   // the item "user:1:info" would expire after 10 seconds

具有键表示的有序集合类型

shop:{id}:customers
// key -> member, value -> score
$model->create(1, [
    'maria' => 1,
    'martin' => 2,
]);   // the item "shop:1:customers" would not expire

createExists

类似于"setxx",但支持更多数据类型:字符串、哈希、集合、有序集合和列表。

createNotExists

类似于"setnx",但支持更多数据类型。

insert

一个可选参数使其可以像"setnx"和"setxx"一样插入。具有键表示的字符串类型。

user:{id}:code
$model->insert([
    'id' => 1,
], 10010, 20); // the item "user:1:code" would expire after 20 seconds 

insertExists

类似于createExists

insertNotExists

类似于createNotExists

find

当模型键表示只有一个动态字段作为其主要字段时可以使用。

$model->find(1);

findBatch

类似于find。返回的数据集按id索引。

$model->findBatch([1,2,3]);
// [
//     1 => <item1>,
//     2 => <item2>,
//     3 => <item3>,
// ]

updateBatch

类似于findBatch。

如果键不存在,则创建键。如果未设置ttl参数,则不会修改键的ttl。

$model->updateBatch([1,2,3], $value);

all

键表示

user:{id}:code
$model->all();      // return all keys which match pattern "user:*:code"

where

类似于SQL

$model->where('id', 1)->where('name', 'maria');

whereIn

类似于where

$model->whereIn('id', [1,2,3]);

first

从查询键中获取第一个存在的项。如果所有查询键不存在,则返回null。

$model->whereIn('id', [1,2,3])->first();    // return string|array|null

update

如果键不存在,则创建键。如果未设置ttl参数,则不会修改键的ttl。

$model->where('id',1)->update($value);

删除

删除查询键。

$model->where('id',1)->delete();

orderBy, 排序

带有键表示的字符串类型

user:{id}:code
$model->insert([
    'id' => 1,
], 10010); 
$model->insert([
    'id' => 2,
], 10011); 

$model->whereIn('id', [1,2])->orderBy('id')->get();
// returned data set
// [
//     'user:1:code' => 10010,
//     'user:2:code' => 10011,
// ]
$model->newQuery()->whereIn('id', [1,2])->orderBy('id', 'desc')->get();
// returned data set
// [
//     'user:2:code' => 10011,
//     'user:1:code' => 10010,
// ]
$model->newQuery()->whereIn('id', [1,2])->sort();
// returned data set
// [
//     'user:1:code' => 10010,
//     'user:2:code' => 10011,
// ]

计数

计数存在的查询键。

$model->where('id', 1)->count();    // return an integer

最大值

获取返回数据集中的最大项。

$model->where('id', 1)->max();

最小值

获取返回数据集中的最小项。

$model->where('id', 1)->min();

求和

获取返回数据集的总和。

$model->where('id', 1)->sum();

Predis 本地方法

当查询中只包含一个完整的查询键时,可以使用Predis本地方法,如"sadd", "hset"。

// string model
$model->where('id', 1)->set('maria');

// hash model
$model->where('id', 1)->update([
    'name' => 'Maria',
    'age' => '22',
]);
// equals to
$model->where('id', 1)->hmset([
    'name' => 'Maria',
    'age' => '22',
]);

查询构建器

负责为模型构建查询键。

键表示

user:{id}:{name}
$queryBuilder->whereIn('id', [1,2])->whereIn('name', ['maria', 'cat']);
// built keys
// user:1:maria
// user:1:cat
// user:2:maria
// user:2:cat

$queryBuilder->refresh()->whereIn('id', [1,2]);
// built keys
// user:1:{name}
// user:2:{name}

开发

测试

$ phpunit --bootstrap tests/bootstrap.php tests/