Redis实用技巧之多应用配置文件

来源:互联网 发布:天猫美工设计流程规范 编辑:程序博客网 时间:2024/06/05 19:05


背景:

话说天下大事,分久必合,合久必分。 





随着业务的发展,网站会分出不同的子系统来处理专门的业务模块,例如电商系统会分裂出商品展示,购物车,个人中心,客户关怀(不存在的),后台管理等若干个子系统,而多个子系统可能都需要连接相同的数据库或者会有一些其他公用的配置文件,如果在每个子系统中都维护一个配置文件,那么当配置修改时,就需要更新每个子系统中的文件。这样操作起来很麻烦,因此我们可以在服务器上开辟一块儿空间用来统一维护配置文件。多个系统只需要拥有一个指向此配置空间的引用即可。


此篇文章以Redis为例,讲解如何配置此功能。


先以一个简单的例子开始,假设我们的网站有时会处于维护当中,那么当用户访问时,需要提示用户网站正在维护当中以此取代正常页面。假设这由一个 is-user-maintenance控制,那么判断的代码应如下(在10秒钟内取相同的配置,避免每次都需要连接Redis)


LAST_CHECKED=None

IS_UNDER_MAINTENANCE=False


def is_under_maintenance(conn):

global LAST_CHECKED,IS_UNDER_MAINTENANCE

if  LAST_CHECKED< time.time()-10:

LAST_CHECKED=time.time()

IS_UNDER_MAINTENANCE=bool(conn.get(‘is-user-maintenance’))

return  IS_UNDER_MAINTENANCE


相应的,我们可以在一个统一的函数里,把这些配置信息写入到Redis中


def set_config(conn,type,component,config):

    conn.set(

‘config:%s:%s’%(type,component),

json.dumps(config))


—————————————————————-

看到这里肯定有热心的读者会说了,What the fuck,这TM就是redis的GET和SET啊,看了这么多,就看你操作GET和SET了???? 





-----------------------

你要这么想,我也没办法,核心的东西已经讲完了,就是这样。。。。接下来,我尽量写些干货,毕竟你已经看了这么多了。。 



        为了使我们的系统更灵活,因此我们在上面代码的基础上做一个扩展:

假设我们现在要为网站开发日志功能,把用户访问的信息记录到专属的日志服务器上。按照上面的思路,我们将日志系统的数据库连接存入在了Redis中,当需要连接时,从Redis中取出连接后连上数据库并写入日志信息。 但是实际的业务中可能有很多种数据库连接,并且在很多函数中都要使用到,如何更优雅的实现呢?

        这里我们引入装饰器Decorator设计模式(限于篇幅,这里就不讲述装饰器设计模式了,因为此篇用到的代码为Python所写,因此给出一个Python的装饰器教程:http://python.jobbole.com/82344/    python实现的Decorator设计模式虽然同GOF定义的有些不同,但是足够简洁好用)


REDIS_CONNECTION={}

def redis_connection(component):

      key = ‘config:redis:’ + component 

      def wrapper(function):

def call(*args, **kwargs):

        _config=get_config(config_connection,’redis’,component)#获取log系统连接参数

        config={}

        for k,v in _config.iteritems():

  config[k.encode(‘utf-8’)]=v

        conn = get_connection(**config)    #根据实际情况获取连接 

      return function(conn,*args,**kwargs)

return call

       return wrapper


此装饰器根据传入的参数先从redis中拿到连接信息,然后连接成功后传递给使用此装饰器的函数。得益于Python的语法糖,我们可以方便的使用此连接功能了,如下所示


@redis_connection(‘logs’)

def log_recent(conn,app,message):

       #具体记录日志逻辑


调用时,我们再也不需要为它创建连接了,只要在上面的装饰器中指定需要访问哪个数据库即可:

log_recent(‘app name’,’this is my log’)


这个装饰器,就像雷锋同志一样,脏活累活他抢着干,默默的为你做好了一切他可以做得事情,你只要实现你关心的业务逻辑即可,是不是非常的感动!!!




原创粉丝点击