From b11389ec8889425982274774ee70ba4cf5c197b0 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 3 Jul 2020 16:53:13 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=BC=93=E5=AD=98=E5=88=B7?= =?UTF-8?q?=E6=96=B0=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/imserver/dbhelper.cc | 41 +++++++++++++++++++++++++++++++++++++ server/imserver/dbhelper.h | 1 + 2 files changed, 42 insertions(+) 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); };