diff --git a/server/imserver/dbhelper.cc b/server/imserver/dbhelper.cc index 9e30918..edd2cf7 100644 --- a/server/imserver/dbhelper.cc +++ b/server/imserver/dbhelper.cc @@ -1,6 +1,7 @@ #include "precompile.h" #include +#include #include "dbengine.h" @@ -280,5 +281,45 @@ void DBHelper::AddCache( user_info->mutable_base_data()->set__online(0); cache_users_hash[account_id] = user_info; cache_users_list.push_back(user_info); + a8::Timer::Instance()->AddDeadLineTimer + ( + 1000 * 60 * 5 + rand() % 1000, + a8::XParams() + .SetSender(account_id), + [] (const a8::XParams& param) + { + DBHelper::Instance()->RemoveCache(param.sender); + } + ); + } +} + +void DBHelper::RemoveCache(const std::string& account_id) +{ + if (cache_users_hash.size() < 300) { + a8::Timer::Instance()->AddDeadLineTimer + ( + 1000 * 60 * 5 + rand() % 1000, + a8::XParams() + .SetSender(account_id), + [] (const a8::XParams& param) + { + DBHelper::Instance()->RemoveCache(param.sender); + } + ); + return; + } + auto itr = cache_users_hash.find(account_id); + if (itr != cache_users_hash.end()) { + auto itr2 = std::find(cache_users_list.begin(), + cache_users_list.end(), + itr->second); + if (itr2 != cache_users_list.end()) { + cache_users_list.erase(itr2); + } else { + abort(); + } + delete itr->second; + cache_users_hash.erase(itr); } } diff --git a/server/imserver/dbhelper.h b/server/imserver/dbhelper.h index 32c10c3..6c1daaf 100644 --- a/server/imserver/dbhelper.h +++ b/server/imserver/dbhelper.h @@ -54,4 +54,5 @@ private: long long user_value3, int last_logintime ); + void RemoveCache(const std::string& account_id); };