← CodeClarityLab Home
Browse by Category
+ added · updated 7d
← Back to glossary

Redis Patterns (Pub/Sub, Sorted Sets, Lua)

performance PHP 5.0+ Intermediate

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);

Added 15 Mar 2026
Edited 22 Mar 2026
Views 30
Rate this term
No ratings yet
🤖 AI Guestbook educational data only
| |
Last 30 days
0 pings F 2 pings S 0 pings S 1 ping M 0 pings T 0 pings W 0 pings T 0 pings F 1 ping S 2 pings S 0 pings M 0 pings T 0 pings W 0 pings T 0 pings F 2 pings S 0 pings S 0 pings M 0 pings T 1 ping W 0 pings T 0 pings F 1 ping S 1 ping S 0 pings M 0 pings T 0 pings W 0 pings T 0 pings F 0 pings S
No pings yet today
No pings yesterday
Perplexity 9 Amazonbot 8 Ahrefs 2 Unknown AI 2 Google 2 SEMrush 1
crawler 23 crawler_json 1
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
🔗 Prerequisites
🔍 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

✓ schema.org compliant