🔹 缓存优化
使用缓存(如 Redis)保存热点数据,减少数据库访问压力
使用结果缓存、Query Cache(适合读多写少的场景)
- Redis热点数据缓存(C++版)
场景:
假设你有个接口返回“热门用户排行榜”,这数据查询成本比较高且更新不频繁。
思路:
请求时先从 Redis 取数据
Redis没数据时从MySQL查,再写回Redis
Redis设置过期时间,定期刷新
代码示例(伪代码+说明):
#include <iostream>
#include <string>
// 假设你用 hiredis 作为 Redis 客户端
#include <hiredis/hiredis.h>
// 假设你用 MySQL Connector/C++ 连接 MySQL
#include <mysql_driver.h>
#include <mysql_connection.h>
std::string getHotUsers(redisContext* redis_ctx, sql::Connection* mysql_conn) {
// 1. 先查 Redis
redisReply* reply = (redisReply*)redisCommand(redis_ctx, "GET hot_users");
if (reply && reply->type == REDIS_REPLY_STRING) {
std::string cached_data(reply->str);
freeReplyObject(reply);
return cached_data; // 直接返回缓存结果
}
freeReplyObject(reply);
// 2. Redis缓存没命中,查MySQL
std::unique_ptr<sql::Statement> stmt(mysql_conn->createStatement());
std::unique_ptr<sql::ResultSet> res(stmt->executeQuery("SELECT user_id, score FROM users ORDER BY score DESC LIMIT 10"));
std::string result = "[";
while (res->next()) {
result += "{ \"user_id\": " + std::to_string(res->getInt("user_id")) +
", \"score\": " + std::to_string(res->getInt("score")) + " },";
}
if(result.back() == ',') result.pop_back();
result += "]";
// 3. 写缓存,设置过期时间(600秒)
redisCommand(redis_ctx, "SETEX hot_users 600 %s", result.c_str());
return result;
}
int main() {
// 初始化 Redis 连接
redisContext* redis_ctx = redisConnect("127.0.0.1", 6379);
if (redis_ctx == NULL || redis_ctx->err) {
std::cerr << "Redis connection error\n";
return 1;
}
// 初始化 MySQL 连接
sql::mysql::MySQL_Driver* driver = sql::mysql::get_mysql_driver_instance();
std::unique_ptr<sql::Connection> mysql_conn(driver->connect("tcp://127.0.0.1:3306", "user", "password"));
mysql_conn->setSchema("your_db");
// 调用函数
std::string data = getHotUsers(redis_ctx, mysql_conn.get());
std::cout << "Hot users data: " << data << std::endl;
// 关闭连接
redisFree(redis_ctx);
return 0;
}
2. MySQL Query Cache