dal(Data Access Layer)的含义是数据访问层。
背景
在团队的开发中,我们主要是使用mongodb作为持久化db,redis作为缓存服务。两者组合交替使用,当访问缓存的数据不存在时,会访问db。然后把db的数据加载进缓存中。
在不断堆积的业务代码中,我发现了一个代码重复的问题。每次都是需要写那么一段判断缓存数据是否存在,不存在就从数据库加载的逻辑。基于这种情况,我封装了一套redis+mongodb的控制操作。由dal自己去判断缓存数据,并自动从数据库加载。持久层的代码量大大缩减。而且,操作行为都收敛到公开的接口,便于做统一的升级和各种统计。
结构
redis_proxy:用于代理redis的各种操作
redis_pool:python版redis的连接池
mongodb_pool:pymongodb的连接池
redis_list:支持配置多个redis
代码分析
nfind
@ctime(NAME)
"""
table:mongodb的表名
prefix:缓存前缀
query:查询条件,dict类型
cache:是否使用缓存
cache_time:缓存时间
sort:排序条件
criteria:查询的字段
limit:结果数量
cache_kw:关联的缓存key
pack:缓存value是否使用msgpack
"""
def nfind(self, table, prefix="", query={}, cache=True, cache_time=43200, sort=None, criteria=None, limit=None, cache_kw=None, pack=True):
result = None
try:
"""查询缓存"""
if cache:
result = self.redis_proxy.read_by_cache_type(CACHETYPE.string ,table, prefix, query, cache_time, sort=sort, limit=limit, criteria=criteria, pack=pack)
if result is not