国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > JS > 正文

Node.js 實現簡單的無侵入式緩存框架的方法

2024-05-06 16:53:29
字體:
來源:轉載
供稿:網友

前言

python 的flask.ext.cache 通過注解這樣對方法返回結果進行緩存:

@cache.cached(timeout=300, key_prefix='view_%s', unless=None)def hello(name=None):  print 'view hello called'  return render_template('hello.html', name=name)

這類實現方式對業務邏輯沒有絲毫的侵入性,非常之優雅。

最近在做 Node.js 地項目,然而 js ES 7 之前都不支持注解,目前見到的緩存框架雖然在 API 設計上都很簡潔、很有想法。

可是痛點在于它們都是侵入式的,需要在業務邏輯代碼中插入緩存邏輯,這些方式很不優雅。

正題

今天花點時間研究下js有沒有辦法,以比較優雅地方法實現緩存。

我對緩存框架的訴求:

  • 不對原方法進行更改
  • 能實現對不同參數地緩存
  • 支持緩存時間

我了解到的 js 能力:

  1. 隱藏參數arguments可以獲取參數列表
  2. prototype 可用來重寫覆蓋原方法

可行性?

看了看 prototype 文檔

直覺告訴我看起來可行,以下是官方的說明:

當一個函數被調用時,調用的參數被保留在類似數組 "變量" 的參數中。例如, 在調用 "myFn (a、b、c)"時, 在myFn 的主體內的參數將包含 3個類似數組的元素對應于 (a、b、c)。 使用鉤子修改原型時,只需通過調用該函數的 apply (),將 this 與參數 (調用狀態) 傳遞給當前行為。這種模式可以用于任何原型,如 Node.prototype、 Function.prototype 等.

var current = Object.prototype.valueOf;// 由于我的屬性 "-prop-value"是交叉性的, 并不總是// 在同一個原型鏈上,我想要修改 Object.prototype: Object.prototype.valueOf = function() { if (this.hasOwnProperty('-prop-value')) {  return this['-prop-value']; } else {  // 它看起來不像我的對象之一,因此,讓我們退回到   // 默認行為,通過盡可能地復制當前行為來實現.  // 此apply的行為類似于其他語言中的"super".  // 即使 valueOf() 不帶參數, 其他的鉤子可能會帶有.  return current.apply(this, arguments); }}

從示例不難看出,我可以在某些條件下通過 apply() 方法調用函數原邏輯,某些條件執行我需要的新邏輯。

寫個 demo 測試一下

// 重寫Function的原型方法cacheFunction.prototype.cache = function () {  var _self = this;  return function() { console.log('arguments', arguments); var key = arguments[0];    if (cache.has(key)) {      return cache.get(key)    } else {      return _self.apply(this, arguments)    }  }}

定義 cache,當且僅當 key 為 1 時有值

var cache = {  has: (key) => { if (key === 1) return true else return false  },  get: (key) => {    return "cached value " + key  }}

定義測試方法

function request(key) { return 'value of ' + key}

應用注入

request = request.cache()

執行一下

request(2)"value of 2"request(1)"cached value 1"

看到結果按照預期輸出,完美!

最后實現

項目引用了 memory-cache 作為基礎緩存庫,實現了相關的緩存功能。

simple-cache.jsconst cache = require('memory-cache');Function.prototype.cache = function (cachekey, time) {  var _self = this;  return function() { var key = cachekey(arguments);    var value = cache.get(key);    if (!value) {      value = _self.apply(this, arguments)  cache.put(key, value, time);    }    return value;  }}var simpleCache = { cache: function(f, cacheKey, cacheTime) { return f.cache(cacheKey, cacheTime); }}module.exports = simpleCachesample.jsconst cache = require('simple-cache-z').cache;function cachekey(args) {  return args[0]}function request(key) {  return (new Date()).getTime();}request = cache(request, cachekey, 5000);console.log('request 1 ', request(1));setTimeout(() => {  console.log('request 2 ', request(2));}, 1000)setTimeout(()=> {  console.log('request 1 ', request(1))  console.log('request 1 ', request(1))  console.log('request 1 ', request(1))  console.log('request 2 ', request(2));  console.log('request 2 ', request(2));  console.log('request 2 ', request(2));}, 2000);setTimeout(()=> {  console.log('request 1 ', request(1));  console.log('request 1 ', request(1));  console.log('request 1 ', request(1));  console.log('request 2 ', request(2));  console.log('request 2 ', request(2));  console.log('request 2 ', request(2));}, 10000);

輸出結果

request 1  1563000551142
// 1000 ms
request 2  1563000552150
// 2000 ms
request 1  1563000551142
request 1  1563000551142
request 1  1563000551142
request 2  1563000552150
request 2  1563000552150
request 2  1563000552150
// 10000 ms
request 1  1563000561151
request 1  1563000561151
request 1  1563000561151
request 2  1563000561151
request 2  1563000561151
request 2  1563000561151

大功告成!

今日研究成果

事實證明方案可行,應用到我的項目中對執行效率和代碼可讀性的提升非常明顯。

我已經把框架打成了包,上傳到 npm 倉庫 simple-cache-z ,可通過如下方式引用。

npm install --save simple-cache-z

用法和代碼上傳至 github 倉庫,歡迎提交代碼和 star:

https://github.com/auv1107/simple-cache-nodejs

總結

以上所述是小編給大家介紹的Node.js 實現簡單的無侵入式緩存框架的方法,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的!


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 开化县| 博白县| 玉山县| 万州区| 绥中县| 阳泉市| 巨鹿县| 道孚县| 邯郸县| 巴彦淖尔市| 民勤县| 西乡县| 成安县| 和政县| 威远县| 屏东市| 万全县| 剑川县| 宁波市| 孟村| 信阳市| 闽清县| 合阳县| 射阳县| 布尔津县| 普格县| 府谷县| 永胜县| 化州市| 买车| 汝州市| 阿勒泰市| 齐齐哈尔市| 黄浦区| 永州市| 寿宁县| 西吉县| 枝江市| 安康市| 徐水县| 宁城县|