一个App或者网站,其数据内容是需要不断地更新的,为方便日常运营,我们建立了一个内部使用的运营管理系统。通过运营管理系统,可以配置一系列的运营数据,并写入到DB中。而后台服务器则读取这些数据,做一系列处理之后传输给客户端做展示。
由于后台服务端对数据的读取是十分频繁的,因此每次都从数据库读取是不切实际的,因此需要将数据缓存在本地,并定时更新缓存。
本文将介绍一种数据缓存、更新的方案,以供学习、参考。
1. 数据库操作封装
对于C++,mysql为我们提供了最原始的接口(文件mysql.h),我们的框架对原始接口进行了更好地封装,保证SQL注入。
#include "mysql.h"
/**
* @brief Mysql数据库操作类
*
* 非线程安全,通常一个线程一个TC_Mysql对象;
*
* 对于insert/update可以有更好的函数封装,保证SQL注入;
*
* TC_Mysql::DB_INT表示组装sql语句时,不加””和转义;
*
* TC_Mysql::DB_STR表示组装sql语句时,加””并转义;
*/
class TC_Mysql
{
public:
/**
* @brief 构造函数
*/
TC_Mysql();
/**
* @brief 构造函数.
*
* @param sHost 主机IP
* @param sUser 用户
* @param sPasswd 密码
* @param sDatebase 数据库
* @param port 端口
* @param iUnixSocket socket
* @param iFlag 客户端标识
*/
TC_Mysql(const string& sHost, const string& sUser = "", const string& sPasswd = "", const string& sDatabase = "", const string &sCharSet = "", int port = 0, int iFlag = 0);
/**
* @brief 构造函数.
* @param tcDBConf 数据库配置
*/
TC_Mysql(const TC_DBConf& tcDBConf);
/**
* @brief 析构函数.
*/
~TC_Mysql();
/**
* @brief 初始化.
*
* @param sHost 主机IP
* @param sUser 用户
* @param sPasswd 密码
* @param sDatebase 数据库
* @param port 端口
* @param iUnixSocket socket
* @param iFlag 客户端标识
* @return 无
*/
void init(const string& sHost, const string& sUser = "", const string& sPasswd = "", const string& sDatabase = "", const string &sCharSet = "", int port = 0, int iFlag = 0);
/**
* @brief 初始化.
*
* @param tcDBConf 数据库配置
*/
void init(const TC_DBConf& tcDBConf);
/**
* @brief 连接数据库.
*
* @throws TC_Mysql_Exception
* @return 无
*/
void connect();
/**
* @brief 断开数据库连接.
* @return 无
*/
void disconnect();
/**
* @brief 直接获取数据库指针.
*
* @return MYSQL* 数据库指针
*/
MYSQL *getMysql();
/**
* @brief 字符转义.
*
* @param sFrom 源字符串
* @param sTo 输出字符串
* @return 输出字符串
*/
string escapeString(const string& sFrom);
/**
* @brief 更新或者插入数据.
*
* @param sSql sql语句
* @throws TC_Mysql_Exception
* @return
*/
void execute(const string& sSql);
/**
* @brief mysql的一条记录
*/
class MysqlRecord
{
public:
/**
* @brief 构造函数.
*
* @param record
*/
MysqlRecord(const map<string, string> &record);
/**
* @brief 获取数据,s一般是指数据表的某个字段