Back to Redis Course
    Module 2

    📦 Redis Data Types

    Master data modeling in Redis with its powerful built-in data structures.

    Redis Data Types Diagram

    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:email

    Hashes

    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 activities

    Producer-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 $jobdone

    Sets

    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 tags

    Sorted 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 isnotNoneelseNone

    Bitmaps & 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-16

    HyperLogLog — 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

    💬 Comments & Discussion