标签:
随着使用Redis越来越多,无数的开发者发现,某些时候,我们的第一个Redis服务器已经变大。我们可能需要记录更多日志,可能需要更多缓存空间,或者我们已经提前使用在后续章节结束的高级服务之一。不管什么原因,我们需要更多的服务器。
为了更容易的过渡到更多的服务器,我推荐给应用的每个独立部分都运行一个Redis服务器——一个给日志,一个给统计信息,一个给缓存,一个给cookie等等。注意,在一台机器上你可以运行多个Redis服务器,只需要运行在不同的端口上。另外,如果你想减少系统负载,你也可以使用一个Redis的不同数据库,无论如何,通过将不同的数据记录到不同的key空间,你过渡到更多或者更大的服务器也变得更简单了。不幸的时,当你的服务器或者数据库越来越多的时候,管理和分发所有配置信息将变得更加苦逼。
在前面一节,我们使用Redis作为我们是否应该提供一个维护页面的配置源,我们可以再次使用Redis来告诉我们其他Redis服务器信息。进一步来说,使用一个已知的Redis服务器作为配置信息目录来发现怎样连接到所有那些给不同应用或服务组件提供数据的其他Redis服务器。而我们这里,会使用某种方式,当配置改变时将会连接到正确的服务器。我们的实现将比这个例子调用的更加通用,但是我们必须确定你使用这种方式来获取配置信息之后,你能够开始将它使用到非Redis服务器或者服务。
我们将构建一个函数能够从一个使用这个服务的类型和应用组件命名的key获取到json格式的配置信息。举例来说,如果我们想获取保存统计信息的Redis服务器的连接信息,我们将获取名为config:redis:statistics的key。代码如下
#https://github.com/huangz1990/riacn-code/blob/master/ch05_listing_source.py#L415
def set_config(conn, type, component, config): conn.set( ‘config:%s:%s‘%(type, component), json.dumps(config))
有了这个set_config()函数,我们就可以将我们任何配置设置成json格式。随着语意略有变化,一个类似于前面的is_under_maintenance()结构的get_config()函数来替换is_under_maintenance()函数,参考以下匹配set_config()的代码,将允许我们间隔1秒,10秒或0秒来缓存配置信息,具体间隔依赖于我们的需要。
#https://github.com/huangz1990/riacn-code/blob/master/ch05_listing_source.py#L413
CONFIGS = {} CHECKED = {} def get_config(conn, type, component, wait=1): key = ‘config:%s:%s‘%(type, component) # 检查是否需要对这个组件的配置信息进行更新。 if CHECKED.get(key) < time.time() - wait: # 有需要对配置进行更新,记录最后一次检查这个连接的时间。 CHECKED[key] = time.time() # 取得Redis存储的组件配置。 config = json.loads(conn.get(key) or ‘{}‘) # 将潜在的Unicode关键字参数转换为字符串关键字参数。 config = dict((str(k), config[k]) for k in config) # 取得组件正在使用的配置。 old_config = CONFIGS.get(key) # 如果两个配置并不相同…… if config != old_config: # ……那么对组件的配置进行更新。 CONFIGS[key] = config return CONFIGS.get(key)
现在我们已经有了一对获取和设置配置信息的函数,我们还能做更多。我们开始沿着这个存储路径并且获取配置来创建各种不同的Redis服务器连接。但是到目前为止,我们大部分函数的第一个参数都是redis 连接。让我们创建一个方法来自动连接那些服务,而无需手动获取服务器连接。
<Redis实战>5.4.2 每个应用组件使用一个Redis服务器
标签:
原文地址:http://www.cnblogs.com/hjyang2012/p/5486733.html