{"id":22433797,"url":"https://github.com/gavinning/rmdb","last_synced_at":"2025-06-16T21:36:42.903Z","repository":{"id":49645693,"uuid":"156851306","full_name":"gavinning/rmdb","owner":"gavinning","description":"缓存与持久化策略","archived":false,"fork":false,"pushed_at":"2021-10-21T12:00:18.000Z","size":262,"stargazers_count":6,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-06-03T18:15:38.019Z","etag":null,"topics":["cache","mysql","redis","rmdb"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/gavinning.png","metadata":{"files":{"readme":"README.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":"2018-11-09T11:11:11.000Z","updated_at":"2021-12-29T07:48:16.000Z","dependencies_parsed_at":"2022-09-17T03:01:09.688Z","dependency_job_id":null,"html_url":"https://github.com/gavinning/rmdb","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/gavinning/rmdb","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gavinning%2Frmdb","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gavinning%2Frmdb/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gavinning%2Frmdb/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gavinning%2Frmdb/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gavinning","download_url":"https://codeload.github.com/gavinning/rmdb/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gavinning%2Frmdb/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260245633,"owners_count":22980254,"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":["cache","mysql","redis","rmdb"],"created_at":"2024-12-05T22:15:55.134Z","updated_at":"2025-06-16T21:36:42.858Z","avatar_url":"https://github.com/gavinning.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# rmdb\n缓存与持久化策略  \n优先从Redis缓存读取数据，当缓存过期或为空时，从数据源读取返回并更新到缓存\n\n### Install\n```sh\nnpm i rmdb\nyarn add rmdb\n```\n\n### Usage\n```js\n// 推荐使用 ioredis\n// 依赖支持Promise的Redis实例\nconst { Factory } = reuqire('rmdb')\nconst RMDB = Factory(redis)\n```\n```js\n// 使用ES6\nimport Factory from 'rmdb'\nconst RMDB = Factory(redis)\n```\n\n创建rmdb实例\n```js\n// 默认更新时间 5分钟 缓存不会过期\nconst rmdb = RMDB.src(key).from(dataSource)\n\n/**\n * @param {string} key              必须，Redis Key\n * @param {number} autoUpdateTime   数据自动更新时间，默认5分钟\n * @param {number?} expireTime      数据过期时间，可选，默认不过期\n * @param {DataSource} dataSource   必须，数据来源\n * @returns {RMDB}\n */\nconst rmdb = RMDB.src(key).keep(autoUpdateTime, expireTime).from(dataSource)\n\n\n// 对于配置类型的存储，推荐不设置expireTime时间\n// 缓存本身不会过期，autoUpdateTime设置更新时间间隔\n// 如果更新失败将会使用缓存输出\nconst rmdb = RMDB.src(key).keep(autoUpdateTime).from(dataSource)\n```\n\n#### Types\n```ts\nexport type DataSource = (...args: any[]) =\u003e any | Promise\u003cany\u003e\n```\n\n\n#### Example 1\n```js\n// 每5分钟自动从数据源更新数据到缓存\nconst rmdb = RMDB.src('test:f1').from(() =\u003e [1,2,3])\n```\n\n#### Example 2\n```js\n// 每小时自动从数据源更新数据到缓存\nconst rmdb = RMDB.src('test:f1').keep(3600).from(() =\u003e [1,2,3])\n```\n\n#### Example 3\n```js\n// 每小时自动从数据源更新数据到缓存\n// 数据24小时过期，数据过期后再次请求将触发数据更新\nconst rmdb = RMDB.src('test:f1').keep(3600, 3600*24).from(() =\u003e [1,2,3])\n```\n\n### rmdb\nrmdb实例提供3个方法\n```js\n// 查询数据\nconst data = await rmdb.get()\n// 使用过滤条件\n// 所有参数会被当做过滤条件透传给dataSource\n// 过滤条件属于高级用法，多数时候不需要，谨慎使用\nconst data = await rmdb.get({ id: 1 })\n```\n```js\n// 更新数据，立即从数据源更新\n// 注意！大多数时候应该使用get方法，程序会根据时间配置自动更新缓存，除非你知道自己在做什么\nconst result = await rmdb.update()\n// 使用过滤条件\n// 所有参数会被当做过滤条件透传给dataSource\n// 过滤条件属于高级用法，多数时候不需要，谨慎使用\nconst result = await rmdb.update({ id: 1 })\n```\n```js\n// 清理缓存\nconst result = await rmdb.clear()\n```\n\n### 环境变量下使用rmdb\n比如根据请求参数进行缓存  \n* 这种情况下不推荐使用rmdb实例get以外的方法  \n* 应使用keep方法设置``autoUpdateTime``和``expireTime``\n\n#### Example 1\n```js\nrouter.get('/posts', async (ctx) =\u003e {\n    const user = ctx.state.user\n    const posts = await db.post.find({ user: user.id })\n    return RMDB.src('app:user:posts', user.id).keep(5, 10).from(() =\u003e posts).get()\n})\n```\n\n#### Example 2\n\u003e DataSource闭包捕获环境变量，无需传递过滤条件 ``推荐``  \n\n```js\nfunction getPosts(user) {\n    return db.post.find({ user: user.id })\n}\n\nrouter.get('/posts', async (ctx) =\u003e {\n    const user = ctx.state.user\n    // DataSource闭包捕获环境变量，无需传递过滤条件\n    return RMDB.src('app:user:posts', user.id).keep(5, 10).from(() =\u003e getPosts(user)).get()\n})\n```\n\n#### Example 2\n\u003e 直接传入DataSource函数，可能需要向get方法传递过滤条件  \n\u003e get获得的所有参数会被当做过滤条件透传给DataSource\n\n```js\nfunction getPosts(user) {\n    return db.post.find({ user: user.id })\n}\n\nrouter.get('/posts', async (ctx) =\u003e {\n    const user = ctx.state.user\n    // 直接传入DataSource函数，可能需要向get方法传递过滤条件\n    // get获得的所有参数会被当做过滤条件透传给DataSource\n    return RMDB.src('app:user:posts', user.id).keep(5, 10).from(getPosts).get(user)\n})\n```\n\n![](http://assets.processon.com/chart_image/5bdc11c0e4b00cdc18c90d9b.png)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgavinning%2Frmdb","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgavinning%2Frmdb","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgavinning%2Frmdb/lists"}