设为首页 加入收藏

TOP

c++ 程序通用多线程单例设计 c++ web 框架设计经验谈(二)
2023-07-23 13:39:15 】 浏览:208
Tags:程序通 程单例 web 计经验
== 0) { return 0; } int temp = (int)(iter->second.exptime - nowtime); if (temp == -1) { return -2; } return temp; } return -1; } int update(std::size_t hashid, int exptime = 0) { std::map<std::size_t, data_cache_t> &obj = get_pz_cache<data_cache_t>(); unsigned int nowtime = http::timeid() + exptime; if (exptime == 0) { nowtime = 0; } std::unique_lock<std::mutex> lock(editlock); auto iter = obj.find(hashid); if (iter != obj.end()) { if (iter->second.exptime == 0) { iter->second.exptime = nowtime; return 0; } iter->second.exptime = nowtime; return 1; } return -1; } std::vector<BASE_TYPE> get_array(std::size_t hashid) { std::map<std::size_t, data_cache_t> &obj = get_pz_cache<data_cache_t>(); unsigned int nowtime = http::timeid(); std::unique_lock<std::mutex> lock(editlock); auto iter = obj.find(hashid); if (iter != obj.end()) { if (iter->second.exptime == 0) { return iter->second.data; } if (iter->second.exptime >= nowtime) { return iter->second.data; } else { obj.erase(iter++); } } lock.unlock(); std::vector<BASE_TYPE> temp; return temp; } BASE_TYPE get(std::size_t hashid) { std::map<std::size_t, data_cache_t> &obj = get_pz_cache<data_cache_t>(); unsigned int nowtime = http::timeid(); std::unique_lock<std::mutex> lock(editlock); auto iter = obj.find(hashid); if (iter != obj.end()) { if (iter->second.exptime == 0) { if (iter->second.data.size() > 0) { return iter->second.data[0]; } } if (iter->second.exptime >= nowtime) { if (iter->second.data.size() > 0) { return iter->second.data[0]; } } else { obj.erase(iter++); } } lock.unlock(); BASE_TYPE temp; return temp; } static pzcache &conn() { static pzcache instance; return instance; } public: std::mutex editlock; };

 

auto [_, success] = obj.insert({hashid, temp});

这个map insert 方法如果存在会插入失败,于是我用API指定是更新过期时间或删除重新添加,这一步巧妙利用了map这个特性,需要c++17以上。

 

然后使用方式就是很简单了

 

pzcache<std::string> &temp_cache = pzcache<std::string>::conn();

 

我们缓存一个string 对象,首先取得单例。

        pzcache<std::string> &temp_cache = pzcache<std::string>::conn();
       std::string namestring = "testname"; std::size_t cache_hashid = std::hash<std::string>{}(namestring); if (temp_cache.check(cache_hashid) > -1) { client << " 已经存在,不需要再存 "; } else { std::string cache_data = "This cache content!"; temp_cache.save(cache_hashid, cache_data, 30); client << "缓存新的内容"; }

 

然后我们在其它线程使用

pzcache<std::string> &temp_cache = pzcache<std::string>::conn();

std::string namestring = "testname";
std::size_t cache_hashid = std::hash<std::string>{}(namestring);

std::string cache_data = temp_cache.get(cache_hashid);

 是不是很简单,c++ 强大的模板能力,一个通用类库设计好了,而且简单好用

 

欢迎使用 国产 C++ web 框架 paozhu 1.2.0 发布

源代码里面更多的设计模式可以参考,框架LICENSE反正为MIT模式,大家商用也没有问题。

https://github.com/hggq/paozhu

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇排列组合 下一篇array

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目