<Redis实战>5.4.3 Redis自动连接管理

原文:https://redislabs.com/ebook/redis-in-action/part-2-core-concepts-2/chapter-5-using-redis-for-application-support/5-4-service-discovery-and-configuration/5-4-3-automatic-redis-connection-management

手动创建Redis连接可能比较艰难,不仅仅需要不断的读取配置,如果我们使用上一节的配置管理函数,我们仍然需要读取配置,连接Redis,并使用这个连接进行某种处理。为了简化所有连接,我们写了一个装饰器来打理所有Redis连接(除了保存配置的服务器)

装饰器,Python有一个语法支持将一个函数X传递给另一个函数Y。这个函数Y就叫做装饰器,装饰器提供机会去改变函数X的行为,有些装饰器验证参数,有些注册回调函数,还有一些就像我们打算做的管理连接。

我们的装饰器使用一个叫做configuration 的参数,它将生成一个包装,当调用实际函数的时候,包装函数会自动连接到合适的Redis服务器。并且这个连接将和我们之后提供的其他参数一起传递到包装函数,redis_connection()函数如下

#https://github.com/huangz1990/riacn-code/blob/master/ch05_listing_source.py#L451REDIS_CONNECTIONS = {}

# 将应用组件的名字传递给装饰器。
def redis_connection(component, wait=1):                        #A
    # 因为函数每次被调用都需要获取这个配置键,所以我们干脆把它缓存起来。
    key = ‘config:redis:‘ + component                           #B
    # 包装器接受一个函数作为参数,并使用另一个函数来包裹这个函数。
    def wrapper(function):                                      #C
        # 将被包裹函数里的一些有用的元数据复制到配置处理器。
        @functools.wraps(function)                              #D
        # 创建负责管理连接信息的函数。
        def call(*args, **kwargs):                              #E
            # 如果有旧配置存在,那么获取它。
            old_config = CONFIGS.get(key, object())             #F
            # 如果有新配置存在,那么获取它。
            _config = get_config(                               #G
                config_connection, ‘redis‘, component, wait)    #G

            config = {}
            # 对配置进行处理并将其用于创建Redis连接。
            for k, v in _config.iteritems():                    #L
                config[k.encode(‘utf-8‘)] = v                   #L

            # 如果新旧配置并不相同,那么创建新的连接。
            if config != old_config:                            #H
                REDIS_CONNECTIONS[key] = redis.Redis(**config)  #H

            # 将Redis连接以及其他匹配的参数传递给被包裹函数,然后调用函数并返回执行结果。
            return function(                                    #I
                REDIS_CONNECTIONS.get(key), *args, **kwargs)    #I
        # 返回被包裹的函数。
        return call                                             #J
    # 返回用于包裹Redis函数的包装器。
    return wrapper      

我知道这组嵌套函数容易混淆,但是这真的不是特别糟糕,函数redis_connection(),指定一个应用组件并且返回一个包装函数,这个包装函数接下来调用我们传递连接的那个函数(被包装的函数),然后返回函数调用者,这个调用者处理所有包括读取配置,连接服务器,然后调用我们的被包装函数,虽然说起来非常拗口,但实际上使用非常方便,你可以通过使用如下代码将这个装饰器应用到我们5.1.1节的log_recent()函数

@redis_connection(‘logs‘)                   # redis_connection()装饰器非常容易使用。
def log_recent(conn, app, message):         # 这个函数的定义和之前展示的一样,没有发生任何变化。
    ‘the old log_recent() code‘
log_recent(‘main‘, ‘User 235 logged in‘)    # 我们再也不必在调用log_recent()函数时手动地向它传递日志服务器的连接了。

现在你已经知道使用redis_connection()到log_recent(),似乎并不是太糟糕,是不是?使用这个更好的方法来处理连接和配置,我们仅仅从我们调用的每个函数中移除了少数几行,做为一个练习,尝试将这个装饰器添加到5.2.3节的access_time()内容管理器从而使我们不需要传递一个连接,可以随意重用这个装饰器到这本书的所有例子。

时间: 2024-11-13 10:43:17

<Redis实战>5.4.3 Redis自动连接管理的相关文章

Redis实战(八)Redis的持久化

Redis相比Memcached的很大一个优势是支持数据的持久化, 通常持久化的场景一个是做数据库使用,另一个是Redis在做缓存服务器时,防止缓存失效. Redis的持久化主要有快照Snapshotting和AOF日志文件两种方式. 前者会根据配置的规则定时将内存中的数据持久化到硬盘上, 后者则是在每次执行写命令之后将命令记录下来. >>RDB方式 Redis是会以快照的形式将数据持久化到磁盘上. 默认会将快照文件存储在Redis当前进程的工作目录的dump.rdb文件中, 可以通过配置文件

Redis实战(一)Redis简介

关于Redis Redis是一款开源的高性能键值对数据库,最初的作者是意大利的Salvatore Sanfilippo,他的github是 antirez ,Redis的源码同样托管在Git上:https://github.com/antirez/redis.目前,Vmware在资助着redis项目的开发和维护. Redis的特性 键值对如dict["key"]="value"中,"key"是键名,"value"是键值,Red

Redis实战(三)Redis主从复制

从架构 1.主从架构图 2.通过命令 mkdir redisCluster创建redis集群文件夹 3.通过命令mkdir 6380   mkdir 6381   mkdir 6382在redisCluster文件夹下创建三个文件夹 4.通过以下命令将redis.conf分别拷贝到6380.6381. 6382文件夹下 cp /usr/local/redis/redis-3.0.2/redis.conf  ./6380 cp /usr/local/redis/redis-3.0.2/redis.

Redis实战(十三)Redis的三种集群方式

序言 能聊聊redis cluster集群模式的原理吗 资料 https://www.cnblogs.com/51life/p/10233340.html Redis 集群分片原理 原文地址:https://www.cnblogs.com/cnki/p/11403933.html

Redis实战之Redis + Jedis[转]

http://blog.csdn.net/it_man/article/details/9730605 2013-08-03 11:01 1786人阅读 评论(0) 收藏 举报 目录(?)[-] 一简单使用Jedis 二池化使用Jedis 三一致性哈希 四Spring封装参考 用Memcached,对于缓存对象大小有要求,单个对象不得大于1MB,且不支持复杂的数据类型,譬如SET 等.基于这些限制,有必要考虑Redis! 相关链接: Redis实战 Redis实战之Redis + Jedis R

Redis 实战篇之搭建集群

Redis 集群简介 Redis Cluster 即 Redis 集群,是 Redis 官方在 3.0 版本推出的一套分布式存储方案.完全去中心化,由多个节点组成,所有节点彼此互联.Redis 客户端可以直接连接任何一节点获取集群中的键值对,不需要中间代理,如果该节点不存在用户所指定的键值,其内部会自动把客户端重定向到键值所在的节点. Redis 集群是一个网状结构,每个节点都通过 TCP 连接跟其他每个节点连接. 在一个有 N 个节点的集群中,每个节点都有 N-1 个流出的 TCP 连接,和

Redis实战 | 持久化、主从复制特性和故障处理思路

前言 前面两篇我们了解了Redis的安装.Redis最常用的5种数据类型.本篇总结下Redis的持久化.主从复制特性,以及Redis服务挂了之后的一些处理思路. 前期回顾传送门: Linux下安装Redis简易教程Redis实战 | 5种Redis数据类型详解 Redis的两种持久化方式 经常有面试官会问:Redis数据存储在内存中,万一断电了怎么办呢? 不要慌,这个其实就是在问Redis的持久化策略啦.我们知道,保存在内存中的数据,在服务重启或者是机器挂掉之后是会丢失的.而硬盘中的数据是不会丢

redis实战 pdf 完整版 PDF高清下载

<redis实战>深入浅出地介绍了Redis的5种数据类型,并通过多个实用示例展示了Redis的用法. 除此之外,书中还讲述了Redis的优化方法以及扩展方法,是一本对于学习和使用 Redis 来说不可多得的参考书籍.<redis实战>一共由三个部分组成. 部分对Redis进行了介绍,说明了Redis的基本使用方法.它拥有的5种数据结构以及操作这5种数据结构的命令,并讲解了如何使用Redis去构建文章展示网站.cookie.购物车.网页缓存.数据库行缓存等一系列程序. 第二部分对R

C# Redis实战(二)

二.Redis服务 在C# Redis实战(一)中我将所有文件拷贝到了D盘redis文件夹下,其中redis-server.exe即为其服务端程序,双击即开始运行,如图 可以将此服务设置为windows系统服务,下载Redis服务安装软件,安装即可. 安装完成在服务中找到此服务,将其设置为自动延迟启动即可. 再回到redis文件夹下,找到redis-cli.exe文件,它就是Redis客户端程序.打开,输入:set qiujialong 123 即在Redis中插入了一条key为qiujialo