C++中的缓存:Redis及其他工具
缓存是优化C++应用程序性能的关键技术之一。它可以减少数据访问时间,降低数据库和外部服务的负载。在本文中,我们将介绍在C++中实现缓存的主要库和工具:从基于Redis和Memcached的工业级解决方案,到轻量级的内置实现。
1. Redis及其C++客户端
Redis 是一个高性能的内存键值存储,常被用作缓存。在C++中与Redis交互主要有两个库:
1.1. hiredis
hiredis 是一个极简的C语言库,由Redis官方支持。它提供同步和异步API。
安装:
# Ubuntu/Debiansudo apt install libhiredis-dev
# macOSbrew install hiredis
# 从源码编译git clone https://github.com/redis/hiredis.gitcd hiredis && make && sudo make install使用示例(同步模式):
#include <hiredis/hiredis.h>#include <iostream>
int main() { redisContext *c = redisConnect("127.0.0.1", 6379); if (c == nullptr || c->err) { std::cerr << "连接错误: " << c->errstr << std::endl; return 1; }
// 设置值 redisReply *reply = (redisReply*)redisCommand(c, "SET key1 value1"); freeReplyObject(reply);
// 获取值 reply = (redisReply*)redisCommand(c, "GET key1"); if (reply->type == REDIS_REPLY_STRING) { std::cout << "值: " << reply->str << std::endl; } freeReplyObject(reply);
redisFree(c); return 0;}1.2. redis-plus-plus
redis-plus-plus 是一个基于hiredis的现代C++17封装,提供便捷的接口,支持连接池、事务和发布/订阅。
安装:
git clone https://github.com/sewenew/redis-plus-plus.gitcd redis-plus-plusmkdir build && cd buildcmake -DREDIS_PLUS_PLUS_CXX_STANDARD=17 ..make && sudo make install示例:
#include <sw/redis++/redis++.h>#include <iostream>
int main() { sw::redis::Redis redis("tcp://127.0.0.1:6379");
// 设置带TTL(生存时间60秒) redis.setex("session:user1", 60, "active");
// 获取 auto val = redis.get("session:user1"); if (val) { std::cout << "会话: " << *val << std::endl; }
// 检查是否存在 bool exists = redis.exists("session:user1"); std::cout << "存在: " << std::boolalpha << exists << std::endl;
return 0;}2. Memcached 和 libmemcached
Memcached 是另一个流行的内存存储,专为缓存小对象而优化。主要的C++库是 libmemcached。
安装:
sudo apt install libmemcached-dev
# 从源码编译git clone https://github.com/awesomized/libmemcached.gitcd libmemcached && ./configure && make && sudo make install示例:
#include <libmemcached/memcached.h>#include <iostream>#include <cstring>
int main() { memcached_st *memc = memcached_create(nullptr); memcached_server_st *servers = memcached_server_list_append(nullptr, "127.0.0.1", 11211, nullptr); memcached_server_push(memc, servers); memcached_server_list_free(servers);
// 写入 const char *key = "cache_key"; const char *value = "cached_value"; memcached_return_t rc = memcached_set(memc, k