在平常的后台开发中,通常中会用到缓存,一般会使用redis等内存数据库来实现,但是在很简单的程序中,其实没必要包含一些额外的依赖,通过C++的map即可实现。
存储一般都是key-value模式,通常是key是对应于数据库中查询的条件,value就是我们需要的值。一般缓存都有一个过期时间,这个时间可以使人为设定的,到了过期时间即需要更新。
现在定义value:
typedef struct Value_
{
std::string key; //键值
/*这里包含需要定义额值*/
uint32_t value;//这里用一个int的value代替
uint64_t create_time; //创建时间
}Value;
现在定义我们的缓存数据结构,缓存为全局对象:
typedef std::map<std::string key, Value> MyCache;
MyCache my_cache;
最后一步是对缓存的查询函数:
/*设置缓存时间, 设置为5分钟*/
uint64_t expire_time = 300;
int QueryMyCache(const std::string& key, Value& value)
{
if (key.empty())
return -1;
auto cache_iter = my_cache.find(key);
if (cache_iter != my_cache.end())/*缓存里面存在值*/
{
const Value& value_t = cache_iter->second;
/*判断缓存是否已过期*/
if ((time(NULL)-value_t.create_time)<expire_time)
{ /*未过期则返回值*/
SetValue(value_t, value);
return 0;
}
}
/*已过期或不存在缓存中,通过DB去查询需要的Value*/
if (0 != QueryDB(key, value))
{
/*DB查询失效*/
return -2;
}
/*设置时间,并放入存储*/
value.create_time = time(NULL);
my_cache[key] = value;
return 0;
}
到此为止,一个简单的C++缓存就做完了,其他语言也可以用相应的数据结构来做相应的缓存。一个简单的缓存将会减少大量的DB查询,提高效率,同时也不需要依赖于外部的内存数据库,在一些脚本和服务里面是非常有用的。
Value 除了使用结构体定义外,使用google的protobuffer在定义也是非常有效的。程序优化可以通过架构获得根本的突破,同时细节的优化也将是锦上添花。