您好,欢迎访问一九零五行业门户网

初学Redis(2)用Redis作为Mysql数据库的缓存

用redis作mysql数据库缓存,必须解决2个问题。首先,应该确定用何种数据结构存储来自mysql的数据;在确定数据结构之后,还要考虑用什么标识作为该数据结构的键。 直观上看,mysql中的数据都是按表存储的;更微观地看,这些表都是按行存储的。每执行一次selec
用redis作mysql数据库缓存,必须解决2个问题。首先,应该确定用何种数据结构存储来自mysql的数据;在确定数据结构之后,还要考虑用什么标识作为该数据结构的键。
直观上看,mysql中的数据都是按表存储的;更微观地看,这些表都是按行存储的。每执行一次select查询,mysql都会返回一个结果集,这个结果集由若干行组成。所以,一个自然而然的想法就是在redis中找到一种对应于mysql行的数据结构。redis中提供了五种基本数据结构,即字符串(string)、列表(list)、哈希(hash)、集合(set)和有序集合(sorted set)。经过调研,发现适合存储行的数据结构有两种,即string和hash。
要把mysql的行数据存入string,首先需要对行数据进行格式化。事实上,结果集的每一行都可以看做若干由字段名和其对应值组成的键值对集合。这种键值对结构很容易让我们想起json格式。因此,这里选用json格式作为结果集每一行的格式化模板。根据这一想法,我们可以实现将结果集格式化为若干json对象,并将json对象转化为字符串存入redis的代码:
// 该函数把结果集中的每一行转换为一个json格式的字符串并存入redis的string结构中,// string键应该包含结果集标识符和string编号,形式如“cache.string:123456:1”string cache2string(sql::connection *mysql_connection, rediscontext *redis_connection, sql::resultset *resultset, const string &resultset_id, int ttl) { if (resultset->rowscount() == 0) { throw runtime_error(failure - no rows); } // string键的前缀,包含了结果集的标识符 string prefix(cache.string: + resultset_id + :); unsigned int num_row = 1; // string编号,附加于string键的末尾,从1开始 sql::resultsetmetadata *meta = resultset->getmetadata(); unsigned int num_col = meta->getcolumncount(); // 将结果集中所有行对应的所有string键存入该set,set键包含了结果集的标识符 string redis_row_set_key(resultset.string: + resultset_id); redisreply *reply; string ttlstr; stringstream ttlstream; ttlstream next()) { string redis_row_key; // string键名,由前缀和string编号组成 stringstream keystream; keystream << prefix rowscount() == 0) { throw runtime_error(failure - no rows); } // hash键的前缀,包含了结果集的标识符 string prefix(cache.hash: + resultset_id + :); unsigned int num_row = 1; // hash编号,附加于hash键的末尾,从1开始 sql::resultsetmetadata *meta = resultset->getmetadata(); unsigned int num_col = meta->getcolumncount(); // 将结果集中所有行对应的所有hash键存入该set,set键包含了结果集的标识符 string redis_row_set_key(resultset.hash: + resultset_id); redisreply *reply; string ttlstr; stringstream ttlstream; ttlstream next()) { string redis_row_key; // hash键名,由前缀和hash编号组成 stringstream keystream; keystream << prefix 至此,我们已经给出了两种存储mysql结果集的方案,这就是我们在篇首提出的第一个问题,即选择何种数据结构存储mysql结果集的答案。下一篇文章将研究第二个问题,即数据结构键的标识符选择问题。
其它类似信息

推荐信息