<Redis In Action>5.2.3 Simplifying our statistics recording and discovery

原文:https://redislabs.com/ebook/redis-in-action/part-2-core-concepts-2/chapter-5-using-redis-for-application-support/5-2-counters-and-statistics/5-2-3-simplifying-our-statistics-recording-and-discovery

现在我们已经有了存储在Redis的统计数据,接下来怎么办?具体的来说,我们现在已经有了关于没个页面的访问时间(举例来说)信息,那么我们要怎样发现哪些页面需要很长时间来生成?或者我们怎么知道那些明显了比上一次生成花费了更长的时间?这个简单的答案是,当以上场景发生时,我们需要使用某种方式存储更多的信息来让我们发现问题,这就是我们这节要解释的内容。

如果我们想要记录访问时间,我们需要计算访问时间。我们将花时间在各个地方添加访问时间的计算,然后添加代码来保存访问时间,或者实现某些东西来帮助我们计算和存储访问时间。那么同样助手也可以使得那些信息可用,(比如)存储在ZSET里的平均访问最慢的页面信息,甚至可用取得那些比以前生成页面花费更多时间的报告。

为了帮助我们计算和存储访问时间,我们需要写一个Python context manager来包装我们计算和存储访问时间的代码,这个context manager将获取当前时间,执行包装代码,然后计算总执行时间,记录到Redis,然后更新一个最高访问时间的ZSET。下面这个代码清单展示了我们的context manager如何执行这组操作。

#代码来源https://github.com/huangz1990/riacn-code/blob/master/ch05_listing_source.py#L283@contextlib.contextmanager
def access_time(conn, context):
    # 记录代码块执行前的时间。
    start = time.time()
    # 运行被包裹的代码块。
    yield                                                              

    # 计算代码块的执行时长。
    delta = time.time() - start
    # 更新这一上下文的统计数据。
    stats = update_stats(conn, context, ‘AccessTime‘, delta)
    # 计算页面的平均访问时长。
    average = stats[1] / stats[0]                                      

    pipe = conn.pipeline(True)
    # 将页面的平均访问时长添加到记录最慢访问时间的有序集合里面。
    pipe.zadd(‘slowest:AccessTime‘, context, average)
    # AccessTime有序集合只会保留最慢的100条记录。
    pipe.zremrangebyrank(‘slowest:AccessTime‘, 0, -101)
    pipe.execute()

在access_time() context manager 中有些神奇的事情,他有助于我们明白在使用过程中发生了什么。下面的代码展示了access_time() context manager 被用来通过一种类似于第二章使用的中间件或者插件来记录网页访问时间:

def process_view(conn, callback):
    # 计算并记录访问时长的上下文管理器就是这样包围代码块的。
    with access_time(conn, request.path):
        # 当上下文管理器中的yield语句被执行时,这个语句就会被执行。
        return callback()     

看完这个例子之后,即使你不知道如何创建一个context manager,你至少知道怎么去使用它。在这个例子中我们使用了一个access_time context manager 来计算生成一个页面的总时间。这个context manager也可以用来记录数据库查询时间或者渲染一个模板的时间。作为练习,你能思考另外一种有用的context manager来记录统计信息?或者你能够添加超出两个标准偏差的访问时间报告到recent_log()?

context manager

时间: 2024-10-10 13:24:31

<Redis In Action>5.2.3 Simplifying our statistics recording and discovery的相关文章

《Redis in Action》笔记(一)文章投票(1)初始化数据 + 投票 + 发布文章

原书用 Python 与 Redis 进行交互,我用 PHP 来实现. 环境:LNMP(CentOS 6.6 + Nginx 1.8.0 + MySQL 5.6.23 + PHP 5.6.9)+ Redis 3.0.7 + phpredis 2.2.4 首先在 Linux 开启 Redis 服务: [[email protected] ~]# cd /usr/local/redis/ [[email protected] redis]# ./bin/redis-server ./etc/redi

&lt;Redis In Action&gt;5.3 IP-to-city and -country lookup

原文:https://redislabs.com/ebook/redis-in-action/part-2-core-concepts-2/chapter-5-using-redis-for-application-support/5-3-ip-to-city-and-country-lookup 当我们已经收集了统计信息和日志到Redis,我们已经收集了关于我们系统访客的行为信息.但是我们忽略了访客行为的一个重要的部分 ——访客来自哪里?在这一节我们将建造一组用来解析IP到地区数据库的函数,并

《Redis in action》读书笔记

https://www.gitbook.io/book/abcfy2/redis-in-action-reading-notes 最近在学习redis,正在看这本书,以笔记的形式记录下这本书,方便以后翻阅. 这本书介绍很不错,入门很值得参考,图文并茂解说redis的存储数据类型,很容易理解. 其中范例代码使用python编写,对熟悉python的用户很容易上手. 每章记录一下几个要点. 源码托管在github: https://github.com/abcfy2/redis-in-action-

&lt;Redis In Action&gt; 5.2.1 Storing counters in Redis

原文:https://redislabs.com/ebook/redis-in-action/part-2-core-concepts-2/chapter-5-using-redis-for-application-support/5-2-counters-and-statistics/5-2-1-storing-counters-in-redis 正如监控应用程序一样,随着时间的推移,获取系统信息变得越来越重要.代码变更(能够影响站点响应速度以及服务的网页数量),新的广告活动,新的用户都能从根

&lt;Redis In Action&gt; 5.1.2 Common logs

文章来源:https://redislabs.com/ebook/redis-in-action/part-2-core-concepts-2/chapter-5-using-redis-for-application-support/5-1-logging-to-redis/5-1-2-common-logs 如果你已经运行了log_recent(),你可能会发现,尽管它在获取系统当前发生了什么事情方面非常有用,但它不含告诉你是否错过了一些重要的信息,通过记录一些特定信息的出现频率,你就能够依

Redis和Memcached的区别

?说到redis就会联想到memcached,反之亦然.了解过两者的同学有那么个大致的印象:redis与memcached相比,比仅支持简单的key-value数据类型,同时还提供list,set,zset,hash等数据结构的存储:redis支持数据的备份,即master-slave模式的数据备份:redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用等等,这似乎看起来redis比memcached更加牛逼一些,那么事实上是不是这样的呢?存在即合理,我们来根

Hello Redis - Voting on articles

Redis in Action JOSIAH L. CARLSON MANNING Shelter Island 1 ONE_WEEK_IN_SECONDS = 7 * 86400 2 VOTE_SCORE = 432 3 4 def article_vote(conn, user, article): 5 cutoff = time.time() - ONE_WEEK_IN_SECONDS 6 if conn.zscore('time:', article) < cutoff: 7 retur

redis应用场景(1)一个文字投票网站

构建一个文章投票网站,一般具备下面几个功能 发布文章 文章投票评分(按投票多少进行评分) 文章排序(按发布时间,按评分高低) 文章分组(如专题) ... 1.关系型数据库设计 其中用户,组两个表简单化处理了.业务实现起来也相当简单.不再赘述.重点是如何使用redis实现类似的业务逻辑. 由于redis是基于key-value管理,属于列式数据库.和关系型数据库实现方式差异较大,值得研究. redis的设计,最重要的一部分工作就是key的命名以及键值数据类型的选择上. 2.Redis设计 关系型数

Redis中的数据结构与常用命令

开发系统:Ubuntu 17.04Redis驱动:StackExchange.Redis 1.2.3Redis版本:3.2.1开发平台:.NET Core 对于Redis的介绍这里只写一句:Redis是一种基于内存的高性能非关系型数据库,它以kye-value的形式来存储数据. 5种数据结构 Redis中包含5种数据类型:STRING.LIST.SET.HASH.ZSET. Redis中的5中数据结构(截图出自<Redis in Action>): Redis以key-value形式存储数据,