limen / redmodel
让redis操作变得简单。统一所有数据类型的命令。
Requires
- php: >=5.5
- predis/predis: ^1.1
Requires (Dev)
- phpunit/phpunit: ~4.8
README
特性
- 所有数据类型的统一命令:字符串、列表、哈希、集合和有序集合。
- 支持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/