C++ 中的缓存:Redis、Memcached 和内嵌解决方案——高级篇

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

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

开始课程

引言:为什么缓存对 C++ 性能至关重要

在现代 C++ 高负载开发中,缓存已不再是可选项,而是架构中必不可少的元素。没有它,任何 CRUD 系统或微服务都会迅速触及数据库限制,请求延迟呈指数级增长。在高级层面,我们面临一个两难选择:使用外部系统(Redis、Memcached)还是部署自有的 C++ 内存内解决方案?本文将基于处理网络队列、锁和序列化的实践经验,分析每种方法的优缺点及具体实现。



1. Redis:灵活性与数据结构

Redis 不仅仅是一个键值存储。其主要优势在于丰富的数据类型:字符串、哈希、列表、集合、有序集合。C++ 有多个客户端可用:redis-plus-plus(推荐)和 hiredis(底层)。

使用 redis-plus-plus 进行连接和基本操作的示例

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

int main() { // 连接到 Redis(默认 localhost:6379) sw::redis::Redis redis("tcp://127.0.0.1:6379");

// 设置带 60 秒 TTL 的值 redis.set("user:1001", "John Doe", std::chrono::seconds(60));

// 读取 auto val = redis.get("user:1001"); if (val) { std::cout << "User: " << *val << std::endl; }

// 使用哈希 redis.hset("session:abc", "token", "xyz123"); redis.hset("session:abc", "expires", "3600"); auto token = redis.hget("session:abc", "token"); std::cout << "Token: " << *token << std::endl;

return 0;}

高级技巧: 使用 redis.multi() 和 redis.exec() 实现事务,以及使用 Pub/Sub 进行缓存失效通知。当需要存储具有原子操作(例如计数器递增)的复杂结构时,Redis 是理想选择。



2. Memcached:速度与简洁

Memcached 是一个轻量级分布式缓存,针对存储扁平数据(字符串和二进制 blob)进行了优化。它不支持事务或复杂结构,但在速度和最小内存消耗方面更胜一筹。对于 C++,我们使用 libmemcached 库。

通过 libmemcached 使用 Memcached 的示例

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

int main() { memcached_st *memc = memcached_create(nullptr); memcached_server_st *servers = nullptr; memcached_return_t rc;

// 添加服务器 servers = memcached_server_list_append(servers, "127.0.0.1", 11211, &rc); rc = memcached_server_push(memc, servers); if (rc != MEMCACHED_SUCCESS) { std::cerr << "Error: " << memcached_strerror(memc, rc) << std::endl; return 1; }

// 写入带 30 秒 TTL 的数据 const char *key = "config:db_host"; const char *value = "10.0.0.1"; rc = memcached_set(memc, key, strlen(key), value, strlen(value), std::time(0) + 30, (uint32_t)0); if (rc != MEMCACHED_SUCCESS) { std::cerr << "Set failed: " << memcached_strerror(memc, rc) << std::endl; }

// 读取 size_t val_len; uint32_t flags; char *retrieved = memcached_get(memc, key, strlen(key), &val_len, &flags, &rc); if (rc == MEMCACHED_SUCCESS) { std::cout << "DB Host: " << retrieved << std::endl; free(retrieved); }

memcached_free(memc); return 0;}

何时选择 Memcached? 如果您需要一个用于序列化对象的简单缓存,且无需存储复杂结构。Memcached 非常适合缓存 SQL 查询结果或 HTML 片段。

博客

书籍推荐