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 🙏

© 2026 – Pkg Stats / Ryan Hefner

ioredis-cache-aside

v0.1.0

Published

Tiny cache-aside helper for ioredis that degrades gracefully when Redis is down.

Readme

ioredis-cache-aside

Tiny cache-aside helper for ioredis that degrades gracefully when Redis is down. If Redis is unreachable, reads fall through to your source and writes are skipped — your app keeps serving instead of throwing.

No global client, no framework assumptions, one peer dependency. ~70 lines.

The problem

The cache-aside pattern is easy to write and easy to get subtly wrong:

const cached = await redis.get(key);
if (cached) return JSON.parse(cached);
const fresh = await fetchFromDb();
await redis.set(key, JSON.stringify(fresh)); // ← if Redis is down, this throws and 500s your request
return fresh;

You end up hand-rolling try/catch fallbacks and a SCAN loop for pattern invalidation in every project. This packages that once, correctly.

Install

npm install ioredis-cache-aside ioredis

Usage

import Redis from "ioredis";
import { createCache } from "ioredis-cache-aside";

const cache = createCache(new Redis(process.env.REDIS_URL), { ttl: 300 });

// Get-or-fetch. Caches the result; returns it from cache next time.
const user = await cache.cached(`user:${id}`, () => db.user.findUnique({ where: { id } }));

// After a mutation, drop the stale entries.
await cache.invalidate(`user:${id}`);
await cache.invalidatePattern("user:*"); // uses SCAN, not the blocking KEYS

Graceful degradation

If Redis throws (down, timeout, network blip), cached() simply runs your fetcher and returns the value. Caching is best-effort, never a hard dependency:

// Redis unreachable → no error, value still returned from the source
const value = await cache.cached("k", () => fetchFromSource());

API

| Method | Behavior | | --- | --- | | createCache(redis, { ttl? }) | Build a cache bound to your ioredis client. ttl defaults to 300s. | | cached(key, fetcher, ttl?) | Return cached JSON, else run fetcher, cache it, return it. | | invalidate(...keys) | Delete exact keys. | | invalidatePattern(pattern) | Delete every key matching a glob (via non-blocking SCAN). |

All methods swallow Redis errors so a cache outage never breaks the request path.

License

MIT © Keneth Baranduda