Skip to content

Instantly share code, notes, and snippets.

@mitio
Last active February 5, 2023 16:23
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save mitio/9688698 to your computer and use it in GitHub Desktop.
Save mitio/9688698 to your computer and use it in GitHub Desktop.
Simple in-memory JavaScript object cache with a maxAge per key (in seconds) and maxEntries limit (per cache instance).
var MemoryCache = function (options) {
options = $.extend(true, {
maxEntries: null
}, options || {});
var self = this;
var cache = {};
var entries = 0;
var ageOf = function (entry) {
return Math.round((new Date() - entry.setAt) / 1000);
};
var deleteEntryByKey = function (key) {
delete cache[key];
if (entries > 0) entries--;
};
var deleteOldestEntry = function () {
var keyOfOldestItem, dateOfOldestItem;
for (var key in cache) {
if (!dateOfOldestItem || dateOfOldestItem > cache[key].setAt) {
dateOfOldestItem = cache[key].setAt;
keyOfOldestItem = key;
}
}
if (keyOfOldestItem) {
deleteEntryByKey(keyOfOldestItem);
}
};
self.set = function (key, value, maxAge) {
if (cache[key]) {
cache[key].value = value;
cache[key].setAt = new Date();
cache[key].maxAge = maxAge || cache[key].maxAge;
} else {
if (options.maxEntries && entries >= options.maxEntries) {
deleteOldestEntry();
}
cache[key] = {
value: value,
setAt: new Date(),
maxAge: maxAge
};
entries++;
}
};
self.get = function (key) {
var entry = cache[key];
if (entry) {
if (entry.maxAge && entry.maxAge <= ageOf(entry)) {
deleteEntryByKey(key);
}
return entry.value;
}
};
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment