Redis Patterns (Pub/Sub, Sorted Sets, Lua)
Also Known As
Redis usage patterns
Redis cache
Redis data structures
TL;DR
Beyond key-value caching, Redis enables queues, leaderboards, rate limiting, pub/sub messaging, and distributed locks via its rich data structures.
Explanation
Redis data structures enable sophisticated patterns: Sorted Sets (ZADD/ZRANGE) for leaderboards and priority queues; Lists (LPUSH/BRPOP) for FIFO job queues; Sets for unique visitor counting; Hashes for session storage; INCR/EXPIRE for atomic rate limiting counters; Pub/Sub for real-time notifications; Lua scripts for atomic multi-step operations without round-trips; and SET key value NX EX for distributed locks (Redlock for multi-node). Redis Streams (XADD/XREAD) provide durable message queues with consumer groups, persistent delivery, and acknowledgement. PHP clients: Predis (pure PHP) and phpredis (C extension, faster).
Common Misconception
✗ Redis is just a faster alternative to Memcached for caching. Redis supports rich data structures (sorted sets, streams, pub/sub, Lua scripting) enabling rate limiting, leaderboards, distributed locks, and message queues — far beyond simple key-value caching.
Why It Matters
Redis is an in-memory data structure store — beyond simple key-value caching it supports atomic operations, pub/sub, sorted sets, and streams that solve common distributed systems problems elegantly.
Common Mistakes
- Using Redis as a primary database without persistence configured — data is lost on restart without RDB/AOF.
- Not setting TTLs on cached keys — Redis fills memory and starts evicting keys unpredictably.
- Using KEYS * in production — it blocks Redis while scanning all keys; use SCAN instead.
- Not using pipelines for multiple sequential Redis commands — each round trip adds latency.
Code Examples
✗ Vulnerable
// N sequential Redis calls — N round trips:
foreach ($userIds as $id) {
$name = $redis->get("user:$id:name"); // 1 round trip per user
}
// Pipeline — 1 round trip for all:
$pipe = $redis->pipeline();
foreach ($userIds as $id) { $pipe->get("user:$id:name"); }
$names = $pipe->execute();
✓ Fixed
// String — simple cache
$redis->set('user:42:name', 'Alice', ['ex' => 300]);
// Hash — object storage without serialisation
$redis->hSet('user:42', 'name', 'Alice');
$redis->hSet('user:42', 'email', 'alice@example.com');
$name = $redis->hGet('user:42', 'name');
// Sorted set — leaderboard
$redis->zAdd('leaderboard', 1500, 'alice');
$top10 = $redis->zRevRange('leaderboard', 0, 9, true); // with scores
// List — simple queue
$redis->lPush('email_queue', json_encode($message));
$job = $redis->rPop('email_queue');
// Atomic counter — rate limiting
$redis->incr('api_hits:' . date('YmdH') . ':' . $ip);
References
Tags
🤝 Adopt this term
£79/year · your link shown here
Added
15 Mar 2026
Edited
22 Mar 2026
Views
30
🤖 AI Guestbook educational data only
|
|
Last 30 days
Agents 0
No pings yet today
No pings yesterday
Perplexity 9
Amazonbot 8
Ahrefs 2
Unknown AI 2
Google 2
SEMrush 1
Also referenced
How they use it
crawler 23
crawler_json 1
Related categories
⚡
DEV INTEL
Tools & Severity
🟡 Medium
⚙ Fix effort: Medium
⚡ Quick Fix
Use Redis for sessions, cache, queues, and rate limiting — pipeline multiple commands to reduce round trips; use connection pooling via phpredis or predis
📦 Applies To
PHP 5.0+
web
cli
queue-worker
laravel
symfony
🔍 Detection Hints
Multiple individual Redis calls in a loop that could be pipelined or use MGET/MSET
Auto-detectable:
✗ No
laravel-debugbar
redis-insight
⚠ Related Problems
🤖 AI Agent
Confidence: Medium
False Positives: Medium
✗ Manual fix
Fix: Medium
Context: File
Tests: Update