好的,我将为您详细解析 Redis list 的现代 C++ 实践,使用 redis-plus-plus 库。内容结构如下:
一、Redis list 核心特性
双向链表结构
- 支持左右两端 $O(1)$ 时间复杂度的插入/删除
- 按索引访问元素时间复杂度为 $O(n)$
典型应用场景
- 消息队列(LPUSH/RPOP)
- 实时排行榜(LTRIM + ZSET 组合)
- 最新消息缓存(LPUSH + LTRIM)
二、redis-plus-plus 基础操作
#include <sw/redis++/redis++.h>
using namespace sw::redis;
auto redis = Redis("tcp://127.0.0.1:6379");
// 右端插入元素
redis.rpush("user:100:notifications", "New message");
// 左端弹出元素
auto msg = redis.lpop("user:100:notifications");
if (msg) { // Optional 类型
std::cout << *msg << std::endl;
}
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE0ODc4NC5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE0ODc4Ny5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE0ODU1Ni5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE0ODc5NS5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE0ODg2NC5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE0ODg2OC5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE0ODgwMC5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MDU4OS5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MDc0Mi5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MTAwOS5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MDU5Ny5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MTAyMC5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MDc1NS5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MDc1OC5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MDc2OS5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MDc3NC5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MDkxNy5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MTA0My5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MDkyNi5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MDkzMi5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MDg4Ny5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MDk0OC5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MDk1MS5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MTA2My5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MDk2Mi5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MTA3My5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MTExMi5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MTIwOC5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MTIyMC5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MDk4NS5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MTIzMC5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MTMwMy5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MDk5OS5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MTI0Ni5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MTQxNS5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MTI1OC5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MTM0MS5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MTM0NC5zaHRtbA==.html
三、高性能实践
1. 管道操作(Pipeline)
auto pipe = redis.pipeline();
pipe.lpush("queue", "task1");
pipe.lpush("queue", "task2");
pipe.exec(); // 单次网络往返
2. 批量操作
std::vector<std::string> tasks{"task3", "task4", "task5"};
redis.rpush("queue", tasks.begin(), tasks.end());
3. 范围查询优化
// 避免大范围查询
auto messages = redis.lrange("chatlog", 0, 10); // 仅获取最新11条
四、高级场景实现
1. 滑动窗口限流
// 添加请求时间戳
redis.lpush("rate_limit:user100", std::to_string(std::time(nullptr)));
redis.ltrim("rate_limit:user100", 0, 9); // 保留最近10次
auto count = redis.llen("rate_limit:user100"); // 检查请求次数
2. 循环队列
while (true) {
auto item = redis.brpop("queue", 30); // 阻塞30秒
if (item) {
process(*item);
}
}
五、内存与性能优化
控制列表长度
// 固定列表长度为100
redis.lpush("log", new_entry);
redis.ltrim("log", 0, 99);
避免大对象存储
- 单个元素建议不超过 1MB
连接池配置
ConnectionPoolOptions pool_opts;
pool_opts.size = 8; // 连接池大小
auto redis = Redis("tcp://127.0.0.1:6379", pool_opts);
六、错误处理
try {
redis.lpush("queue", data);
} catch (const Error &e) {
std::cerr << "Redis error: " << e.what() << std::endl;
}
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE0ODc4NC5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE0ODc4Ny5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE0ODU1Ni5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE0ODc5NS5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE0ODg2NC5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE0ODg2OC5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE0ODgwMC5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MDU4OS5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MDc0Mi5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MTAwOS5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MDU5Ny5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MTAyMC5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MDc1NS5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MDc1OC5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MDc2OS5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MDc3NC5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MDkxNy5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MTA0My5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MDkyNi5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MDkzMi5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MDg4Ny5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MDk0OC5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MDk1MS5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MTA2My5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MDk2Mi5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MTA3My5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MTExMi5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MTIwOC5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MTIyMC5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MDk4NS5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MTIzMC5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MTMwMy5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MDk5OS5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MTI0Ni5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MTQxNS5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MTI1OC5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MTM0MS5zaHRtbA==.html https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5NjE1MTM0NC5zaHRtbA==.html
七、现代 C++ 特性应用
// 使用 std::optional 处理空值
if (auto data = redis.lpop("queue"); data) {
handle(*data);
}
// 协程支持(需 C++20)
co_await async_lpush(redis, "queue", "task");
通过上述实践,您可充分利用 Redis list 的高效特性与 redis-plus-plus 的现代 C++ 设计,构建高性能分布式系统。建议根据业务场景配合 LTRIM 控制内存增长,并通过连接池提升并发能力。
网硕互联帮助中心





评论前必须登录!
注册