• 网站架构之缓存应用(4)缓存监控管理


        对于web系统中增加缓存服务,使用起来还是挺方便的,目前可采用的方案比较多,有微软的企业库,memcached等等。但如果需要很好的对项目中的缓存进行监控管理,也不是一件特别容易的事情,例如:监控缓存服务器上都有哪些项目使用了缓存,具体都有多少个key,大小,单个key的命中率以及过期时间等信息。有了这些信息,就非常容易排查内存为什么快用完的问题,如果再提供手动过期缓存的服务,就更好了,有的时候由于数据出错,需要紧急让缓存失效,此种办法影响最小。
       
        这篇我来总结了针对memcached的缓存管理。
       
        其实memcached本身也提供了一些缓存统计信息,例如:当前总共的缓存数量,使用的内存量,总获取次数,总的写入次数,总的命中次数等等,但这种统计信息粒度太大:

        1:无法具体到单个key,如果我们想针对某一个key统计它的命中率情况,就不好办了。

        2:无法分析系统中都有哪些项目使用了key,哪个项目占用的key多,内存多。

        3:无法实现手工过期,这种需求某些特殊情况下也是很有帮助的。

        既然memcached本身不提供,我这里采用了一种变通的方式来记录我们特定的信息。
       
        首先我们引进一个概念:分区,这个分区可以理解成电脑上的硬盘分区,用户可以把不同的文件放在不同的分区上,这样在管理上也容易些,同样分区底下有子分区,就像电脑上的文件一样,子分区下面就是具体的key了,对于我们的cache后台管理,可以这样理解,一个项目可以分配为一个分区,按项目功能模块可以分为不同的子分区,子分区下来分散着N多key。

                                                   
        
        实现方案:我们可以对每个key的访问记录下它的一些信息,例如:大小,所属分区名,过期时间,访问命中率,然后把这些信息在每个memcached 实例上创建一个特殊key,用于存储key的访问信息。
       
        注意点:

           1:由于记录访问信息都需要更新特殊key,如果过于频繁,会影响正常的cache性能,所以可以考虑形成一个内存队列,当数量达到多少后(如果key使用频率不高,还可以设定时间,当过了这个时间,即使数量不够也进行更新),统一更新特殊key内容。
           2:由于memcached有单个key大小限制,所以对于这种统计信息key,不能过大,记录key访问信息时,尽量以文本形式存储,这样能保证最小。

           3:每个实例中对应一个用于存储key访问信息的key,这样可以统计更多的key。

               
        监控视图:通过上面的努力,我们可以形成三个视图:
        第一:memcached 实例视图,以某个具体cache实例为单位,呈现memcached服务本身所提供的统计信息,还包含此实例中包含了多少个分区,即实例上包含了多少个项目使用的缓存。
        第二:分区视图,根据分区名称,集合所有节点的数据,最终汇总出统计数据,例如可以统计酒店项目总共使用了多少个key等,这对分析key的分布情况比较有帮助。
        第三:key视图,呈现具体key的访问信息,以及手工过期功能。

        总结:上面的方案虽然能实现需求,但在实际生产环境中,尽量不要打开这种监控功能,需要的时候再打开,尽量让cache的效率最高。

  • 相关阅读:
    最大子数组
    链表插入排序
    链表求和
    有效回文串
    排球比赛计分系统
    超市收银系统
    三层架构
    Wpf+数据库代码封装+策略模式封装
    封装逻辑用策略模式实现
    代码封装
  • 原文地址:https://www.cnblogs.com/ASPNET2008/p/1987330.html
Copyright © 2020-2023  润新知