30,000
Internal tools for a 30,000-person workforce
Search, communications and peer recognition inside a large employer internal platform.
- typescript
- react
- kubernetes
- redis
Redis does one thing extremely well: answer in microseconds with data that has already been computed. That is why it fits in three specific places - cache, queues and sessions - and sits awkwardly almost everywhere else.
The decision that matters is not installing it. It is what gets stored and when it stops being valid. A cache with no invalidation policy does not make a site faster; it makes it a site that serves old data unpredictably. The key has to include everything that changes the answer - language, permissions, deployed version - or sooner or later one user sees another user's content.
The second decision is what happens when it is not there. A cache has to be able to fail without taking the site down: the application loses speed and keeps answering. A session store or a job queue does not allow that, and this is where the high-availability topology comes in - a replica and Sentinel, so promotion is automatic and the application never has to know which node is in charge.
In practice that comes down to unglamorous things: the version pinned per environment instead of following the latest tag, the connection string injected as a secret rather than written into the image, and a memory limit with an eviction policy chosen deliberately instead of whatever the default is.
What almost nobody measures is the hit rate. A cache running at 30% hits adds a dependency and a network round trip in exchange for very little, and until it is instrumented it looks like it works because the site has not broken. Measuring hits and misses per key type is what separates a cache that earns its place from one that only occupies memory.
There is also a prior question worth asking before installing anything: why is the query you want to cache slow. Very often the reason is a missing index or a query pulling columns nobody reads, and there a cache does not fix the problem - it hides it, and adds something to maintain. Caching a query that is already fast makes sense when it runs thousands of times a minute; caching a slow one usually just covers up the real fix.
The specifics
30,000
Search, communications and peer recognition inside a large employer internal platform.
24M
Frontend, performance and production reliability on a real-time pricing platform.
How we work
The same process on a three-week engagement and on a two-year platform.
One session to understand the business process, not to show templates. We leave with priorities and a phased price.
Data model, integrations and a performance budget before the first screen is written.
Weekly releases to an environment you can visit. What gets approved gets deployed, it does not pile up.
Monitoring, verified backups and deployments anyone on the team can run.
The database is usually enough, and saying so is part of the job. Redis earns its place when an expensive query repeats often, when sessions cannot live on a single server, or when background work has to be queued. If the problem is one slow query running once per page, the fix is normally an index, not a cache.
That question decides the design. A cache must be able to fail without taking the site with it: the application falls back to the database and answers more slowly. A queue or a session store does not forgive the same way, which is why those run with Sentinel and a replica. Turning Redis into a single point of failure is the most common mistake, and it is a design mistake rather than a Redis one.
It can, and it almost never should be. Redis persists, but its durability model is not a relational database's and memory is expensive. As a cache, a queue, a counter or a session store it is excellent; as the system of record for your invoices, it is not.
By deciding invalidation before deciding the cache. Time-based expiry when the data tolerates minutes of lag, explicit invalidation on write when it does not, and a key that includes everything which changes the answer: language, permissions and deployment version. Most cache bugs are incomplete keys, not badly chosen lifetimes.
Next step
We reply within one business day with a phased scope proposal, or with the reason we are not the right studio for it.
We use one analytics cookie to see which pages get read. No advertising, no profiling, and nothing is set without your permission. Read the cookie policy