C++ 中的缓存:Redis、memcached、LevelDB 及其他工具

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

C++ 中的缓存:Redis 及其他流行工具



在高负载的 C++ 应用程序中,数据访问速度至关重要。缓存可以将服务器响应时间缩短 10 到 100 倍,从而减轻数据库和外部 API 的负载。在本文中,我们将介绍 C++ 中用于缓存的主要库:从经典的 Redis 到嵌入式引擎 LevelDB 和 RocksDB。



1. Redis 及 C++ 客户端库



Redis 是最流行的内存键值存储,支持复杂的数据结构(列表、集合、哈希)。C++ 有两个主要的客户端:



  • hiredis — 一个极简的 C 库(官方库),可以通过封装轻松集成到 C++ 中。
  • redis-plus-plus — 一个现代的 C++17 库,全面覆盖 Redis 命令,支持连接池、管道和事务。


使用 hiredis 的示例(同步)

#include <hiredis/hiredis.h>#include <iostream>

int main() { redisContext *c = redisConnect("127.0.0.1", 6379); if (c == nullptr || c->err) { std::cerr << "Connection error: " << c->errstr << std::endl; return 1; }

redisReply *reply = (redisReply*)redisCommand(c, "SET key hello"); freeReplyObject(reply);

reply = (redisReply*)redisCommand(c, "GET key"); if (reply->type == REDIS_REPLY_STRING) { std::cout << "GET key: " << reply->str << std::endl; } freeReplyObject(reply); redisFree(c); return 0;}


使用 redis-plus-plus 的示例(异步 + 连接池)

#include <sw/redis++/redis++.h>#include <iostream>

int main() { sw::redis::Redis redis("tcp://127.0.0.1:6379");

// 设置带 TTL(5 秒) redis.setex("user:42", 5, "John Doe");

// 获取 auto val = redis.get("user:42"); if (val) { std::cout << "Cached user: " << *val << std::endl; } else { std::cout << "Key expired or not found" << std::endl; } return 0;}


Redis 的优点: 高速(微秒级)、丰富的命令集、复制、集群。 缺点: 消耗 RAM,需要单独的服务器。



2. Memcached 和 libmemcached



Memcached 是最简单的分布式缓存,仅将数据存储在 RAM 中。对于 C++,使用 libmemcached 库(或其 C++ 封装 libmemcachedutil)。



使用 libmemcached 的示例

#include <libmemcached/memcached.h>#include <iostream>#include <cstring>

int main() { memcached_st *memc = memcached_create(nullptr); memcached_server_add(memc, "127.0.0.1", 11211);

const char *key = "session_token"; const char *value = "abc123"; memcached_return_t rc = memcached_set(memc, key, strlen(key), value, strlen(value), 0, 0); // 0 - 无压缩, 0 - TTL

if (rc == MEMCACHED_SUCCESS) { size_t value_length; uint32_t flags; char *result = memcached_get(memc, key, strlen(key), &value_length, &flags, &rc); if (rc == MEMCACHED_SUCCESS) { std::cout << "Get: " << result << std::endl; free(result); } } memcached_free(memc); return 0;}


何时选择 Memcached: 当需要简单的缓存且无需复杂数据结构,并且追求最大性能时。Redis 在功能上更胜一筹,而 Memcached 则更简单。



3. 嵌入式引擎:LevelDB 和 RocksDB



如果缓存必须是 本地 的

推荐