Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

redis-json

AkashBabu81.9kMIT6.0.3TypeScript support: included

A wrapper library to store JSON Objects in redis-hashsets and retrieve it back as JSON objects

redis, json, store, retrieve, save, insert, hashset

readme

redis-json npm version Build Status Coverage Status Maintainability

Nodejs library to store/retrieve JSON Objects in RedisDB without loosing type information, i.e. WYSIWYG (What You Store Is What You Get)

Description

Every time set is called JSON object is flattened(embeded objects are converted to path keys) and then stored in Redis(just like a normal hashset), on get the hashset is unflattened and converted back to the original JSON object(with the same types as was in the original object).

What's new in v6.0.0?

  • In response to issue: #24, we now replace the array in the cache when array is found in set object.

If you are on V5 then please check this Migration Guide to V6

API

Please visit this page for detailed API documentation.

Usage

Simple

import Redis from 'ioredis';
import JSONCache from 'redis-json';

const redis = new Redis() as any;

const user = {
  name: 'redis-json',
  age: 25,
  address: {
    doorNo: '12B',
    locality: 'pentagon',
    pincode: 123456
  },
  cars: ['BMW 520i', 'Audo A8']
}

const jsonCache = new JSONCache<typeof user>(redis, {prefix: 'cache:'});


await jsonCache.set('123', user)

await jsonCache.get('123')
// output
// {
//   name: 'redis-json',
//   age: 25,
//   address: {
//     doorNo: '12B',
//     locality: 'pentagon',
//     pincode: 123456
//   },
//   cars: ['BMW 520i', 'Audo A8']
// }

await jsonCache.set('123', {gender: 'male'})
await jsonCache.get('123')
// output
// {
//   name: 'redis-json',
//   age: 25,
//   address: {
//     doorNo: '12B',
//     locality: 'pentagon',
//     pincode: 123456
//   },
//   cars: ['BMW 520i', 'Audo A8']
//   gender: 'male'
// }

await jsonCache.get('123', 'name', 'age');
// output
// {
//   name: 'redis-json',
//   age: 25,
// }

await jsonCache.get('123', 'name', 'address.doorNo');
// {
//   name: 'redis-json',
//   address: {
//     doorNo: '12B'
//   }
// }

await jsonCache.clearAll();

await jsonCache.get('123');
// undefined


await jsonCache.incr('123', {age: 1}) // increments age by 1

With custom stringifier and parser:

const jsonCache = new JSONCache(redis, {
  stringifier: {
    Date: (val: Date) => val.toISOString()
  },
  parser: {
    Date: (str: string) => new Date(str)
  }
})

const date = new Date()
await jsonCache.set('test', {
  date: date
})

// Redis hashset
> hgetall jc:test /// data
1) "date"
2) "2020-05-17T14:41:45.861Z"
> hgetall jc:test_t /// type info
1) "date"
2) "Date"


const result = await jsonCache.get('test')
result.date == date /// true

With transactions:

const transaction = redisClient.multi();

transaction
  .set('name', 'foo')
  .set('bar', 'baz')

await jsonCache.set('test', {name: 'testing'}, {transaction})
await jsonCache.del('test1', {transaction})
await jsonCache.rewrite('test2', {name: 'testing', age: 25}, {transaction})

transaction
  .exec(function(err, replies) => {
    /// your logic here after
  })

Please note that only set(), rewrite(), del() & incr() supports transaction, where as get() & clearAll() do NOT support transaction because we process those results before returning it to the calling function. Moreover there is no real usecase in supporting transaction in get() & clearAll() methods!

Changelogs

Please refer to this page

Coverage Report

npm run coverage

Contributions

This is open-source, which makes it obvious for any PRs, but I would request you to add necessary test-cases for the same.

Pre-requisites:

Run your redis-server and then point the same client to the same. An easier way to start redis-server, provided you've already installed docker (else visit this page) is by running this command:

docker run --rm -it --name redis -p 6379:6379 redis

We follow TDD approach, so write your test cases first and then run the same paralelly during development by running the following command:

npm run test:dev

LICENCE

MIT License

changelog

v6.0.2

  • minor bug fixes and performance improvements

v6.0.1

  • adds function overload definition for get as get(key: string): Promise<T|undefined>

v6.0.0

  • improves efficiency by combining multiple commands into one multi command
  • fixes code smells
  • replace the entire array when an array is present in the set command
  • removes all <set|del|rewrite|incr>T methods and integrates transaction within <set|del|rewrite|incr> method itself

v5.0.0

  • supports empty string as pre-fixes

v4.3.0

  • adds .incr() & .incrT() methods to allow incrementing of values using hincrbyfloat.

v4.2.1

  • fixes #14, wherein when any prop was set(id, {}) on an empty object, it wasn't reflected when get() was called on it

v4.2.0

  • adds support for transactions via setT, delT & rewriteT methods
  • rewrite method now support expiry. Please check the API docs for more details

v4.1.0

  • adds .del() method

v4.0.1

  • clearAll() now scans the DB via scan command(with a COUNT 100), instead of getting all the prefixed keys via keys command which would block the DB if the list is huge
  • Now allows fetching of internal fields as well -> jsonCache.get('test', 'name', 'address', 'cars.0')
  • Improves documentation
  • fixes a bug, if the key contains '/.' in it, then it was being misinterpreted during retrieval of data from DB
  • adds more test cases for robustness
  • seggregates test cases for better readability

v4.0.0

  • Total rewrite of the library for better maintenance and performance improvement
  • Provides extension for custom types, which allows the users to defines how the custom object has to be stored in Redis and how to revive the same back from redis
  • Now provide type support, which means that the type of data use save in jsonCache is exactly(===) the same that you get back

v3.2.1

  • Now supports redis client
  • Improves efficiency by replacing .call with .bind while initializing internal redisClient
  • fixes #7
  • removes the support for browsers (I know it was stupid for this library 😭)

v3.2.0

  • Now supports .(Dot) in object property (Ex. {'a.b': 'c'})

v3.0.0

  • Usage of typescript
  • Better seggregation of files
  • Bug fix for handling empty object and empty array

v2.4.0

  • Support for querying only the required fields of the object

v2.3.0

  • Added clearAll method, which clears all the cached Json

v2.2.0

  • Support for redis prefix keys

v2.1.0

  • Support for key expiry

v2.0.0

Breaking Changes

  • Changed callbacks to native Promises
  • required node version > 7.0.0
  • resave has been renamed to rewrite