C++ 缓存:Redis、Memcached 及内建解决方案完全指南

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

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

开始课程

引言:为什么 C++ 需要缓存以及它如何加速应用程序

\n\n

在现代 C++ 开发中,性能是一个关键因素。每一次多余的数据库查询、每一次复杂函数的重复计算或磁盘读取,都是毫秒级的损失,而在高负载服务的规模下,这些毫秒会累积成数秒的停机时间。缓存通过将昂贵操作的结果存储在快速访问的内存中来解决这个问题。

\n\n

在本文中,我们将探讨 C++ 中三种主要的缓存方法:外部系统(Redis、Memcached)和内建解决方案(std::unordered_map、LRU 缓存)。您将了解何时选择哪种工具、如何正确配置缓存以及可能遇到的陷阱。

\n\n

1. 外部缓存系统:Redis 和 Memcached

\n\n

1.1 Redis:支持数据结构的强大内存存储

\n\n

Redis 不仅仅是一个缓存,而是一个运行在内存中的完整数据结构服务器。它支持字符串、列表、集合、哈希表甚至队列。对于 C++,有多个客户端库,最流行的是 hiredis(C 语言)和 redis-plus-plus(C++ 语言)。

\n\n

通过 redis-plus-plus 连接和使用 Redis 的示例:

\n\n
#include <sw/redis++/redis++.h>\n#include <iostream>\n\nint main() {\n    // 连接到本地主机上的 Redis\n    sw::redis::Redis redis("tcp://127.0.0.1:6379");\n\n    // 将值写入缓存\n    redis.set("user:1001", "{\\"name\\":\\"Alice\\",\\"age\\":30}");\n\n    // 读取值\n    auto val = redis.get("user:1001");\n    if (val) {\n        std::cout << "缓存数据: " << *val << std::endl;\n    }\n\n    // 设置 TTL(生存时间)—— 60 秒\n    redis.expire("user:1001", 60);\n\n    return 0;\n}\n
\n\n

Redis 优点:

\n
    \n
  • 支持复杂数据结构(列表、哈希、集合)
  • \n
  • 内置复制和持久化机制
  • \n
  • 支持事务和 Lua 脚本
  • \n
  • 可用作发布/订阅消息代理
  • \n
\n\n

Redis 缺点:

\n
    \n
  • 需要单独的服务器(额外的基础设施)
  • \n
  • 由于结构元数据,比 Memcached 消耗更多内存
  • \n
  • 不适合非常大的数据量(受 RAM 限制)
  • \n
\n\n

1.2 Memcached:轻量级快速分布式缓存

\n\n

Memcached 是一个更简单的系统,专门用于缓存键值对。它非常适合存储小对象(最大 1 MB)。对于 C++,使用 libmemcached 库。

\n\n

在 C++ 中使用 Memcached 的示例:

\n\n
#include <libmemcached/memcached.h>\n#include <iostream>\n#include <cstring>\n\nint main() {\n    memcached_server_st *servers;\n    memcached_st *memc;\n    memcached_return rc;\n\n    memc = memcached_create(nullptr);\n    servers = memcached_server_list_append(nullptr, "127.0.0.1", 11211, &rc);\n    rc = memcached_server_push(memc, servers);\n\n    // 写入缓存,TTL 为 300 秒\n    const char *key = "session_token_abc123";\n    const char *value = "valid";\n    rc = memcached_set(memc, key, strlen(key), value, strlen(value), 300, 0);\n\n    // 从缓存读取\n    size_t value_length;\n    uint32_t flags;\n    char *result = memcached_get(memc, key, strlen(key), &value_length, &flags, &rc);\n    if (result) {\n        std::cout << "缓存值: " << result << std::endl;\n        free(result);\n    }\n\n    memcached_free(memc);\n    return 0;\n}\n
\n\n

Memcached 优点:

\n
    \n
  • 在简单的 get/set 操作中具有最高性能
  • \n
  • 元数据内存消耗最小
  • \n

博客

书籍推荐