在具备了底层数据库(之前的文章)及数据库访问接口和部分存储过程,就可以进行具体的服务器内缓存设计和实现了。
直接贴代码吧,目前缓存主要包括两部分
1.群组属性(基本属性和动态属性两部分)
2.群成员信息(成员信息,成员连接等)。
本文内的实现是针对群组属性的处理,具体内容见代码。
【定义】
/* CLASS_BEGIN *****************************************************
类名: CIMGroupPropertyCache
功能: 分布式缓存群组属性信息
1. 群组属性信息缓存、更新及
2. 数据库访问
版本: V1.0
时间: 2012-2-28 创建
实现: Snight Q:51171107
CLASS_END ******************************************************/
#ifndef H_IMGROUPPROPERTYCACHE_H
#define H_IMGROUPPROPERTYCACHE_H
#include "SImGroupDbRead.h"
#include "SImGroupDbWrite.h"
#include "CThreadLock.h"
#include "CThreadMgr.h"
#include "LoadConfig.h"
#include "CGroupDefine.h"
#include "IMGroupDbCache.h"
#include <hash_map>
#include <map>
class CIMGroupPropertyCache
{
public:
~CIMGroupPropertyCache(void);
// 读取单例对象
static CIMGroupPropertyCache* GetSigoObj(void);
// 释放单例对象
static void FreeSigoObj(void);
public:
// 初始化缓存
BOOL InitCache(CIMGroupDbCache* apImGroupDbCache);
// 反初始化
BOOL UnInitCache(void);
// 初始化群组基本属性缓存
BOOL InitGrpBsProperty(void);
// 初始化群组动态属性缓存
BOOL InitGrpDynamicProperty(void);
// 按群组ID读取基本信息
BOOL GetGrpBsPropertyByGID(SInt64 ai64GID ,S_GrpBsProperty& apBsProperty);
// 按群组ID读取动态信息
BOOL GetGrpDyPropertyByGID(SInt64 ai64GID ,S_GrpDynamicProperty& apBsProperty);
// 群组基本信息变化最大值读取
BOOL GetGroupBsPropertyChangeLast(SInt64& aiLastID);
// 群组动态信息变化最大值读取
BOOL GetGroupDyPropertyChangeLast(SInt64& aiLastID);
// 读取基本属性变化,更新基本属性缓存
BOOL GetGroupBsPropertyChangeByLastID(std::vector<S_GrpBsProperty*>& aoProperty);
// 读取动态属性变化,更新动态属性缓存
BOOL GetGroupDyPropertyChangeByLastID(std::vector<S_GrpDynamicProperty*>& aoProperty);
// 增加或更新群组基本属性
BOOL AddOrUpdateGroupBSProperty( SInt64 ai64GroupId, SInt64 ai64CreaterID,
SInt8 abyType, UInt64& ai64AffectRows);
// 增加或更新群组动态属性
BOOL AddOrUpdateGroupDYProperty( SInt64 ai64GroupId, SInt64 ai64OwnerID, SLong alLevel, SLong alParentsType,
SLong alChildType, const char* apName, const char* apAnnouncement,
const char* apDescription, SInt8 ai8JoinType, UInt64& ai64AffectRows);
// 批量插入或更新群组基本属性
BOOL ChangeGroupBSPtBatch( SInt64 ai64GroupId, SInt64 ai64CreaterID,
SInt8 ai8Statu, SInt8 ai8ChangeType);
// 批量插入或更新群组动态属性
BOOL ChangeGroupDYPtBatch( SInt64 ai64GroupId, SInt64 ai64OwnerID, SLong alLevel, SLong alParentsType,
SLong alChildType, const char* apName, const char* apAnnouncement,
const char* apDescription, SInt8 ai8JoinType, SInt8 ai8ChangeType);
private:
CIMGroupPropertyCache(void);
// 工作线程
static ULong WorkThread(void* apThis);
void WorkThread(void);
BOOL ChangeGroupBSPtBatch(void);
BOOL ChangeGroupDYPtBatch(void);
private:
BOOL m_bIsInit;
static CIMGroupPropertyCache* m_pSigoObj; // 单例对象
CIMGroupDbCache* m_pImGroupDbCache; // 数据库访问缓存
SInt64 m_i64BsChngLastId; // 基本属性变化最大值
CThreadLock m_oBasePropertyLock; // 群组基本属性表锁
stdext::hash_map<SInt64, S_GrpBsProperty*> m_oBasePropertyMap; // 群组基本属性表
std::vector<S_GrpBsProperty*> m_oBsPropertyInsertVct; // 群组基本属性批量插入基本属性
CThreadLock m_oBsPropertyInsertVctLock; // 群组基本属性批量插入基本属性锁
SInt64 m_i64DyChngLastId; // 动态属性变化最大值
CThreadLock m_oDyPropertyMapLock; // 群组动态属性表锁
stdext::hash_map<SInt64, S_GrpDynamicProperty*> m_oDyPropertyMap; // 群组动态属性表
std::vector<S_GrpDynamicProperty*> m_oDyPropertyInsertVct; // 群组动态属性批量插入基本属性
CThreadLock m_oDyPropertyInsertVctLock; // 群组动态属性批量插入基本属性锁
};
#endif//H_IMGROUPPROPERTYCACHE_H
【实现】:
#include "IMGroupPropertyCache.h"
#include "CRunningLog.h"
#include "CPubfuncs.h"
// init sigo obj
CIMGroupPropertyCache* CIMGroupPropertyCache::m_pSigoObj = NULL;
CIMGroupPropertyCache::CIMGroupPropertyCache(void)
: m_bIsInit(FALSE)
, m_i64BsChngLastId(-1)
, m_i64DyChngLastId(-1)
, m_pImGroupDbCache(NULL)
{
}
CIMGroupPropertyCache::~CIMGroupPropertyCache(void)
{
}
// 读取单例对象
CIMGroupPropertyCache* CIMGroupPropertyCache::GetSigoObj(void)
{
if(!m_pSigoObj)
m_pSigoObj = new CIMGroupPropertyCache;
return m_pSigoObj;
}
// 释放单例对象
void CIMGroupPropertyCache::FreeSigoObj(void)
{
if (m_pSigoObj)
{
m_pSigoObj->UnInitCache();
delete m_pSigoObj;
}
}
// 初始化缓存
BOOL CIMGroupPropertyCache::InitCache(CIMGroupDbCache* apImGroupDbCache)
{
if (m_bIsInit) return TRUE;
if (apImGroupDbCache)
m_pImGroupDbCache = apImGroupDbCache;
CThreadMgr loTdMgr;
loTdMgr.BeginThread(WorkThread , this);
return TRUE;
}
BOOL CIMGroupPropertyCache::UnInitCache(void)
{
return TRUE;
}
// 初始化群组基本属性缓存
BOOL CIMGroupPropertyCache::InitGrpBsProperty(void)
{;
SInt64 liBegTime = CPubfuncs::GetCurTime();
m_oBasePropertyLock.lock();
S_GrpBsProperty* lpBsProperty = NULL;
stdext::hash_map<SInt64, S_GrpBsProperty*>::iterator liIter;
for (liIter = m_oBasePropertyMap.begin(); liIter != m_oBasePropertyMap.end() ; ++liIter)
if (liIter->second)
delete liIter->second;
m_oBasePropertyMap.clear();
AutoDbReaderPtr lpDbReader(m_pImGroupDbCache);
if (lpDbReader.IsAvailable())
{
SInt64 ai64GID =0;
lpDbReader->GetGroupBaseProperty(ai64GID, MySql_PageSize, m_oBasePropertyMap);
}
INFO_LOG("INFO: 读取群组基本属性信息 记录数