Overview of Redis
Redis (Remote Dictionary Server) is an open-source, in-memory data structure store used as a database, cache, and message broker. In high-concurrency environments, traditional relational databases often suffer from disk I/O bottlenecks and scaling limitations. Redis addresses these by keeping data in RAM and utilizing a highly efficient single-threaded event loop architecture.
Core Data Types and Use Cases
Redis supports five primary data structures. Choosing the right one is critical for optimizing performance and memory usage.
| Data Type | Structure | Key Characteristics | Common Use Cases |
|---|---|---|---|
| String | Binary-safe strings | Standard key-value pair; supports atomic increments. | Caching, session management, distributed locks. |
| Hash | Field-value pairs | Maps between string fields and string values; efficient for objects. | User profiles, shopping carts. |
| List | Linked list | Ordered collection of strings; supports head/tail operations. | Message queues, recent activity feeds. |
| Set | Unordered collection | Unique elements; supports set operations (intersections, unions). | Social tags, unique visitor (UV) tracking, blacklists. |
| Sorted Set | Ordered unique set | Every member is associated with a score for sorting. | Leaderboards, priority queues, delayed tasks. |
1. Strings: The Foundation
Strings are the most basic Redis type. They can store text, serialized objects, or even binary data up to 512MB.
Key Applications
- Atomic Counters: Use
INCRorDECRto manage global IDs or view counts across distributed systems without race conditions. - Temporary Tokens: Use
SETEXto store verification codes or session tokens that automatically expire.
# Basic string operations
SET session:user:99 "active"
GET session:user:99
EXPIRE session:user:99 3600 # Expires in 1 hour
# Atomic increment for a page view counter
INCR page:home:views
INCRBY page:home:views 5
2. Hashes: Object Mapping
Hash are ideal for representing objects because they allow you to access individual fields without fetching the entire object.
Application: Shopping Carts
By using a user ID as the key and product IDs as fields, you can manage cart quantities efficiently.
# Adding items to a cart
HSET cart:user:501 item:202 2
HSET cart:user:501 item:305 1
# Incrementing quantity
HINCRBY cart:user:501 item:202 1
# Retrieving all items in the cart
HGETALL cart:user:501
3. Lists: Sequential Data
Redis Lists are implemented via doubly linked lists, making insertions at the ends very fast (O(1)).
Application: Activity Feeds
Lists are perfect for "latest news" or "recent comments" where the order of arrival matters.
# Push new notification to the head
LPUSH notify:user:77 "Your order has shipped"
LPUSH notify:user:77 "Payment received"
# Fetch the 10 most recent notifications
LRANGE notify:user:77 0 9
# Blocking pop for simple message queues
BRPOP task:queue 30
4. Sets: Unique Collections
Sets are used when you need to store unique items and perform set-theory operations like finding common elements.
Application: Social Graphs and UV Tracking
# Adding followers
SADD following:user:A user:B user:C user:D
SADD following:user:X user:B user:D user:Z
# Find mutual friends (Intersection)
SINTER following:user:A following:user:X
# Track unique visitors per day
SADD uv:2023-10-27 "ip_address_1"
SCARD uv:2023-10-27
5. Sorted Sets (ZSets): Ranking and Priority
Sorted Sets maintain uniqueness like Sets but assign a "score" to each element, which Redis uses to keep the set ordered.
Application: Real-time Leaderboards
# Update player scores
ZADD leaderboard:gaming 5000 "PlayerAlpha"
ZADD leaderboard:gaming 7500 "PlayerBeta"
ZADD leaderboard:gaming 6200 "PlayerGamma"
# Get top 3 players
ZREVRANGE leaderboard:gaming 0 2 WITHSCORES
# Increment a score
ZINCRBY leaderboard:gaming 100 "PlayerAlpha"
Advanced Implemantation: Rate Limiting
A common scenario is limiting API calls per minute for a specific user. This can be achieved by combining strings with expiration logic.
# Strategy: Allow 5 requests per minute
# Key: rate_limit:user_id
# Logic: If key doesn't exist, SET with EXPIRE. If exists, INCR and check value.
# Example implementation logic:
# 1. Check if key exists
# 2. If not: SET rate_limit:user:101 1 EX 60
# 3. If yes: INCR rate_limit:user:101
# 4. If result > 5: Reject request
Key Management and Database Operations
Redis provides administrative commands to manage the lifecycle of keys and organizational structure.
- TTL (Time To Live): Use
TTL keyto check how many seconds remain before a key expires. - Key Patterns:
KEYS user:*finds all keys starting with "user:", thoughSCANis preferred in production to avoid blocking. - Multiple Databases: Redis instances provide 16 logical databases (0-15). Use
SELECT 1to switch. - Persistence: While in-memory, Redis can persist data via RDB (snapshots) or AOF (append-only files) to prevent data loss after a restart.