Back to Redis Course
Module 2
📦 Redis Data Types
Master data modeling in Redis with its powerful built-in data structures.

Strings
The most basic Redis data type. Can store text, numbers, or serialized objects up to 512MB.
Common Use Cases
🔢
Counters
🚩
Flags
💾
Cached Objects
String Commands
# Basic operations
SET user:1:name "Alice"
GET user:1:name # "Alice"# Atomic counters
SET page:views 0
INCR page:views # 1
INCRBY page:views 10# 11
DECR page:views # 10# Caching JSON objects
SET user:1:profile '{"name":"Alice","age":30}'
GET user:1:profile
# Append to string
APPEND log:errors "Error at 10:00\n"# Multiple keys at once
MSET user:1:name "Alice" user:1:email "alice@test.com"
MGET user:1:name user:1:emailHashes
Maps between string fields and string values — perfect for representing objects.
Use Cases: User Profiles, Config Storage
Hash Commands
# Store user profile as hash
HSET user:1001 name "John Doe" email "john@example.com" age 28# Get single field
HGET user:1001 name # "John Doe"# Get multiple fields
HMGET user:1001 name email # ["John Doe", "john@example.com"]# Get all fields and values
HGETALL user:1001
# 1) "name"# 2) "John Doe"# 3) "email"# 4) "john@example.com"# 5) "age"# 6) "28"# Increment numeric field
HINCRBY user:1001 age 1# 29# Check field existence
HEXISTS user:1001 phone # 0# Delete field
HDEL user:1001 age✅ Why Hashes over JSON Strings?
- Update individual fields without fetching entire object
- Atomic field-level operations
- More memory efficient for small objects
Lists
Ordered collection of strings. Implemented as linked lists — O(1) for head/tail operations.
Use Cases: Queues, Task Pipelines, Activity Feeds
List Commands
# Push to list (left = head, right = tail)
LPUSH queue:emails "email1""email2""email3"
RPUSH queue:emails "email4"# Pop from list
LPOP queue:emails # "email3" (LIFO from left)
RPOP queue:emails # "email4" (from right)# Blocking pop (wait for data) - great for workers!
BRPOP queue:jobs 30# Wait up to 30 seconds# Get range (0-based, -1 = last element)
LRANGE queue:emails 0-1# All elements
LRANGE queue:emails 09# First 10 elements# Get length
LLEN queue:emails
# Trim list (keep only specified range)
LTRIM activity:user:1 099# Keep last 100 activitiesProducer-Consumer Pattern
Queue Pattern
# Producer (adds jobs)
RPUSH jobs:send-email '{"to":"user@test.com","subject":"Welcome!"}'# Consumer (processes jobs with blocking)whiletrue;dojob=$(redis-cli BLPOP jobs:send-email 0)# Process $jobdoneSets
Unordered collection of unique strings. O(1) add, remove, and membership check.
Use Cases: Unique Items, Tags, Followers
Set Commands
# Add members
SADD tags:post:123 "redis""database""nosql"
SADD followers:user:1 "user:2""user:3""user:4"# Check membership
SISMEMBER tags:post:123 "redis"# 1 (true)
SISMEMBER tags:post:123 "mysql"# 0 (false)# Get all members
SMEMBERS tags:post:123
# Count members
SCARD followers:user:1 # 3# Remove member
SREM followers:user:1 "user:3"# Set operations
SADD followers:user:1 "A""B""C"
SADD followers:user:2 "B""C""D"
SINTER followers:user:1 followers:user:2 # ["B", "C"] (mutual)
SUNION followers:user:1 followers:user:2 # ["A", "B", "C", "D"]
SDIFF followers:user:1 followers:user:2 # ["A"] (unique to user:1)# Random member (great for sampling)
SRANDMEMBER tags:post:123 2# Get 2 random tagsSorted Sets (🔥 Interview Favorite!)
Like Sets, but each member has a score. Sorted by score — perfect for rankings!
Use Cases: Leaderboards, Ranking Systems, Rate Limiters
Sorted Set Commands
# Add players with scores
ZADD leaderboard 1500"player:alice"
ZADD leaderboard 2000"player:bob"
ZADD leaderboard 1800"player:charlie"
ZADD leaderboard 2200"player:diana"# Get top 3 players (highest scores)
ZREVRANGE leaderboard 02 WITHSCORES
# 1) "player:diana"# 2) "2200"# 3) "player:bob"# 4) "2000"# 5) "player:charlie"# 6) "1800"# Get player rank (0-based, highest = 0)
ZREVRANK leaderboard "player:bob"# 1# Get player score
ZSCORE leaderboard "player:alice"# 1500# Increment score (player won a match)
ZINCRBY leaderboard 100"player:alice"# 1600# Get players within score range
ZRANGEBYSCORE leaderboard 15002000 WITHSCORES
# Count players in range
ZCOUNT leaderboard 10002000# 3# Remove player
ZREM leaderboard "player:alice"👉 Hands-on: Design a Gaming Leaderboard
Leaderboard Implementation
# Real-time leaderboard with weekly reset# Key pattern: leaderboard:game:weekly:2024-W50# When player scores pointsdefupdate_score(player_id, points):
week = get_current_week()# "2024-W50"
key =f"leaderboard:game:weekly:{week}"
redis.zincrby(key, points,f"player:{player_id}")
redis.expire(key,7*24*3600)# Auto-expire after 1 week# Get top 10defget_top_10():return redis.zrevrange("leaderboard:game:weekly:2024-W50",0,9, withscores=True)# Get player's rankdefget_rank(player_id):
rank = redis.zrevrank("leaderboard:game:weekly:2024-W50",f"player:{player_id}")return rank +1if rank isnotNoneelseNoneBitmaps & HyperLogLogs (Advanced)
Bitmaps — Space-efficient boolean arrays
Bitmap Commands
# Track daily active users (1 bit per user)
SETBIT active:2024-12-16 10011# User 1001 was active
SETBIT active:2024-12-16 10021
SETBIT active:2024-12-16 10031# Check if user was active
GETBIT active:2024-12-16 1001# 1# Count active users
BITCOUNT active:2024-12-16 # 3# Users active on BOTH days
BITOP AND active:both active:2024-12-15 active:2024-12-16HyperLogLog — Cardinality estimation (unique counts)
HyperLogLog Commands
# Count unique page visitors (uses only ~12KB for billions!)
PFADD visitors:homepage "user:1""user:2""user:3"
PFADD visitors:homepage "user:1""user:4"# user:1 won't count twice# Get approximate unique count (0.81% error rate)
PFCOUNT visitors:homepage # ~4# Merge multiple HLLs
PFMERGE visitors:total visitors:homepage visitors:about