Skip to content

Simple Promise based multi-channel priority queue using Redis sorted set

License

Notifications You must be signed in to change notification settings

Faberle/redis-priority-queue

 
 

Repository files navigation

Redis Priority Queue

This is a simple Promise based multi-channel priority queue implementation that leverages Redis sorted set.

Requirements

You will need Redis server running.

Installation

npm install redis-priority-queue
yarn add redis-priority-queue

Test

The test script in package.json preprocesses the .ts file and then executes.

npm test

Usage

The source was written in Typescript, yet it compiles to Javascript (npm run build). You can use in ES5 or later supported environments. The following code snippets are implemented in the __tests__ folder.

Quick start (Node)

const queue = require('redis-priority-queue');

const config = queue.RedisConfig("localhost", 6379, null, null);

const myQueue = new queue.RedisPriorityQueue(config);

myQueue.length("emptyQueue")
  .then(result => {
    console.log({result});
  })
  .catch(error => {
    console.error({error});
  });

Optional with existing client

If you already have a program with a RedisClient you can pass the client as an optional second parameter.

const myQueue = new queue.RedisPriorityQueue(null, client);

myQueue.length("emptyQueue")
  .then(result => {
    console.log({result});
  })
  .catch(error => {
    console.error({error});
  });

Typescript

Initialization

import {RedisConfig, IPriorityQueue, RedisPriorityQueue} from 'redis-priority-queue';

let config: RedisConfig = new RedisConfig(
    "localhost",
    6379,
    null,
    null
);

let myQueue : IPriorityQueue<string> = new RedisPriorityQueue(config);

Insert element

Promise.all([
    myQueue.insertWithPriority(testKey, "hello", 1),
    myQueue.insertWithPriority(testKey, "world", 2),
    myQueue.insertWithPriority(testKey, "foo", 1)
])
    .then(values => {
        done();
    })
    .catch(error => {
        done.fail(error);
    });

Pull highest score element

myQueue.pullHighestPriority(testKey)
    .then(result => {
        // assert popped value is highest priority
        expect(result).toEqual("world");
    })
    .catch(error => {
        done.fail(error);
    });

Peek highest score element

myQueue.peek(testKey)
    .then(result => {
        expect(result).toEqual("world");
        done();
    })
    .catch(error => {
        done.fail(error);
    });

Check if empty

myQueue.isEmpty(testKey)
    .then(result => {
        expect(result).toBeFalsy();
        done();
    })
    .catch(error => {
        done.fail(error);
    });

Get queue length

myQueue.length(testKey)
    .then(result => {
        expect(result).toEqual(3);
        done();
    })
    .catch(error => {
        done.fail(error);
    });

Contributing

I haven't thought that far ahead yet. I needed this for my project and wanted to give back. ;-)

License

MIT (if you enhance it, fork and PR so the community benefits)

About

Simple Promise based multi-channel priority queue using Redis sorted set

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • TypeScript 97.7%
  • JavaScript 2.3%