Handling Transactions with Pipelines

Welcome back! We're moving on to the next essential part of our Redis-based backend system project — handling transactions with pipelines. This will help us execute multiple Redis commands as a single atomic operation. Remember, you've already gotten comfortable with managing user data and leaderboards. This unit will take it a step further by optimizing these operations using pipelines.

What You'll Build

Before we dive in, let's recap what you’ll be focusing on in this unit. The key tasks include:

  1. Adding user data with expiration using pipelines: We will group multiple commands into one pipeline to add user data more efficiently.
  2. Adding scores to a leaderboard using pipelines: Using pipelines to add scores will ensure these operations are atomically executed.
  3. Executing the pipeline: We'll ensure the grouped commands in the pipeline are executed together.

These tasks will help us understand how pipelines can enhance performance and consistency in our Redis operations.

Adding User Data Using Pipelines

To add user data with expiration, we use the addUserWithPipeline method from the User class. This method takes a Pipeline object and ensures that user data is stored with an expiration of one day:

// Add user data to Redis using a pipeline
public static void addUserWithPipeline(Pipeline pipeline, User user) {
    String userKey = "user:" + user.getUsername();
    String jsonData = gson.toJson(user.getData());
    pipeline.setex(userKey, (int) Duration.ofDays(1).getSeconds(), jsonData);
}

In the Main class, this method is called for multiple users. The pipeline ensures that all commands are grouped into a single batch:

try (Pipeline pipeline = jedis.pipelined()) {
    for (User user : new User[]{user1, user2, user3}) {
        User.addUserWithPipeline(pipeline, user);
    }
    pipeline.sync(); // Sends all buffered commands to the Redis server and waits for their execution results.
}

This ensures that the commands are sent and executed together, reducing the number of network round-trips.

Adding Scores to a Leaderboard Using Pipelines

To add scores to a leaderboard, the addScoreWithPipeline method is used. It adds user scores to the leaderboard sorted set:

// Add user score to the leaderboard using a pipeline
public static void addScoreWithPipeline(Pipeline pipeline, User user) {
    pipeline.zadd("leaderboard", user.getScore(), user.getUsername());
}

In the Main class, this is also part of the pipeline block:

try (Pipeline pipeline = jedis.pipelined()) {
    for (User user : new User[]{user1, user2, user3}) {
        User.addScoreWithPipeline(pipeline, user);
    }
    pipeline.sync();
}

Both user data and scores are added in one pipeline block to ensure efficiency and atomic execution.

Sign up
Join the 1M+ learners on CodeSignal
Be a part of our community of 1M+ users who develop and demonstrate their skills on CodeSignal