文章正文
sqlite缓存机制学习
SQLITE的模块性很强,缓存模块也是一样的,SQLITE提供了多种缓存机制可以选择,默认的是Pcache1。SQLITE缓存的管理是通过Pager管理的,下面通过Pcache提供一个接口,开发者可以自己编写自己的缓存策略。默认的缓存机制比较简单,也比较常用,算法使用的是LRU(最近最少使用算法),具体的实现,SQLITE使用了一个Hash表,两个LRU链表。如下图:
1、hash表主要是加快对缓存中数据页的查找速度。SQLite是通过页号来进行hash操作的,hash后将其挂到对应的Hash链表上。
2、LRU链表有两种,都是双向链表。一种是脏页链表,一个是干净页链表(没有修改过的页)。SQLite对hash表中页进行一次操作,就会将该页放到LRU链表的头部,因为该页是最近最常用到的。对于缓存的使用一般分成3步:
1》查找缓存中是否存在该页,存在返回该页,不存在到第二步。
2》查看被Pined住的页是否太多(正在使用的页),如果不多那就从Clean LRU中分配一个页,如果太多说明缓存压力很大,进入第三步。
3》从Dirty LrU中淘汰一个页,然后回收分配给当前页。
所以如果使用WAL模式,缓存压力很大就会导致WAL文件迅速增大,当然牺牲其他的代价会有对应的解决办法。
Aug. 2, 2015, 10:51 p.m. 作者:zachary 分类:数据库 阅读(1712) 评论(0)
评论列表:
评论: