一般来讲,缓存可大大提高网站的运行效率。Redis是内存数据库,本身就是良好的缓存载体。Bamboo结合Redis提供了一套灵活强大的缓存机制。
Bamboo中的缓存都是限定在某一个模型的名下,因此必须以Model_name:xxxCache(...)
的形式调用。所有的API罗列如下:
将数据vals存在缓存中去。
- key 此缓存的名称
- vals 要缓存的值
- orders 一个元素为数字的list。如果vals是一个list,利用此orders可以给vals中的元素指定顺序。只在vals为list的情况下有效。
从緩存中取数据。
- key 此缓存的名称
- start 可选。如果缓存为一个list,start指定获取的起点。只在此缓存为list的情况下有效。
- stop 可选。如果缓存为一个list,stop指定获取的终点。只在此缓存为list的情况下有效。
- is_rev 可选。如果值为"rev",则表示反向获取列表。只在此缓存为list的情况下有效。
删除缓存。
- key 要删除的缓存的名字
判断缓存是否存在。
- key 缓存名字
将val添加到缓存中去。
- key 缓存名字
- val 要添加的值。val可以为一个Bamboo模型的对象实例,也可以为实例的id,也可以为其它的字符串
- score 可选。如果cache的是一个list,则利用此score,可以手动指定要添加的值在缓存中的排序位置
将val从缓存中去除。
- key 缓存名字
- val 要删除的值。val可以是一个对象实例,也可以为实例的id,也可以为其它的字符串
检测缓存中是否有成员mem。
- key 缓存名字
- mem 成员对象。mem可以是一个对象实例,也可以为实例的id,也可以为其它的字符串
计算当前缓存的长度。
- key 缓存名字
计算当前缓存的生命期,即还有多长时间过期,单位:秒。
- key 缓存名字
将实例添加到缓存中并按某种规则排序
实例方法
- cache_key 缓存名称
- field 要排序检查的字段名称
- sort_func 自定义排序函数
举例如下,作参考:
local function cache_example(web, req)
local all_persons
if not MYUser:existCache('persons_list') then
-- retreive all person instance from db
all_persons = MYUser:all():sortBy('name')
MYUser:setCache('persons_list', all_persons)
else
DEBUG('entering cache block.')
all_persons = MYUser:getCache('persons_list')
end
local total = MYUser:numCache('persons_list')
return View("example.html"){all_persons = all_persons, total = total}
end
Bamboo的缓存机制与模型的修饰器功能结合使用,可以实现方便强大的缓存更新能力。我们举个例子来说明,比如一个社团要统计注册以及退出的会员名单。会员的模型为MYUser
,则它有模型文件中可以这样来写:
module(..., package.seeall)
local User = require 'bamboo.models.user'
local MYUser = User:extend {
__tag = 'Bamboo.Model.User.MYUser';
__name = 'MYUser';
__desc = 'Generitic MYUser definition';
__indexfd = 'name';
__fields = {
['name'] = {},
['age'] = {},
['gender'] = {},
};
__decorators = {
save = function (osave)
return function(self, ...)
self = osave(self, ...)
if not self then return nil end
self = self:addToCacheAndSortBy('persons_list', 'name')
return self
end
end;
del = function (odel)
return function(self)
local MYUser = bamboo.getModelByName("MYUser")
MYUser:removeCacheMember('persons_list', self)
odel(self)
return true
end
end;
};
init = function (self, t)
if not t then return self end
self.name = t.name
self.age = t.age
self.gender = t.gender
return self
end;
}
return MYUser
有了这个之后,我们就可以放心的使用缓存,而不用小心翼翼地想想缓存是不是过期之类的问题了。
- 每生成一个新的
MYUser
实例并保存的时候,就会自动将这个实例更新到缓存中去; - 每删除一个
MYUser
实例,会自动将这个实例从缓存中清除; - 在使用addToCacheAndSortBy()之前,还可以在decorators中写一些逻辑来判断新生成的对象是否满足放到此缓存中的(过滤)条件。
在内部,如果缓存的是一个对象列表,那么,存储的只是它们的id列表。
目前,在bamboo工程的产品模式(PRODUCTION=true)中,自动采用了模板缓存技术,对编译过的模板的中间代码进行缓存,显著提高了运行效率。