Skip to content

Latest commit

 

History

History
162 lines (112 loc) · 5.06 KB

缓存.md

File metadata and controls

162 lines (112 loc) · 5.06 KB

缓存

一般来讲,缓存可大大提高网站的运行效率。Redis是内存数据库,本身就是良好的缓存载体。Bamboo结合Redis提供了一套灵活强大的缓存机制。

模型缓存

Bamboo中的缓存都是限定在某一个模型的名下,因此必须以Model_name:xxxCache(...)的形式调用。所有的API罗列如下:

Cache API

Model_name:setCache (key, vals, orders)
将数据vals存在缓存中去。
- key		此缓存的名称
- vals		要缓存的值
- orders	一个元素为数字的list。如果vals是一个list,利用此orders可以给vals中的元素指定顺序。只在vals为list的情况下有效。
Model_name:getCache (key, start, stop, is_rev)
从緩存中取数据。
- key		此缓存的名称
- start		可选。如果缓存为一个list,start指定获取的起点。只在此缓存为list的情况下有效。
- stop		可选。如果缓存为一个list,stop指定获取的终点。只在此缓存为list的情况下有效。
- is_rev	可选。如果值为"rev",则表示反向获取列表。只在此缓存为list的情况下有效。
Model_name:delCache (key)
删除缓存。
- key		要删除的缓存的名字
Model_name:existCache (key)
判断缓存是否存在。
- key		缓存名字
Model_name:addCacheMember (key, val, score)
将val添加到缓存中去。
- key		缓存名字
- val		要添加的值。val可以为一个Bamboo模型的对象实例,也可以为实例的id,也可以为其它的字符串
- score		可选。如果cache的是一个list,则利用此score,可以手动指定要添加的值在缓存中的排序位置
Model_name:removeCacheMember (key, val)
将val从缓存中去除。
- key		缓存名字
- val		要删除的值。val可以是一个对象实例,也可以为实例的id,也可以为其它的字符串
Model_name:hasCacheMember (key, mem)
检测缓存中是否有成员mem。
- key		缓存名字
- mem		成员对象。mem可以是一个对象实例,也可以为实例的id,也可以为其它的字符串
Model_name:numCache (key)
计算当前缓存的长度。
- key		缓存名字
Model_name:lifeCache (key)
计算当前缓存的生命期,即还有多长时间过期,单位:秒。
- key		缓存名字
instance_obj:addToCacheAndSortBy(cache_key, field, sort_func)
将实例添加到缓存中并按某种规则排序
实例方法

- 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

与模型的decorator结合使用

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中写一些逻辑来判断新生成的对象是否满足放到此缓存中的(过滤)条件。

Note

在内部,如果缓存的是一个对象列表,那么,存储的只是它们的id列表。


模板缓存

目前,在bamboo工程的产品模式(PRODUCTION=true)中,自动采用了模板缓存技术,对编译过的模板的中间代码进行缓存,显著提高了运行效率。