npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

2q-cache

v1.2.1

Published

Imlementation of 2Q Cache Algorithm

Downloads

34

Readme

2Q cache

Simple and configurable cache library for Node.js and Browser that implements 2Q Cache algorithm (http://www.vldb.org/conf/1994/P439.PDF) This algorithm tries to preserve the most used elements, so it demonstrates better cache hit than other caches,for example, LRU (Least Recently Used) cache.

Installation:

npm i 2q-cache

Usage:

const Cache2Q = require('2q-cache');

let cache = new Cache2Q(400); //sets max count of cache elems
/*
    20% of size will be "in" FIFO bucket,
    60% - "out" FIFO bucket,
    20% - "main" LRU cache

    OR

    let cache = new Cache2Q[400, 440, 200] - you also can define manually sizes of each section in cache.
    First element of array is size of "in" FIFO bucket,
    Second - size of "out" FIFO bucket,
    Third - size of "main" LRU cache
*/

Example with options

const Cache2Q = require('2q-cache');

let options = {
    ttl : 1000 * 60 * 60, //default time to delete elements from cache : number
    stringKeys : true, // If stringKeys are true, keys of cache elements will be convert to string by JSON.stringify
    ttlInMain : false, //you can disable time to delete in 'main' section of cache. It can be useful, because in main                           //section stored most requested cache elements
    mainStorageType : 'lfu' //Type of main storage. It can be 'lru' - Least Recently Used,
                            //'mru' - Most Recently used,
                            //'lfu' - Least-Frequently used
}

let cache = new Cache2Q(400, options); //or ([100,200,250], options);

By default

  • cache ttl (lifetime) equals 0, so elements will not be removed by timeout
  • stringKeys are false, so new elements are saving "as is", without using JSON.stringify

You also can use Typescript version of 2Q cache module:

import {Cache2Q, CacheException} from '2q-cache/ts/cache2Q';

let cache : Cache2Q = new Cache2Q(400); 

API

  • set(key : any, value : any, ttl : number = 0 (optional))

    Sets new pair (key, value) with lifetime (optional) if key exists, it updates value and ttl parameter ttl overrides default ttl settings

  • mset(Array<object {key : any, value : any, ttl : number = 0}>)

    the same as 'set', but for array of new elements

  • get(key) => value

    Returns value by presented key if key doesn't exists, returns null

  • mget(Array<key : any>) : Array<values : any>

    the same as 'get', but for array of keys

  • has(key) => boolean

    Returns true if key exists, otherwise returns false

  • mhas(Array<key : any>) : Array<boolean>

    the same as 'has', but for array of keys

  • delete(key : any) => boolean

    deletes pair (key, value) from cache. If element doesn't exists, returns false.

  • mdel(keys : Array<any>) : Array<boolean>

    the same as 'del', but for array of keys

  • resetTtl(key : any, ttl : number)

    resets (overrides) ttl for element by presented key.

  • mresetTtl(keys : Array<object {key : any, ttl : number}>)

    the same as 'resetTtl', but for array of keys

  • setDefaultTtl(ttl : number)

    sets default ttl.

  • setStringifyKeys(param : boolean)

    overrides default setting for stringify keys. if stringify keys are true, keys will be converted to string by JSON.stringify

  • clear()

    Clears cache

  • alloc(size : number | Array<number>)

    Sets new size for each cache section. Parameter same as constructor parameter. Doesn't allow make max section size smaller

  • allocUnsafe(size : number | Array<number>)

    Sets new size for each cache section. Parameter same as constructor parameter . Allow make max section size smaller. If new max size smaller than current size on some cache section, older elements will be removed.

  • getSize()

    Returns object like this:

    {
        buckets : {
            in : {
                currentSize : 10,
                maxSize : 20
            },
            out : {
                currentSize : 0,
                maxSize : 60
            },
        },
        main : {
            currentSize : 0,
            maxSize : 20
        }
    }

ROADMAP

  • Any ideas?