简单缓存设计

    在项目开发中,缓存起到至关重要的作用,它能加快程序运行的速度,提高程序性能。按照缓存是否备份到磁盘中,可将缓存分为两种:只在内存中运行,断电后消失;与磁盘中的文件进行交换,下次启动时能从文件中恢复。笔者在实际中用到了几种缓存,下面简单总结。

    1,堆栈式缓存。这种缓存适合存储大小一致的数据块。初始化时首先获得一个大的内存区域,均分为若干小块。两个单向链表,即空闲链表和数据链表。开始空闲链表指向内存块,数据链表为空。当要写数据时,先从空闲链表中获取一个空闲块,添加到数据链表中。如果当前空闲链表为空,从数据链表中取一定数量的块写入到文件中,释放这些块到空闲链表中。要读取数据时,直接从数据链表中获取一个块。如果数据链表为空,则从文件中加载一个数据块。如果管理的缓存内容很大,可以用一个文件管理器管理多个缓存文件。这种缓存的主要缺点是不支持重复遍历操作。因为数据读取后,下次就不能再读取相同记录了。

     2,仅支持遍历的缓存。这种缓存首先分配一大块内存,再划分为若干小块。用一个文件保存所有的缓存记录,用两个整数记录缓存保存的内容在文件中起始地址和缓存内容的大小。遍历时,先尽可能读取大的一块到内存中,然后在内存中移动遍历指针。为了加快预读,可将文件映射的进程地址空间中。这种缓存随机访问的效率比较低。

    3,支持随机访问的缓存。这种缓存要用到HASH结构。c++中map模板也可以胜任。首先定义一个包装结构:

 

可以构建一个支持lru算法的map结构

map<int,struct wrap_struct*> lru_cache;

该map的键是缓存块的编号,值包含缓存数据。一个双向链表连接了所有的缓存块,如果访问的数据块命中缓存,则该块被提升到链表的头部。如果缓存不够,在尾部的缓存将被换出。其中,wrap_struct 结构还可以添加其他成员,如标识,以标明某个块必须一直在内存中。

  4,混合缓存。这种缓存包含了仅支持遍历的缓存和支持随机访问的缓存结构。用户可以调整两种缓存的大小,以适应不同的使用环境。

  5,基于页的缓存。这种缓存适合存储记录大小不规则,且平均长度不大的数据。缓存包含3种页,即满页,半满页和空闲页。半满页用双向链表连接起来。每个页可以存储若干条记录。所有记录用lru算法进行调度。处理较为复杂,但是效率和空间利用率都很高,适合处理大量的不规则小数据。

   以上只是简单的缓存设计方法,其他更复杂的方法这里就不介绍了。仅作拍砖。。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值