Welcome back! Building on our previous experience with Redis sets, today we are diving into sorted sets using C++ and the hiredis
library. Redis sorted sets combine the power of sets and lists, allowing us to handle collections in which every member is unique but has an associated score. These scores ensure the elements are kept in a specific, sorted order.
In this lesson, you will understand how to use sorted sets in Redis with C++. Specifically, we will focus on:
- Adding members and scores to a sorted set.
- Retrieving top members based on their scores.
Sorted sets in Redis are remarkable due to their efficiency and flexibility. You might find them particularly useful for scenarios like maintaining leaderboards, scheduling tasks, or storing time-series data.
Let’s start by connecting to your Redis server and adding some members to a sorted set using C++ and hiredis
:
C++1#include <iostream> 2#include <hiredis/hiredis.h> 3 4int main() { 5 // Connect to the Redis server 6 redisContext* context = redisConnect("127.0.0.1", 6379); 7 if (context == nullptr || context->err) { 8 if (context) { 9 std::cerr << "Connection error: " << context->errstr << std::endl; 10 } else { 11 std::cerr << "Connection error: can't allocate Redis context" << std::endl; 12 } 13 return 1; 14 } 15 16 // Adding scores and members to a sorted set 17 redisReply* reply; 18 19 reply = (redisReply*)redisCommand(context, "ZADD leaderboard 100 Alice 400 Bob 300 Charlie 350 Alice"); 20 freeReplyObject(reply); 21 22 // Retrieving top players 23 reply = (redisReply*)redisCommand(context, "ZREVRANGE leaderboard 0 1 WITHSCORES"); 24 if (reply->type == REDIS_REPLY_ARRAY) { 25 std::cout << "Top 2 players: "; 26 for (size_t i = 0; i < reply->elements; i += 2) { 27 std::cout << "(" << reply->element[i]->str << ", " << reply->element[i + 1]->str << ") "; 28 } 29 std::cout << std::endl; 30 } 31 freeReplyObject(reply); 32 33 // Retrieve players with lowest scores 34 reply = (redisReply*)redisCommand(context, "ZRANGE leaderboard 0 1 WITHSCORES"); 35 if (reply->type == REDIS_REPLY_ARRAY) { 36 std::cout << "Lowest 2 players: "; 37 for (size_t i = 0; i < reply->elements; i += 2) { 38 std::cout << "(" << reply->element[i]->str << ", " << reply->element[i + 1]->str << ") "; 39 } 40 std::cout << std::endl; 41 } 42 freeReplyObject(reply); 43 44 // Removing members from a sorted set 45 reply = (redisReply*)redisCommand(context, "ZREM leaderboard Alice"); 46 freeReplyObject(reply); 47 48 // Free the context 49 redisFree(context); 50 51 return 0; 52}
Let's discuss the methods used in this program:
-
ZADD: Adds members to a sorted set with specific scores.
- Syntax:
ZADD key score member [score member ...]
- In this example, the "leaderboard" is updated with scores for
"Alice"
(100),"Bob"
(400),"Charlie"
(300), and"Alice"
again (350, which updates her score).
- Syntax:
-
ZREVRANGE: Retrieves members from a sorted set in descending order of score.
- Syntax:
ZREVRANGE key start stop [WITHSCORES]
- Here,
ZREVRANGE leaderboard 0 1 WITHSCORES
is used to get the top 2 players from the "leaderboard", where"0 1"
specifies the range, and"WITHSCORES"
requests their scores.
- Syntax:
-
ZRANGE: Retrieves members from a sorted set in ascending order of score.
- Syntax:
ZRANGE key start stop [WITHSCORES]
- In this example,
ZRANGE leaderboard 0 1 WITHSCORES
returns the lowest 2 players. The parameters"0 1"
specify the range to be retrieved, and"WITHSCORES"
ensures the scores are included.
- Syntax:
-
ZREM: Removes specified members from a sorted set.
- Syntax:
ZREM key member [member ...]
- Here,
ZREM leaderboard Alice
removes"Alice"
from the "leaderboard" sorted set.
- Syntax:
Redis sorted sets are essential for several reasons:
- Order and Uniqueness: By maintaining both order and uniqueness, sorted sets are highly suited for ranking systems, similar to what you see in games or competition leaderboards.
- Efficient Operations: With commands like
ZADD
andZREVRANGE
, you can quickly add and retrieve sorted data, enhancing the performance and functionality of your applications. - Practical Applications: From tracking high scores in a game to sorting real-time stock prices, sorted sets provide a robust solution for handling sorted data efficiently.
Exciting, isn't it? Practice your newfound skills by applying them to real-world examples and exercises.