{"id":15008163,"url":"https://github.com/limen/redisun","last_synced_at":"2025-10-30T12:31:26.838Z","repository":{"id":57015096,"uuid":"75707376","full_name":"limen/redisun","owner":"limen","description":"Make redis manipulations easy. Unified commands for all data types.","archived":false,"fork":false,"pushed_at":"2020-03-06T13:10:59.000Z","size":75,"stargazers_count":38,"open_issues_count":1,"forks_count":12,"subscribers_count":5,"default_branch":"master","last_synced_at":"2024-09-29T15:23:23.080Z","etag":null,"topics":["eval","lua","redis","sql"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/limen.png","metadata":{"files":{"readme":"README.cn.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-12-06T07:44:09.000Z","updated_at":"2024-07-09T09:49:47.000Z","dependencies_parsed_at":"2022-08-22T09:31:28.679Z","dependency_job_id":null,"html_url":"https://github.com/limen/redisun","commit_stats":null,"previous_names":[],"tags_count":14,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/limen%2Fredisun","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/limen%2Fredisun/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/limen%2Fredisun/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/limen%2Fredisun/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/limen","download_url":"https://codeload.github.com/limen/redisun/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":219856293,"owners_count":16556085,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["eval","lua","redis","sql"],"created_at":"2024-09-24T19:15:27.299Z","updated_at":"2025-10-30T12:31:26.548Z","avatar_url":"https://github.com/limen.png","language":"PHP","readme":"# 让redis操作更简单，为不同数据类型封装统一的命令\n\n[![Build Status](https://travis-ci.org/limen/redisun.svg?branch=master)](https://travis-ci.org/limen/redisun)\n[![Packagist](https://img.shields.io/packagist/l/limen/redisun.svg?maxAge=2592000)](https://packagist.org/packages/limen/redisun)\n\n[English](https://github.com/limen/redisun/blob/master/README.cn.md)\n[Wiki](https://github.com/limen/redisun/wiki)\n\n## 特性\n\n+ 为不同的数据类型封装了统一的命令，支持常用的5种数据类型：string, hash, list, set, zset\n+ 支持类似SQL的查询方法，如where、where in等\n+ 使用eval降低在网络通信上的时间消耗\n+ \"set\"类命令均支持修改key的ttl或保留当前ttl\n\n## 已封装的命令\n+ create: 创建key\n+ createNotExists: 当key不存在时创建\n+ createExists: 当key存在时创建\n+ insert: 类似create，支持披批量创建\n+ insertNotExists: 批量创建，当所有key不存在时才创建\n+ insertExists: 批量创建，当所有key存在时才创建\n+ get: 批量获取key\n+ getAndSet: 获取key并设置新值\n+ find: 获取单个key\n+ findBatch: 批量获取\n+ update: 批量更新\n+ destroy: 删除key\n+ destroyBatch: 批量删除\n+ delete: 批量删除\n\n## 安装\n\n推荐使用[composer](https://getcomposer.org/ \"\")安装\n\n```bash\ncomposer require \"limen/redisun\"\n```\n\n## 使用\n\n```\nuse Limen\\Redisun\\Examples\\HashModel;\nuse Limen\\Redisun\\Examples\\StringModel;\n\n$person = [\n   'name' =\u003e 'martin',\n   'age' =\u003e '22',\n   'height' =\u003e '175',\n   'nation' =\u003e 'China',\n];\n$hashModel = new HashModel();\n$hashModel-\u003ecreate(1, $person);\n$hashModel-\u003efind(1);                    // 返回 $person\n$hashModel-\u003ewhere('id',1)-\u003efirst();     // 返回 $person\n$hashModel-\u003ewhere('id',1)-\u003eget();       // 返回 ['redisun:1:hash' =\u003e $person]\n$hashModel-\u003ewhere('id',1)-\u003edelete();    // 从redis数据库删除\"redisun:1:hash\"\n\n$nick = 'martin-walk';\n\n$stringModel = new StringModel();\n$stringModel-\u003einsert([\n    'id' =\u003e 1,\n    'name' =\u003e 'martin'\n], $nick);\n$stringModel-\u003ewhere('id',1)-\u003efirst();   // 返回 $nick\n$stringModel-\u003ewhere('id',1)-\u003eget();     // 返回 ['redisun:1:string:martin' =\u003e $nick]\n```\n\n## 概念\n\n#### _Key表征_\n\n每一个Model都有自己的key表征。查询时依据key表征来构造key。例如\n \n```\nschool:{schoolId}:class:{classId}:members\n```\n\n对于拥有这个key表征的Model，我们可以使用where和where in来查询redis\n\n```\n$model-\u003ewhere('schoolId',1)-\u003ewhereIn('classId',[1,2])-\u003eget();\n```\n\n最终构造出的key如下。这也是将要向redis查询的key\n\n```\nschool:1:class:1:members\nschool:1:class:2:members\n```\n\n#### _Key域_\n\nKey域是key表征中的动态部分。\n\n以上面的key表征为例，它有两个域\n\n+ schoolId\n+ classId\n\n#### _完全key_\n\n一个构造出的key不包含未绑定的域时，这个key被认为是完全的。例如\n\n```\nschool:1:class:2:members\n```\n\n相反，一个不完全的key类似于\n\n```\nschool:1:class:{classId}:members\n```\n\n## 返回的数据集\n\n批量查询时，返回的数据集是由key索引的关联数组，索引对应的值为key对应的值。\n\n当上面构造出的两个key都存在时，返回的数据集如下\n\n```\n[\n    'school:1:class:1:members' =\u003e \u003citem1\u003e,\n    'school:1:class:2:members' =\u003e \u003citem2\u003e,\n]\n```\n\n如果某个key不存在，数据集的索引将没有该key\n\n数据集中元素的值的类型，根据不同的redis数据类型，可以是\n\n+ string: 字符串\n+ hash: 关联数组\n+ list: 数组\n+ set: 数组\n+ zset: 数组\n\n\n## 命令手册\n\n### create\n\n当一个model的key表征只有一个域时，可以使用该方法\n\nttl参数可选。\n\nkey表征如下的Hash类型的Model\n```\nuser:{id}:info\n```\n\n```\n$model-\u003ecreate(1, [\n    'name' =\u003e 'maria',\n    'age' =\u003e 22,\n], 10);   // key \"user:1:info\" 将在10s后过期\n```\n\nkey表征如下的Zset类型的Model\n```\nshop:{id}:customers\n```\n\n```\n// key -\u003e 成员, value -\u003e 分值\n$model-\u003ecreate(1, [\n    'maria' =\u003e 1,\n    'martin' =\u003e 2,\n]);   // \"shop:1:customers\"将不会过期\n```\n\n### createNotExists\n\n类似setnx，支持多种数据类型\n\n### createExists\n\n类似setxx，支持多种数据类型\n\n### insert\n\n可选参数用于检查key是否存在，使insert的行为类似setnx或setxx.\n\nkey表征如下的Zset类型的Model\n\n```\nuser:{id}:code\n```\n\n```\n$model-\u003einsert([\n    'id' =\u003e 1,\n], 10010, 20); \n```\n\n### insertNotExists\n\n类似createNotExists\n\n### insertExists\n\n类似createExists\n\n### find\n使用条件同create\n\n```\n$model-\u003efind(1);\n```\n\n### findBatch\n\n类型于find，返回的数据集由\"id\"索引\n\n```\n$model-\u003efindBatch([1,2,3]);\n// [\n//     1 =\u003e \u003citem1\u003e,\n//     2 =\u003e \u003citem2\u003e,\n//     3 =\u003e \u003citem3\u003e,\n// ]\n```\n\n### updateBatch\n\n类似于findBatch.\n\n不存在的key将被创建。\n\n如果不传入ttl参数，key的ttl将不被改变。\n\n```\n$model-\u003eupdateBatch([1,2,3], $value);\n```\n\n### all\n\nkey表征如下的model\n```\nuser:{id}:code\n```\n\n```\n$model-\u003eall();      // 返回匹配模式user:*:code（keys user:*:code）的所有key的值\n```\n\n\n### where\n\n绑定一个key域\n\n```\n$model-\u003ewhere('id', 1)-\u003ewhere('name', 'maria');\n```\n\n### whereIn\n\n类似于where，为一个key域绑定多个值\n\n```\n$model-\u003ewhereIn('id', [1,2,3]);\n```\n\n### first\n\n获取构造出的key中第一个存在的key，如果所有构造的key都不存在，返回null\n\n```\n$model-\u003ewhereIn('id', [1,2,3])-\u003efirst();    // return string|array|null\n```\n\n### update\n\n如果key不存在，将被创建\n\n如果不传入ttl参数，key的ttl将不被改变。\n\n```\n$model-\u003ewhere('id',1)-\u003eupdate($value);\n```\n\n### delete\n\n删除构造的key\n\n```\n$model-\u003ewhere('id',1)-\u003edelete();\n```\n\n### orderBy, sort\n\n用户对返回的数据集进行排序。\nkey表征如下的string类型的Model\n\n```\nuser:{id}:code\n```\n\n```\n$model-\u003einsert([\n    'id' =\u003e 1,\n], 10010); \n$model-\u003einsert([\n    'id' =\u003e 2,\n], 10011); \n\n$model-\u003ewhereIn('id', [1,2])-\u003eorderBy('id')-\u003eget();\n// returned data set\n// [\n//     'user:1:code' =\u003e 10010,\n//     'user:2:code' =\u003e 10011,\n// ]\n```\n\n```\n$model-\u003enewQuery()-\u003ewhereIn('id', [1,2])-\u003eorderBy('id', 'desc')-\u003eget();\n// returned data set\n// [\n//     'user:2:code' =\u003e 10011,\n//     'user:1:code' =\u003e 10010,\n// ]\n```\n\n```\n$model-\u003enewQuery()-\u003ewhereIn('id', [1,2])-\u003esort();\n// returned data set\n// [\n//     'user:1:code' =\u003e 10010,\n//     'user:2:code' =\u003e 10011,\n// ]\n```\n\n### count\n\n返回存在的key的数量。\n\n```\n$model-\u003ewhere('id', 1)-\u003ecount();    // 返回整数\n```\n\n### max\n\n返回数据集中的最大值\n\n```\n$model-\u003ewhere('id', 1)-\u003emax();\n```\n\n### min\n\n返回数据集中的最小值\n\n```\n$model-\u003ewhere('id', 1)-\u003emin();\n```\n\n### sum\n\n返回查询到的数据集的和\n\n```\n$model-\u003ewhere('id', 1)-\u003esum();\n```\n\n## Predis的原生方法\n\n当一个查询只构造出一个完整的key时，可以使用Predis的原生方法，例如\n    \n    // string model\n    $model-\u003ewhere('id', 1)-\u003eset('maria');\n    \n    // hash model\n    $model-\u003ewhere('id', 1)-\u003eupdate([\n        'name' =\u003e 'Maria',\n        'age' =\u003e '22',\n    ]);\n    // 等同于\n    $model-\u003ewhere('id', 1)-\u003ehmset([\n        'name' =\u003e 'Maria',\n        'age' =\u003e '22',\n    ]);\n\n## 查询构造器\n\n负责为model构造待查询的key\n\nkey表征\n\n```\nuser:{id}:{name}\n```\n\n```php\n$queryBuilder-\u003ewhereIn('id', [1,2])-\u003ewhereIn('name', ['maria', 'cat']);\n// 构造出的key\n// user:1:maria\n// user:1:cat\n// user:2:maria\n// user:2:cat\n\n$queryBuilder-\u003erefresh()-\u003ewhereIn('id', [1,2]);\n// 构造出的key\n// user:1:{name}\n// user:2:{name}\n```\n\n## 开发\n\n### 测试\n\n```bash\n$ phpunit --bootstrap tests/bootstrap.php tests/\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flimen%2Fredisun","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flimen%2Fredisun","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flimen%2Fredisun/lists"}