数据库优化——缓存优化

🔹 缓存优化

使用缓存(如 Redis)保存热点数据,减少数据库访问压力

使用结果缓存、Query Cache(适合读多写少的场景)

  1. 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值