Repository files navigation

Redis Dataloader

Batching and Caching layer using Redis as the Caching layer. Redis Dataloader wraps Facebook Dataloader, adding Redis as a caching layer.

npm install redis-dataloader
or
yarn add redis-dataloader

Example

constredisClient=require('redis').createClient();// the "ioredis" module is also supported// const Redis = require('ioredis');// const redisClient = new Redis();constDataLoader=require('dataloader');constRedisDataLoader=require('redis-dataloader')({redis: redisClient});constloader=newRedisDataLoader(// set a prefix for the keys stored in redis. This way you can avoid key// collisions for different data-sets in your redis instance.'redis-key-prefix',// create a regular dataloader. This should always be set with caching disabled.newDataLoader(myBatchLoadFunction,{cache: false}),// The options here are the same as the regular dataloader options, with// the additional option "expire"{// caching here is a local in memory cache. Caching is always done// to redis.cache: true,// if set redis keys will be set to expire after this many seconds// this may be useful as a fallback for a redis cache.expire: 60,// can include a custom serialization and deserialization for// storage in redis.serialize: date=>date.getTime(),deserialize: timestamp=>newDate(timestamp),// Set this to true to return Buffer objects to the deserialize function// when using the ioredis driver.buffer: false});// load an individual item by its keyloader.load(5).then(resp=>console.log(resp));//clear an individiaul item from the local and redis cache.loader.clear(5).then(()=>{})

API Documentation

In general, RedisDataLoader has the same API as the Facebook Dataloader Api, with a few differences. Read through the Facebook Dataloader documentation and then note the differences mentioned here.

  • clear returns a promise (waits until redis succeeds at deleting the key). Facebook Dataloader's clear method is synchronous.
  • clearAll is not available (redis does not have an efficient way to do this?)
  • prime will always overwrite the cache. Facebook Dataloader will only write to its cache if a value is not already present. Prime is asyncronous and returns a Promise.
  • dataloader results must be either null or a JSON object.
  • two functions: clearLocal(key) and clearAllLocal() allow you to clear the local cache only.

Instantiation

Dependency inject a Redis Connection

constredis=require('redis').createClient();constRedisDataLoader=require('redis-dataloader')({redis: redis});

Create a new Dataloader.

Each Dataloader holds its own local in memory cache (Same as Facebook Dataloader), and additionally caches to your Redis instance.

constloader=newRedisDataLoader('<redis key prefix>','<Facebook Dataloader>','<Options>');
Redis Key Prefix

Specify a Prefix that will be appended to each key when storing in Redis.

So for example if your prefix is "bar" and you call loader.load('foo'), this key will be stored in Redis as bar:foo

Facebook Dataloader

A regular Facebook Dataloader is passed in as the second parameter. It will be used to fetch data from your underlying datastore (mongo, sql, whatever). It is very important to disable the cache on this dataloader. Redis dataloader will already do local in memory caching (unless you disable it).

Options

All the options available to Facebook Dataloader can be passed in here. An additional option called expire is also available, and will set a ttl in seconds on all keys set in redis if this option is passed.

The cacheKeyFn will default to serialize objects and arrays using json-stable-stringify and allow all other values to pass through unchanged.

buffer will pass a Buffer object to the deserialize function rather than a string. If not using the ioredis driver this will throw an error at instation.

Caching

The purpose of Redis Dataloader is to provide a caching layer in redis on top of the Facebook Dataloader. Facebook's Dataloader provides a local in memory cache. This may be ok for short lived per-request caches, but may not be sufficient if you need a long lived cache and/or you have multiple webservers that need to share data.

Redis Dataloader will additionally use the same local cache that Facebook Dataloader provides. It will first check the local cache, then check the redis cache, before finally checking your underlying datastore. This pattern may be desirable if for example you create a new DataLoader for each request. If your dataloader is long-lived you may want to disable to the local cache, and just rely on the redis cache instead

constloader=newRedisDataLoader('prefix',newDataLoader(),{cache: false});

Development

  1. Install Dependencies npm install
  2. Start Redis docker-compose stop && docker-compose rm && docker-compose build && docker-compose up -d
  3. Run Tests npm test

About

Batching and Caching layer using Redis as the Caching layer

Topics

Resources

Stars

90 stars

Watchers

5 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Redis Dataloader

Batching and Caching layer using Redis as the Caching layer. Redis Dataloader wraps Facebook Dataloader, adding Redis as a caching layer.

npm install redis-dataloader
or
yarn add redis-dataloader

Example

constredisClient=require('redis').createClient();// the "ioredis" module is also supported// const Redis = require('ioredis');// const redisClient = new Redis();constDataLoader=require('dataloader');constRedisDataLoader=require('redis-dataloader')({redis: redisClient});constloader=newRedisDataLoader(// set a prefix for the keys stored in redis. This way you can avoid key// collisions for different data-sets in your redis instance.'redis-key-prefix',// create a regular dataloader. This should always be set with caching disabled.newDataLoader(myBatchLoadFunction,{cache: false}),// The options here are the same as the regular dataloader options, with// the additional option "expire"{// caching here is a local in memory cache. Caching is always done// to redis.cache: true,// if set redis keys will be set to expire after this many seconds// this may be useful as a fallback for a redis cache.expire: 60,// can include a custom serialization and deserialization for// storage in redis.serialize: date=>date.getTime(),deserialize: timestamp=>newDate(timestamp),// Set this to true to return Buffer objects to the deserialize function// when using the ioredis driver.buffer: false});// load an individual item by its keyloader.load(5).then(resp=>console.log(resp));//clear an individiaul item from the local and redis cache.loader.clear(5).then(()=>{})

API Documentation

In general, RedisDataLoader has the same API as the Facebook Dataloader Api, with a few differences. Read through the Facebook Dataloader documentation and then note the differences mentioned here.

  • clear returns a promise (waits until redis succeeds at deleting the key). Facebook Dataloader's clear method is synchronous.
  • clearAll is not available (redis does not have an efficient way to do this?)
  • prime will always overwrite the cache. Facebook Dataloader will only write to its cache if a value is not already present. Prime is asyncronous and returns a Promise.
  • dataloader results must be either null or a JSON object.
  • two functions: clearLocal(key) and clearAllLocal() allow you to clear the local cache only.

Instantiation

Dependency inject a Redis Connection

constredis=require('redis').createClient();constRedisDataLoader=require('redis-dataloader')({redis: redis});

Create a new Dataloader.

Each Dataloader holds its own local in memory cache (Same as Facebook Dataloader), and additionally caches to your Redis instance.

constloader=newRedisDataLoader('<redis key prefix>','<Facebook Dataloader>','<Options>');
Redis Key Prefix

Specify a Prefix that will be appended to each key when storing in Redis.

So for example if your prefix is "bar" and you call loader.load('foo'), this key will be stored in Redis as bar:foo

Facebook Dataloader

A regular Facebook Dataloader is passed in as the second parameter. It will be used to fetch data from your underlying datastore (mongo, sql, whatever). It is very important to disable the cache on this dataloader. Redis dataloader will already do local in memory caching (unless you disable it).

Options

All the options available to Facebook Dataloader can be passed in here. An additional option called expire is also available, and will set a ttl in seconds on all keys set in redis if this option is passed.

The cacheKeyFn will default to serialize objects and arrays using json-stable-stringify and allow all other values to pass through unchanged.

buffer will pass a Buffer object to the deserialize function rather than a string. If not using the ioredis driver this will throw an error at instation.

Caching

The purpose of Redis Dataloader is to provide a caching layer in redis on top of the Facebook Dataloader. Facebook's Dataloader provides a local in memory cache. This may be ok for short lived per-request caches, but may not be sufficient if you need a long lived cache and/or you have multiple webservers that need to share data.

Redis Dataloader will additionally use the same local cache that Facebook Dataloader provides. It will first check the local cache, then check the redis cache, before finally checking your underlying datastore. This pattern may be desirable if for example you create a new DataLoader for each request. If your dataloader is long-lived you may want to disable to the local cache, and just rely on the redis cache instead

constloader=newRedisDataLoader('prefix',newDataLoader(),{cache: false});

Development

  1. Install Dependencies npm install
  2. Start Redis docker-compose stop && docker-compose rm && docker-compose build && docker-compose up -d
  3. Run Tests npm test

About

Batching and Caching layer using Redis as the Caching layer

Topics

Resources

Stars

90 stars

Watchers

5 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Redis Dataloader

Batching and Caching layer using Redis as the Caching layer. Redis Dataloader wraps Facebook Dataloader, adding Redis as a caching layer.

npm install redis-dataloader
or
yarn add redis-dataloader

Example

constredisClient=require('redis').createClient();// the "ioredis" module is also supported// const Redis = require('ioredis');// const redisClient = new Redis();constDataLoader=require('dataloader');constRedisDataLoader=require('redis-dataloader')({redis: redisClient});constloader=newRedisDataLoader(// set a prefix for the keys stored in redis. This way you can avoid key// collisions for different data-sets in your redis instance.'redis-key-prefix',// create a regular dataloader. This should always be set with caching disabled.newDataLoader(myBatchLoadFunction,{cache: false}),// The options here are the same as the regular dataloader options, with// the additional option "expire"{// caching here is a local in memory cache. Caching is always done// to redis.cache: true,// if set redis keys will be set to expire after this many seconds// this may be useful as a fallback for a redis cache.expire: 60,// can include a custom serialization and deserialization for// storage in redis.serialize: date=>date.getTime(),deserialize: timestamp=>newDate(timestamp),// Set this to true to return Buffer objects to the deserialize function// when using the ioredis driver.buffer: false});// load an individual item by its keyloader.load(5).then(resp=>console.log(resp));//clear an individiaul item from the local and redis cache.loader.clear(5).then(()=>{})

API Documentation

In general, RedisDataLoader has the same API as the Facebook Dataloader Api, with a few differences. Read through the Facebook Dataloader documentation and then note the differences mentioned here.

  • clear returns a promise (waits until redis succeeds at deleting the key). Facebook Dataloader's clear method is synchronous.
  • clearAll is not available (redis does not have an efficient way to do this?)
  • prime will always overwrite the cache. Facebook Dataloader will only write to its cache if a value is not already present. Prime is asyncronous and returns a Promise.
  • dataloader results must be either null or a JSON object.
  • two functions: clearLocal(key) and clearAllLocal() allow you to clear the local cache only.

Instantiation

Dependency inject a Redis Connection

constredis=require('redis').createClient();constRedisDataLoader=require('redis-dataloader')({redis: redis});

Create a new Dataloader.

Each Dataloader holds its own local in memory cache (Same as Facebook Dataloader), and additionally caches to your Redis instance.

constloader=newRedisDataLoader('<redis key prefix>','<Facebook Dataloader>','<Options>');
Redis Key Prefix

Specify a Prefix that will be appended to each key when storing in Redis.

So for example if your prefix is "bar" and you call loader.load('foo'), this key will be stored in Redis as bar:foo

Facebook Dataloader

A regular Facebook Dataloader is passed in as the second parameter. It will be used to fetch data from your underlying datastore (mongo, sql, whatever). It is very important to disable the cache on this dataloader. Redis dataloader will already do local in memory caching (unless you disable it).

Options

All the options available to Facebook Dataloader can be passed in here. An additional option called expire is also available, and will set a ttl in seconds on all keys set in redis if this option is passed.

The cacheKeyFn will default to serialize objects and arrays using json-stable-stringify and allow all other values to pass through unchanged.

buffer will pass a Buffer object to the deserialize function rather than a string. If not using the ioredis driver this will throw an error at instation.

Caching

The purpose of Redis Dataloader is to provide a caching layer in redis on top of the Facebook Dataloader. Facebook's Dataloader provides a local in memory cache. This may be ok for short lived per-request caches, but may not be sufficient if you need a long lived cache and/or you have multiple webservers that need to share data.

Redis Dataloader will additionally use the same local cache that Facebook Dataloader provides. It will first check the local cache, then check the redis cache, before finally checking your underlying datastore. This pattern may be desirable if for example you create a new DataLoader for each request. If your dataloader is long-lived you may want to disable to the local cache, and just rely on the redis cache instead

constloader=newRedisDataLoader('prefix',newDataLoader(),{cache: false});

Development

  1. Install Dependencies npm install
  2. Start Redis docker-compose stop && docker-compose rm && docker-compose build && docker-compose up -d
  3. Run Tests npm test

About

Batching and Caching layer using Redis as the Caching layer

Topics

Resources

Stars

90 stars

Watchers

5 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Redis Dataloader

Batching and Caching layer using Redis as the Caching layer. Redis Dataloader wraps Facebook Dataloader, adding Redis as a caching layer.

npm install redis-dataloader
or
yarn add redis-dataloader

Example

constredisClient=require('redis').createClient();// the "ioredis" module is also supported// const Redis = require('ioredis');// const redisClient = new Redis();constDataLoader=require('dataloader');constRedisDataLoader=require('redis-dataloader')({redis: redisClient});constloader=newRedisDataLoader(// set a prefix for the keys stored in redis. This way you can avoid key// collisions for different data-sets in your redis instance.'redis-key-prefix',// create a regular dataloader. This should always be set with caching disabled.newDataLoader(myBatchLoadFunction,{cache: false}),// The options here are the same as the regular dataloader options, with// the additional option "expire"{// caching here is a local in memory cache. Caching is always done// to redis.cache: true,// if set redis keys will be set to expire after this many seconds// this may be useful as a fallback for a redis cache.expire: 60,// can include a custom serialization and deserialization for// storage in redis.serialize: date=>date.getTime(),deserialize: timestamp=>newDate(timestamp),// Set this to true to return Buffer objects to the deserialize function// when using the ioredis driver.buffer: false});// load an individual item by its keyloader.load(5).then(resp=>console.log(resp));//clear an individiaul item from the local and redis cache.loader.clear(5).then(()=>{})

API Documentation

In general, RedisDataLoader has the same API as the Facebook Dataloader Api, with a few differences. Read through the Facebook Dataloader documentation and then note the differences mentioned here.

  • clear returns a promise (waits until redis succeeds at deleting the key). Facebook Dataloader's clear method is synchronous.
  • clearAll is not available (redis does not have an efficient way to do this?)
  • prime will always overwrite the cache. Facebook Dataloader will only write to its cache if a value is not already present. Prime is asyncronous and returns a Promise.
  • dataloader results must be either null or a JSON object.
  • two functions: clearLocal(key) and clearAllLocal() allow you to clear the local cache only.

Instantiation

Dependency inject a Redis Connection

constredis=require('redis').createClient();constRedisDataLoader=require('redis-dataloader')({redis: redis});

Create a new Dataloader.

Each Dataloader holds its own local in memory cache (Same as Facebook Dataloader), and additionally caches to your Redis instance.

constloader=newRedisDataLoader('<redis key prefix>','<Facebook Dataloader>','<Options>');
Redis Key Prefix

Specify a Prefix that will be appended to each key when storing in Redis.

So for example if your prefix is "bar" and you call loader.load('foo'), this key will be stored in Redis as bar:foo

Facebook Dataloader

A regular Facebook Dataloader is passed in as the second parameter. It will be used to fetch data from your underlying datastore (mongo, sql, whatever). It is very important to disable the cache on this dataloader. Redis dataloader will already do local in memory caching (unless you disable it).

Options

All the options available to Facebook Dataloader can be passed in here. An additional option called expire is also available, and will set a ttl in seconds on all keys set in redis if this option is passed.

The cacheKeyFn will default to serialize objects and arrays using json-stable-stringify and allow all other values to pass through unchanged.

buffer will pass a Buffer object to the deserialize function rather than a string. If not using the ioredis driver this will throw an error at instation.

Caching

The purpose of Redis Dataloader is to provide a caching layer in redis on top of the Facebook Dataloader. Facebook's Dataloader provides a local in memory cache. This may be ok for short lived per-request caches, but may not be sufficient if you need a long lived cache and/or you have multiple webservers that need to share data.

Redis Dataloader will additionally use the same local cache that Facebook Dataloader provides. It will first check the local cache, then check the redis cache, before finally checking your underlying datastore. This pattern may be desirable if for example you create a new DataLoader for each request. If your dataloader is long-lived you may want to disable to the local cache, and just rely on the redis cache instead

constloader=newRedisDataLoader('prefix',newDataLoader(),{cache: false});

Development

  1. Install Dependencies npm install
  2. Start Redis docker-compose stop && docker-compose rm && docker-compose build && docker-compose up -d
  3. Run Tests npm test

About

Batching and Caching layer using Redis as the Caching layer

Topics

Resources

Stars

90 stars

Watchers

5 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Redis Dataloader

Batching and Caching layer using Redis as the Caching layer. Redis Dataloader wraps Facebook Dataloader, adding Redis as a caching layer.

npm install redis-dataloader
or
yarn add redis-dataloader

Example

constredisClient=require('redis').createClient();// the "ioredis" module is also supported// const Redis = require('ioredis');// const redisClient = new Redis();constDataLoader=require('dataloader');constRedisDataLoader=require('redis-dataloader')({redis: redisClient});constloader=newRedisDataLoader(// set a prefix for the keys stored in redis. This way you can avoid key// collisions for different data-sets in your redis instance.'redis-key-prefix',// create a regular dataloader. This should always be set with caching disabled.newDataLoader(myBatchLoadFunction,{cache: false}),// The options here are the same as the regular dataloader options, with// the additional option "expire"{// caching here is a local in memory cache. Caching is always done// to redis.cache: true,// if set redis keys will be set to expire after this many seconds// this may be useful as a fallback for a redis cache.expire: 60,// can include a custom serialization and deserialization for// storage in redis.serialize: date=>date.getTime(),deserialize: timestamp=>newDate(timestamp),// Set this to true to return Buffer objects to the deserialize function// when using the ioredis driver.buffer: false});// load an individual item by its keyloader.load(5).then(resp=>console.log(resp));//clear an individiaul item from the local and redis cache.loader.clear(5).then(()=>{})

API Documentation

In general, RedisDataLoader has the same API as the Facebook Dataloader Api, with a few differences. Read through the Facebook Dataloader documentation and then note the differences mentioned here.

  • clear returns a promise (waits until redis succeeds at deleting the key). Facebook Dataloader's clear method is synchronous.
  • clearAll is not available (redis does not have an efficient way to do this?)
  • prime will always overwrite the cache. Facebook Dataloader will only write to its cache if a value is not already present. Prime is asyncronous and returns a Promise.
  • dataloader results must be either null or a JSON object.
  • two functions: clearLocal(key) and clearAllLocal() allow you to clear the local cache only.

Instantiation

Dependency inject a Redis Connection

constredis=require('redis').createClient();constRedisDataLoader=require('redis-dataloader')({redis: redis});

Create a new Dataloader.

Each Dataloader holds its own local in memory cache (Same as Facebook Dataloader), and additionally caches to your Redis instance.

constloader=newRedisDataLoader('<redis key prefix>','<Facebook Dataloader>','<Options>');
Redis Key Prefix

Specify a Prefix that will be appended to each key when storing in Redis.

So for example if your prefix is "bar" and you call loader.load('foo'), this key will be stored in Redis as bar:foo

Facebook Dataloader

A regular Facebook Dataloader is passed in as the second parameter. It will be used to fetch data from your underlying datastore (mongo, sql, whatever). It is very important to disable the cache on this dataloader. Redis dataloader will already do local in memory caching (unless you disable it).

Options

All the options available to Facebook Dataloader can be passed in here. An additional option called expire is also available, and will set a ttl in seconds on all keys set in redis if this option is passed.

The cacheKeyFn will default to serialize objects and arrays using json-stable-stringify and allow all other values to pass through unchanged.

buffer will pass a Buffer object to the deserialize function rather than a string. If not using the ioredis driver this will throw an error at instation.

Caching

The purpose of Redis Dataloader is to provide a caching layer in redis on top of the Facebook Dataloader. Facebook's Dataloader provides a local in memory cache. This may be ok for short lived per-request caches, but may not be sufficient if you need a long lived cache and/or you have multiple webservers that need to share data.

Redis Dataloader will additionally use the same local cache that Facebook Dataloader provides. It will first check the local cache, then check the redis cache, before finally checking your underlying datastore. This pattern may be desirable if for example you create a new DataLoader for each request. If your dataloader is long-lived you may want to disable to the local cache, and just rely on the redis cache instead

constloader=newRedisDataLoader('prefix',newDataLoader(),{cache: false});

Development

  1. Install Dependencies npm install
  2. Start Redis docker-compose stop && docker-compose rm && docker-compose build && docker-compose up -d
  3. Run Tests npm test

About

Batching and Caching layer using Redis as the Caching layer

Topics

Resources

Stars

90 stars

Watchers

5 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Redis Dataloader

Batching and Caching layer using Redis as the Caching layer. Redis Dataloader wraps Facebook Dataloader, adding Redis as a caching layer.

npm install redis-dataloader
or
yarn add redis-dataloader

Example

constredisClient=require('redis').createClient();// the "ioredis" module is also supported// const Redis = require('ioredis');// const redisClient = new Redis();constDataLoader=require('dataloader');constRedisDataLoader=require('redis-dataloader')({redis: redisClient});constloader=newRedisDataLoader(// set a prefix for the keys stored in redis. This way you can avoid key// collisions for different data-sets in your redis instance.'redis-key-prefix',// create a regular dataloader. This should always be set with caching disabled.newDataLoader(myBatchLoadFunction,{cache: false}),// The options here are the same as the regular dataloader options, with// the additional option "expire"{// caching here is a local in memory cache. Caching is always done// to redis.cache: true,// if set redis keys will be set to expire after this many seconds// this may be useful as a fallback for a redis cache.expire: 60,// can include a custom serialization and deserialization for// storage in redis.serialize: date=>date.getTime(),deserialize: timestamp=>newDate(timestamp),// Set this to true to return Buffer objects to the deserialize function// when using the ioredis driver.buffer: false});// load an individual item by its keyloader.load(5).then(resp=>console.log(resp));//clear an individiaul item from the local and redis cache.loader.clear(5).then(()=>{})

API Documentation

In general, RedisDataLoader has the same API as the Facebook Dataloader Api, with a few differences. Read through the Facebook Dataloader documentation and then note the differences mentioned here.

  • clear returns a promise (waits until redis succeeds at deleting the key). Facebook Dataloader's clear method is synchronous.
  • clearAll is not available (redis does not have an efficient way to do this?)
  • prime will always overwrite the cache. Facebook Dataloader will only write to its cache if a value is not already present. Prime is asyncronous and returns a Promise.
  • dataloader results must be either null or a JSON object.
  • two functions: clearLocal(key) and clearAllLocal() allow you to clear the local cache only.

Instantiation

Dependency inject a Redis Connection

constredis=require('redis').createClient();constRedisDataLoader=require('redis-dataloader')({redis: redis});

Create a new Dataloader.

Each Dataloader holds its own local in memory cache (Same as Facebook Dataloader), and additionally caches to your Redis instance.

constloader=newRedisDataLoader('<redis key prefix>','<Facebook Dataloader>','<Options>');
Redis Key Prefix

Specify a Prefix that will be appended to each key when storing in Redis.

So for example if your prefix is "bar" and you call loader.load('foo'), this key will be stored in Redis as bar:foo

Facebook Dataloader

A regular Facebook Dataloader is passed in as the second parameter. It will be used to fetch data from your underlying datastore (mongo, sql, whatever). It is very important to disable the cache on this dataloader. Redis dataloader will already do local in memory caching (unless you disable it).

Options

All the options available to Facebook Dataloader can be passed in here. An additional option called expire is also available, and will set a ttl in seconds on all keys set in redis if this option is passed.

The cacheKeyFn will default to serialize objects and arrays using json-stable-stringify and allow all other values to pass through unchanged.

buffer will pass a Buffer object to the deserialize function rather than a string. If not using the ioredis driver this will throw an error at instation.

Caching

The purpose of Redis Dataloader is to provide a caching layer in redis on top of the Facebook Dataloader. Facebook's Dataloader provides a local in memory cache. This may be ok for short lived per-request caches, but may not be sufficient if you need a long lived cache and/or you have multiple webservers that need to share data.

Redis Dataloader will additionally use the same local cache that Facebook Dataloader provides. It will first check the local cache, then check the redis cache, before finally checking your underlying datastore. This pattern may be desirable if for example you create a new DataLoader for each request. If your dataloader is long-lived you may want to disable to the local cache, and just rely on the redis cache instead

constloader=newRedisDataLoader('prefix',newDataLoader(),{cache: false});

Development

  1. Install Dependencies npm install
  2. Start Redis docker-compose stop && docker-compose rm && docker-compose build && docker-compose up -d
  3. Run Tests npm test

About

Batching and Caching layer using Redis as the Caching layer

Topics

Resources

Stars

90 stars

Watchers

5 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Redis Dataloader

Batching and Caching layer using Redis as the Caching layer. Redis Dataloader wraps Facebook Dataloader, adding Redis as a caching layer.

npm install redis-dataloader
or
yarn add redis-dataloader

Example

constredisClient=require('redis').createClient();// the "ioredis" module is also supported// const Redis = require('ioredis');// const redisClient = new Redis();constDataLoader=require('dataloader');constRedisDataLoader=require('redis-dataloader')({redis: redisClient});constloader=newRedisDataLoader(// set a prefix for the keys stored in redis. This way you can avoid key// collisions for different data-sets in your redis instance.'redis-key-prefix',// create a regular dataloader. This should always be set with caching disabled.newDataLoader(myBatchLoadFunction,{cache: false}),// The options here are the same as the regular dataloader options, with// the additional option "expire"{// caching here is a local in memory cache. Caching is always done// to redis.cache: true,// if set redis keys will be set to expire after this many seconds// this may be useful as a fallback for a redis cache.expire: 60,// can include a custom serialization and deserialization for// storage in redis.serialize: date=>date.getTime(),deserialize: timestamp=>newDate(timestamp),// Set this to true to return Buffer objects to the deserialize function// when using the ioredis driver.buffer: false});// load an individual item by its keyloader.load(5).then(resp=>console.log(resp));//clear an individiaul item from the local and redis cache.loader.clear(5).then(()=>{})

API Documentation

In general, RedisDataLoader has the same API as the Facebook Dataloader Api, with a few differences. Read through the Facebook Dataloader documentation and then note the differences mentioned here.

  • clear returns a promise (waits until redis succeeds at deleting the key). Facebook Dataloader's clear method is synchronous.
  • clearAll is not available (redis does not have an efficient way to do this?)
  • prime will always overwrite the cache. Facebook Dataloader will only write to its cache if a value is not already present. Prime is asyncronous and returns a Promise.
  • dataloader results must be either null or a JSON object.
  • two functions: clearLocal(key) and clearAllLocal() allow you to clear the local cache only.

Instantiation

Dependency inject a Redis Connection

constredis=require('redis').createClient();constRedisDataLoader=require('redis-dataloader')({redis: redis});

Create a new Dataloader.

Each Dataloader holds its own local in memory cache (Same as Facebook Dataloader), and additionally caches to your Redis instance.

constloader=newRedisDataLoader('<redis key prefix>','<Facebook Dataloader>','<Options>');
Redis Key Prefix

Specify a Prefix that will be appended to each key when storing in Redis.

So for example if your prefix is "bar" and you call loader.load('foo'), this key will be stored in Redis as bar:foo

Facebook Dataloader

A regular Facebook Dataloader is passed in as the second parameter. It will be used to fetch data from your underlying datastore (mongo, sql, whatever). It is very important to disable the cache on this dataloader. Redis dataloader will already do local in memory caching (unless you disable it).

Options

All the options available to Facebook Dataloader can be passed in here. An additional option called expire is also available, and will set a ttl in seconds on all keys set in redis if this option is passed.

The cacheKeyFn will default to serialize objects and arrays using json-stable-stringify and allow all other values to pass through unchanged.

buffer will pass a Buffer object to the deserialize function rather than a string. If not using the ioredis driver this will throw an error at instation.

Caching

The purpose of Redis Dataloader is to provide a caching layer in redis on top of the Facebook Dataloader. Facebook's Dataloader provides a local in memory cache. This may be ok for short lived per-request caches, but may not be sufficient if you need a long lived cache and/or you have multiple webservers that need to share data.

Redis Dataloader will additionally use the same local cache that Facebook Dataloader provides. It will first check the local cache, then check the redis cache, before finally checking your underlying datastore. This pattern may be desirable if for example you create a new DataLoader for each request. If your dataloader is long-lived you may want to disable to the local cache, and just rely on the redis cache instead

constloader=newRedisDataLoader('prefix',newDataLoader(),{cache: false});

Development

  1. Install Dependencies npm install
  2. Start Redis docker-compose stop && docker-compose rm && docker-compose build && docker-compose up -d
  3. Run Tests npm test

About

Batching and Caching layer using Redis as the Caching layer

Topics

Resources

Stars

90 stars

Watchers

5 watching

Forks

Releases

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Redis Dataloader

Batching and Caching layer using Redis as the Caching layer. Redis Dataloader wraps Facebook Dataloader, adding Redis as a caching layer.

npm install redis-dataloader
or
yarn add redis-dataloader

Example

constredisClient=require('redis').createClient();// the "ioredis" module is also supported// const Redis = require('ioredis');// const redisClient = new Redis();constDataLoader=require('dataloader');constRedisDataLoader=require('redis-dataloader')({redis: redisClient});constloader=newRedisDataLoader(// set a prefix for the keys stored in redis. This way you can avoid key// collisions for different data-sets in your redis instance.'redis-key-prefix',// create a regular dataloader. This should always be set with caching disabled.newDataLoader(myBatchLoadFunction,{cache: false}),// The options here are the same as the regular dataloader options, with// the additional option "expire"{// caching here is a local in memory cache. Caching is always done// to redis.cache: true,// if set redis keys will be set to expire after this many seconds// this may be useful as a fallback for a redis cache.expire: 60,// can include a custom serialization and deserialization for// storage in redis.serialize: date=>date.getTime(),deserialize: timestamp=>newDate(timestamp),// Set this to true to return Buffer objects to the deserialize function// when using the ioredis driver.buffer: false});// load an individual item by its keyloader.load(5).then(resp=>console.log(resp));//clear an individiaul item from the local and redis cache.loader.clear(5).then(()=>{})

API Documentation

In general, RedisDataLoader has the same API as the Facebook Dataloader Api, with a few differences. Read through the Facebook Dataloader documentation and then note the differences mentioned here.

  • clear returns a promise (waits until redis succeeds at deleting the key). Facebook Dataloader's clear method is synchronous.
  • clearAll is not available (redis does not have an efficient way to do this?)
  • prime will always overwrite the cache. Facebook Dataloader will only write to its cache if a value is not already present. Prime is asyncronous and returns a Promise.
  • dataloader results must be either null or a JSON object.
  • two functions: clearLocal(key) and clearAllLocal() allow you to clear the local cache only.

Instantiation

Dependency inject a Redis Connection

constredis=require('redis').createClient();constRedisDataLoader=require('redis-dataloader')({redis: redis});

Create a new Dataloader.

Each Dataloader holds its own local in memory cache (Same as Facebook Dataloader), and additionally caches to your Redis instance.

constloader=newRedisDataLoader('<redis key prefix>','<Facebook Dataloader>','<Options>');
Redis Key Prefix

Specify a Prefix that will be appended to each key when storing in Redis.

So for example if your prefix is "bar" and you call loader.load('foo'), this key will be stored in Redis as bar:foo

Facebook Dataloader

A regular Facebook Dataloader is passed in as the second parameter. It will be used to fetch data from your underlying datastore (mongo, sql, whatever). It is very important to disable the cache on this dataloader. Redis dataloader will already do local in memory caching (unless you disable it).

Options

All the options available to Facebook Dataloader can be passed in here. An additional option called expire is also available, and will set a ttl in seconds on all keys set in redis if this option is passed.

The cacheKeyFn will default to serialize objects and arrays using json-stable-stringify and allow all other values to pass through unchanged.

buffer will pass a Buffer object to the deserialize function rather than a string. If not using the ioredis driver this will throw an error at instation.

Caching

The purpose of Redis Dataloader is to provide a caching layer in redis on top of the Facebook Dataloader. Facebook's Dataloader provides a local in memory cache. This may be ok for short lived per-request caches, but may not be sufficient if you need a long lived cache and/or you have multiple webservers that need to share data.

Redis Dataloader will additionally use the same local cache that Facebook Dataloader provides. It will first check the local cache, then check the redis cache, before finally checking your underlying datastore. This pattern may be desirable if for example you create a new DataLoader for each request. If your dataloader is long-lived you may want to disable to the local cache, and just rely on the redis cache instead

constloader=newRedisDataLoader('prefix',newDataLoader(),{cache: false});

Development

  1. Install Dependencies npm install
  2. Start Redis docker-compose stop && docker-compose rm && docker-compose build && docker-compose up -d
  3. Run Tests npm test

About

Batching and Caching layer using Redis as the Caching layer

Topics

Resources

Stars

90 stars

Watchers

5 watching

Forks

Releases

Used by

Contributors

Languages