Created
December 15, 2013 15:41
-
-
Save crossai-2033/7974445 to your computer and use it in GitHub Desktop.
webCache LRU
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var _store = { | |
removeItem : function(k) { | |
delete this[k]; | |
} | |
}; | |
try { | |
if ("localStorage" in window && window["localStorage"]) | |
_store = window["localStorage"]; | |
} catch (e) { } | |
function WebCache(name, size, timeout) { | |
var datas = {}; | |
var frees = []; | |
var count = 0; | |
timeout = timeout || 0; | |
function load() { | |
function _new() { | |
datas = {}; | |
frees = []; | |
count = size; | |
for (var i = 0; i < size; i++) | |
frees.push(i); | |
} | |
try { | |
count = new Number(_store[name + '_count']); | |
if (count != size) { | |
for (var i = 0; i < count; i++) { | |
_store.removeItem(name + '_' + i); | |
_store.removeItem(name + '_' + i + '_time'); | |
} | |
_store.removeItem(name + '_datas'); | |
_store.removeItem(name + '_frees'); | |
_store.removeItem(name + '_count'); | |
_new(); | |
} else { | |
datas = JSON.parse(_store[name + '_datas']); | |
frees = JSON.parse(_store[name + '_frees']); | |
} | |
} catch (e) { | |
_new(); | |
} | |
} | |
function save() { | |
_store[name + '_datas'] = JSON.stringify(datas); | |
_store[name + '_frees'] = JSON.stringify(frees); | |
_store[name + '_count'] = count.toString(); | |
} | |
function _del(k) { | |
frees.push(datas[k]); | |
delete datas[k]; | |
return false; | |
} | |
function _has(k) { | |
if (datas.hasOwnProperty(k)) { | |
if (timeout <= 0) | |
return true; | |
if (new Date().getTime() | |
- new Number(_store[name + '_' + datas[k] | |
+ '_time']) >= timeout) | |
return _del(k); | |
return true; | |
} else | |
return false; | |
} | |
function _clean() { | |
if (timeout > 0) { | |
for ( var k in datas) | |
_has(k); | |
} | |
} | |
function _put_data(n, v) { | |
_store[name + '_' + n] = JSON.stringify(v); | |
_store[name + '_' + n + '_time'] = new Date().getTime(); | |
return v; | |
} | |
function _put(k, v) { | |
var n = frees.pop(); | |
datas[k] = n; | |
return _put_data(n, v); | |
} | |
function _update(k, v) { | |
var n = datas[k]; | |
delete datas[k]; | |
datas[k] = n; | |
return _put_data(n, v); | |
} | |
// exists | |
this.has = function(k) { | |
load(); | |
return _has(k); | |
} | |
// fetch data | |
this.get = function(k) { | |
load(); | |
if (_has(k)) { | |
var n = datas[k]; | |
delete datas[k]; | |
datas[k] = n; | |
save(); | |
return JSON.parse(_store[name + '_' + n]); | |
} | |
} | |
// update or insert | |
this.put = function(k, v) { | |
load(); | |
if (_has(k)) | |
_update(k, v); | |
else { | |
if (frees.length == 0) { | |
for ( var k1 in datas) { | |
if (_has(k1)) { | |
if (frees.length == 0) | |
_del(k1); | |
break; | |
} | |
} | |
} | |
_put(k, v); | |
} | |
save(); | |
} | |
// update if exists | |
this.set = function(k, v) { | |
load(); | |
if (_has(k)) { | |
_update(k, v); | |
save(); | |
} | |
} | |
this.datas = function() { | |
var ds = {}; | |
load(); | |
_clean(); | |
for ( var k in datas) { | |
ds[k] = JSON.parse(_store[name + '_' + datas[k]]); | |
} | |
return ds; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment