当前位置: 首页 >> 程序设计 >> 简单的CACHE实现
 

简单的CACHE实现

作者:      来源:http://blog.csdn.net/xuan9932     发表时间:2007-01-19     浏览次数:      字号:    

#include <stdio.h>
#include 
<stdlib.h>
#include 
<string.h>

typedef 
struct  _QQData
{
    
long        uid;
    
char        nickName[20];
}
QQData;

#define  C_CACHE_BLOCK               100                     //保存100个内存块
#define  C_CACHE_ENTRY                 10                         //每个内存块有10个item

bool iCacheInited = false;
char * pCacheShm = NULL;

//根据送进来的参数,抽取指定的位的数
int GetPartInt(int uid,int iBegin,int iEnd)
{

    
char p[20];
    
char ret[20];
    memset(p,
0,20);
    memset(ret,
0,20);
    sprintf(p,
"%d",uid);
    strncpy(ret,p
+iBegin-1,iEnd);
    
return atoi(ret);

}

void InitCache()
{
    
//用堆中的内存去模拟共享内存
    pCacheShm = new char[sizeof(QQData) * C_CACHE_BLOCK *C_CACHE_ENTRY ];
    
if(pCacheShm != NULL)
    
{
        iCacheInited 
= true;
        memset(pCacheShm,
0,sizeof(QQData) * C_CACHE_BLOCK *C_CACHE_ENTRY);
    }

}

void DetoryCache()
{
    delete[] pCacheShm;
}

//将一个QQ的结构体加入内存
void InsertCache(const QQData *data)
{
    
int    iBlockIndex,iEntryIndex,i;
    QQData 
*pstEntry,*pstFirstEntry;
    
if(data->uid == 0 ||iCacheInited == false || strlen(data->nickName) == 0 )
        
return;
    iBlockIndex 
= GetPartInt(data->uid,1,2);
    
if(iBlockIndex > C_CACHE_BLOCK)
    
{
        printf(
"key too large");
        
return;
    }

    pstEntry 
= (QQData *)(pCacheShm+sizeof(QQData)*C_CACHE_ENTRY*iBlockIndex);
    pstFirstEntry 
= pstEntry;

    
for (i=0;i<C_CACHE_ENTRY;i++)
    
{
        
if (pstEntry->uid==0)     //找到第一个为空的Entry
        {
            memcpy(pstEntry,data,
sizeof(QQData));
            
return ;
        }
 
        
else if ((pstEntry->uid == data->uid) 
            
&& (strcmp(pstEntry->nickName,data->nickName) ==0))
        
{
            
//不用添加
            return ;                
        }

        pstEntry
++;
        iEntryIndex
++;
    }

    
    pstEntry
=(QQData *)pstFirstEntry+iEntryIndex;    
    memcpy(
&pstEntry,data,sizeof(QQData));
}

//从内存中读取该QQ结构体
void  ReadFromCache(QQData *data)
{
    
int    iBlockIndex,iEntryIndex,i,iPhoneNo;
    
short  iArea;
    QQData 
*pstEntry;
     
    
if (!iCacheInited)
    
{
        
return;
    }


    iBlockIndex 
= GetPartInt(data->uid,1,2);
    
if(iBlockIndex > C_CACHE_BLOCK)
    
{
        printf(
"key too large");
        
return;
    }

    pstEntry 
= (QQData *)(pCacheShm+sizeof(QQData)*C_CACHE_ENTRY*iBlockIndex);
    
for (i=0;i<C_CACHE_ENTRY;i++)
    
{
        
if(pstEntry->uid == data->uid) 
        
{
            memcpy(data,pstEntry,
sizeof(QQData));
            
return ;            
        }

        pstEntry
++;
    }

    
return ;
}

void main()
{
    QQData 
*qqdata = new QQData;
    qqdata
->uid = 31611008;
    memset(qqdata
->nickName,0,sizeof(qqdata->nickName));
    strcpy(qqdata
->nickName,"maomao");

    InitCache();
    InsertCache(qqdata);
    
    qqdata
->uid = 31611009;
    memset(qqdata
->nickName,0,sizeof(qqdata->nickName));
    strcpy(qqdata
->nickName,"maomao1");
    InsertCache(qqdata);

    
    
//根据QQ号码查询昵称
    QQData *qqdata1 = new QQData;
    qqdata1
->uid = 31611008;
    ReadFromCache(qqdata1);
    printf(
"31611008 的昵称为:%s ",qqdata1->nickName);
    
    qqdata1
->uid = 31611009;
    ReadFromCache(qqdata1);
    printf(
"31611009的昵称为:%s ",qqdata1->nickName);

    DetoryCache();
    delete qqdata;
    delete qqdata1;
}
 

责任编辑 webmaster

 
 
 
 
 
评论更多>>
 
 
 
发表
 
姓名: QQ:
性别: MSN:
E-mail: 主页:
评分: 1 2 3 4 5
评论内容:
验证码:
  
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。
  •