diff options
| author | ruki <waruqi@gmail.com> | 2018-11-08 00:38:48 +0800 |
|---|---|---|
| committer | ruki <waruqi@gmail.com> | 2018-11-07 21:53:09 +0800 |
| commit | 26105034da4fcce7ac883c899d781f016559310d (patch) | |
| tree | c459a5dc4e3aa0972d9919033ece511ce76dd129 /node_modules/ylru | |
| parent | 2c77f00f1a7ecb6c8192f9c16d3b2001b254a107 (diff) | |
| download | xmake-docs-26105034da4fcce7ac883c899d781f016559310d.tar.gz xmake-docs-26105034da4fcce7ac883c899d781f016559310d.zip | |
switch to vuepress
Diffstat (limited to 'node_modules/ylru')
| -rw-r--r-- | node_modules/ylru/History.md | 22 | ||||
| -rw-r--r-- | node_modules/ylru/LICENSE | 23 | ||||
| -rw-r--r-- | node_modules/ylru/README.md | 91 | ||||
| -rw-r--r-- | node_modules/ylru/index.js | 106 | ||||
| -rw-r--r-- | node_modules/ylru/package.json | 38 |
5 files changed, 280 insertions, 0 deletions
diff --git a/node_modules/ylru/History.md b/node_modules/ylru/History.md new file mode 100644 index 00000000..c786d3c7 --- /dev/null +++ b/node_modules/ylru/History.md @@ -0,0 +1,22 @@ + +1.2.1 / 2018-07-11 +================== + +**others** + * [[`475abb0`](http://github.com/node-modules/ylru/commit/475abb0e9c787fd65d7c3dd3d2d74d67560b0bec)] - perf: only call Date.now() when necessary (#3) (Yiyu He <<dead_horse@qq.com>>) + +1.2.0 / 2017-07-18 +================== + + * feat: support lru.keys (#2) + +1.1.0 / 2017-07-04 +================== + + * feat: support get with maxAge (#1) + +1.0.0 / 2016-12-29 +================== + + * init version + diff --git a/node_modules/ylru/LICENSE b/node_modules/ylru/LICENSE new file mode 100644 index 00000000..96737b8f --- /dev/null +++ b/node_modules/ylru/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2016 node-modules +Copyright (c) 2016 'Dominic Tarr' + +Permission is hereby granted, free of charge, +to any person obtaining a copy of this software and +associated documentation files (the "Software"), to +deal in the Software without restriction, including +without limitation the rights to use, copy, modify, +merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom +the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR +ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/ylru/README.md b/node_modules/ylru/README.md new file mode 100644 index 00000000..219c695f --- /dev/null +++ b/node_modules/ylru/README.md @@ -0,0 +1,91 @@ +# ylru + +[![NPM version][npm-image]][npm-url] +[![build status][travis-image]][travis-url] +[![Test coverage][codecov-image]][codecov-url] +[![David deps][david-image]][david-url] +[![Known Vulnerabilities][snyk-image]][snyk-url] +[![npm download][download-image]][download-url] + +[npm-image]: https://img.shields.io/npm/v/ylru.svg?style=flat-square +[npm-url]: https://npmjs.org/package/ylru +[travis-image]: https://img.shields.io/travis/node-modules/ylru.svg?style=flat-square +[travis-url]: https://travis-ci.org/node-modules/ylru +[codecov-image]: https://img.shields.io/codecov/c/github/node-modules/ylru.svg?style=flat-square +[codecov-url]: https://codecov.io/github/node-modules/ylru?branch=master +[david-image]: https://img.shields.io/david/node-modules/ylru.svg?style=flat-square +[david-url]: https://david-dm.org/node-modules/ylru +[snyk-image]: https://snyk.io/test/npm/ylru/badge.svg?style=flat-square +[snyk-url]: https://snyk.io/test/npm/ylru +[download-image]: https://img.shields.io/npm/dm/ylru.svg?style=flat-square +[download-url]: https://npmjs.org/package/ylru + +**hashlru inspired** + +[hashlru](https://github.com/dominictarr/hashlru) is the **Simpler, faster LRU cache algorithm.** +Please checkout [algorithm](https://github.com/dominictarr/hashlru#algorithm) and [complexity](https://github.com/dominictarr/hashlru#complexity) on hashlru. + +ylru extends some features base on hashlru: + +- cache value can be **expired**. +- cache value can be **empty value**, e.g.: `null`, `undefined`, `''`, `0` + +## Usage + +```js +const LRU = require('ylru'); + +const lru = new LRU(100); +lru.set(key, value); +lru.get(key); + +// value2 will be expired after 5000ms +lru.set(key2, value2, { maxAge: 5000 }); +// get key and update expired +lru.get(key2, { maxAge: 5000 }); +``` + +### API + +## LRU(max) => lru + +initialize a lru object. + +### lru.get(key[, options]) => value | null + +- `{Number} options.maxAge`: update expire time when get, value will become `undefined` after `maxAge` pass. + +Returns the value in the cache. + +### lru.set(key, value[, options]) + +- `{Number} options.maxAge`: value will become `undefined` after `maxAge` pass. +If `maxAge` not set, value will be never expired. + +Set the value for key. + +### lru.keys() + +Get all unexpired cache keys from lru, due to the strategy of ylru, the `keys`' length may greater than `max`. + +```js +const lru = new LRU(3); +lru.set('key 1', 'value 1'); +lru.set('key 2', 'value 2'); +lru.set('key 3', 'value 3'); +lru.set('key 4', 'value 4'); + +lru.keys(); // [ 'key 4', 'key 1', 'key 2', 'key 3'] +// cache: { +// 'key 4': 'value 4', +// } +// _cache: { +// 'key 1': 'value 1', +// 'key 2': 'value 2', +// 'key 3': 'value 3', +// } +``` + +## License + +[MIT](LICENSE) diff --git a/node_modules/ylru/index.js b/node_modules/ylru/index.js new file mode 100644 index 00000000..1dd4b330 --- /dev/null +++ b/node_modules/ylru/index.js @@ -0,0 +1,106 @@ +'use strict'; + +class LRU { + constructor(max) { + this.max = max; + this.size = 0; + this.cache = new Map(); + this._cache = new Map(); + } + + get(key, options) { + let item = this.cache.get(key); + const maxAge = options && options.maxAge; + // only call Date.now() when necessary + let now; + function getNow() { + now = now || Date.now(); + return now; + } + if (item) { + // check expired + if (item.expired && getNow() > item.expired) { + item.expired = 0; + item.value = undefined; + } else { + // update expired in get + if (maxAge !== undefined) { + const expired = maxAge ? getNow() + maxAge : 0; + item.expired = expired; + } + } + return item.value; + } + + // try to read from _cache + item = this._cache.get(key); + if (item) { + // check expired + if (item.expired && getNow() > item.expired) { + item.expired = 0; + item.value = undefined; + } else { + // not expired, save to cache + this._update(key, item); + // update expired in get + if (maxAge !== undefined) { + const expired = maxAge ? getNow() + maxAge : 0; + item.expired = expired; + } + } + return item.value; + } + } + + set(key, value, options) { + const maxAge = options && options.maxAge; + const expired = maxAge ? Date.now() + maxAge : 0; + let item = this.cache.get(key); + if (item) { + item.expired = expired; + item.value = value; + } else { + item = { + value, + expired, + }; + this._update(key, item); + } + } + + keys() { + const cacheKeys = new Set(); + const now = Date.now(); + + for (const entry of this.cache.entries()) { + checkEntry(entry); + } + + for (const entry of this._cache.entries()) { + checkEntry(entry); + } + + function checkEntry(entry) { + const key = entry[0]; + const item = entry[1]; + if (entry[1].value && (!entry[1].expired) || item.expired >= now) { + cacheKeys.add(key); + } + } + + return Array.from(cacheKeys.keys()); + } + + _update(key, item) { + this.cache.set(key, item); + this.size++; + if (this.size >= this.max) { + this.size = 0; + this._cache = this.cache; + this.cache = new Map(); + } + } +} + +module.exports = LRU; + diff --git a/node_modules/ylru/package.json b/node_modules/ylru/package.json new file mode 100644 index 00000000..e158f0f6 --- /dev/null +++ b/node_modules/ylru/package.json @@ -0,0 +1,38 @@ +{ + "name": "ylru", + "description": "Extends LRU base on hashlru", + "version": "1.2.1", + "homepage": "https://github.com/node-modules/ylru", + "repository": { + "type": "git", + "url": "git://github.com/node-modules/ylru.git" + }, + "dependencies": {}, + "devDependencies": { + "beautify-benchmark": "^0.2.4", + "benchmark": "^2.1.3", + "egg-bin": "^1.10.0", + "eslint": "^3.12.2", + "eslint-config-egg": "^3.2.0", + "hashlru": "^1.0.3", + "ko-sleep": "^1.0.2", + "lru-cache": "^4.0.2" + }, + "main": "index.js", + "files": [ + "index.js" + ], + "scripts": { + "lint": "eslint test *.js", + "test": "npm run lint -- --fix && npm run test-local", + "test-local": "egg-bin test", + "cov": "egg-bin cov", + "ci": "npm run lint && npm run cov", + "autod": "autod" + }, + "author": "fengmk2", + "engines": { + "node": ">= 4.0.0" + }, + "license": "MIT" +} |
