librelist archives

« back to archive

Bamboo缓存机制的设计构思

Bamboo缓存机制的设计构思

From:
Tang Daogang
Date:
2011-11-10 @ 03:47
昨晚回去构思了一下Bamboo的缓存机制。


为什么要缓存机制?现在是遇到这样一种情况,我在handler中filter了一个模型中的所有实例,得到一个list,然后使用这个list做了一些渲染工作。下一次请求来,再访问这个handler的时候,还得重复经历一次这样的filter过程。而filter会对所有实例遍历比对一次,是相当耗时的。所以缓存机制就需要了。


其它框架的缓存一般是用memcached。我们也可以用,但是redis本身就是内存数据库,号称可持久化的memcached。那么,我们能否就利用redis本身来实现缓存机制呢?基于我们的Bamboo目前的实现,这是完全可行的。研究了Custom系列函数后,觉得,从这个系列的函数的改进入手,就可以实现。

下面列出要点:

   1. Custom系函数目前可以支持redis中的所有5种数据类型。string, list, set, zset, hash;
   2. 
提供setCustom,getCustom,delCustom,updateCustom,addCustomMember,removeCustomMember,numCustom
   7个API;
   3. 缓存的对象我们来分析一下;


   - 如果仅仅是一个普通的数据对象(string, hash等),直接使用现有的函数操作就行了,不需要更改;
   - 如果待缓存的是一个list,如果list中的元素是字符串或数字,则直接操作,不需要修改;
   - 如果待缓存的是一个不关心顺序的list,且list中的元素是某一个模型的实例对象,则缓存的时候,我们应该是缓存的其id序列,这样
   的话,目前需要手动把这批id给理出来,形成一个table,传进去。并且,以后要添加元素或删除元素,只需用到addCusotmMember和
   removeCustomMember两个API,不必全部取出来,修改后,再全部写进去;
   - 如果待缓存的是一个关心顺序的list,且list中的元素是某一个模型的实例对象,则我们需要根据排序的字段给每个元素生成一个
   score,然后和其id组成一个小的配对表,将这个配对表作为参数传到setCustom中去。所以,在内部,关于这种case的操作,是需要修改代码
   改进的;

     4.

bamboo中的decorator机制,可以简化缓存的使用(在执行save和del的时候自动更新缓存中的东西),使得开发者写业务逻辑的时候,始终认为缓存中都是最新的东西,不用提心掉胆担心缓存的过期问题;
     5. redis中的expiration机制,能够使得缓存在使用一段时间后,就自动过期,减小对内存和数据库的占用。


如上,即是Bamboo中缓存机制的设计要点,欢迎点评。


-- 
Nothing is impossible.