• 闲谈关于discuz内核缓存机制


         Discuz! 缓存

    Discuz! X2.5 的 config_global.php 中有这样一行代码

      

    $_config['cache']['type'] = 'sql';
    

      这就是 Discuz! 内置的缓存方式,如果填写 'sql' 则为使用数据库缓存,填写 'file' 则为使用文件缓存。

       

    内存级缓存

    缓存层的引入是为了解决MYSQL自身对高并发处理的性能瓶颈,目前产品缓存层采用主流的Key-Value对形式,内存级的缓存产品很多,支持的内存优化接口有 Memcache、eAccelerator、Alternative PHP Cache(APC)、Xcache、Redis 五种,优化系统将会依据当前服务器环境依次选用接口,单服务器环境中推荐使用APC,多服务器环境中推荐使用Redis或Memcache。

    数据层是以表为单位的类文件,所有表类都继承discuz_table基类,基类实现缓存操 作的相关函数;理论上所有的数据表均可以缓存,目前产品在六个压力大的数据表内置开启了缓存 机制:用户相关表、回帖、主题、主题和专辑关系、淘贴专辑、用户关注关系。

    • 用户相关表

    缓存表:'common_member', 'count', 'status','profile', 'field_home', 'field_forum'。
    UID为缓存KEY。表数据更新时缓存数据会同步更新。

    • 回帖

    以TID为单位,缓存第一页的post数据。表数据更新时缓存数据会同步更新。

    • 主题

    TID为缓存KEY。表数据更新时缓存数据会同步更新。
    版块列表默认参数第一页时以 forumdisplay_FID 为缓存KEY,缓存时间内数据不更新。

    • 主题和专辑关系

    以TID为单位,此TID的专辑ID集合,表数据更新时缓存数据会同步更新。

    • 淘贴专辑

    以TID为单位,此TID的专辑集合,缓存时间内数据不更新。

    • 用户关注关系

    以UID为单位,此UID关注用户的关系数据,缓存时间内数据不更新。

    内存级缓存层实现细节

      • discuz_table基类中缓存机制的实现
      • /** 
        * @var string 缓存主键名前缀,为空时表示此表不支持缓存 
        */ 
        protected $_pre_cache_key; 
        
        /** 
        * @var string 缓存时间,以秒为单位,0表示永久或相关配置文件中的默认值 
        */ 
        protected $_cache_ttl; 
        
        • discuz_table基类中缓存机制的方法
        • //缓存一个变量到缓存中,如果 KEY已经在则会被覆盖为新值
          store_cache($id, $data, $cache_ttl = null, $pre_cache_key = null)
          //获取指定KEY的缓存数据
          fetch_cache($ids, $pre_cache_key = null)
          //清除指定KEY的缓存
          clear_cache($ids, $pre_cache_key = null)
          //更新一个已经存在的KEY,只更新修改的字段
          update_cache($id, $data, $cache_ttl = null, $pre_cache_key = null)
          //批量更新缓存,只更新已经存在KEY的指定修改的字段
          update_batch_cache($ids, $data, $cache_ttl = null, $pre_cache_key = null)
          //重置已经存在的KEY的值
          reset_cache($ids, $pre_cache_key = null)
          //累加缓存数据中某字段的值
          increase_cache($ids, $data, $cache_ttl = null, $pre_cache_key = null)
          

            

          

  • 相关阅读:
    DLL导出类避免地狱问题的完美解决方案
    WorldWind源码剖析系列:影像图层类ImageLayer
    WorldWind源码剖析系列:插件类Plugin、插件信息类PluginInfo和插件编译器类PluginCompiler
    多线程中的锁系统(一)-基础用法
    [转]分布式计算框架综述
    C#自定义控件开发
    GDI+编程小结
    C#自定义控件
    WorldWind源码剖析系列:窗口定制控件类WorldWindow
    WorldWind源码剖析系列:四叉树瓦片集合类QuadTileSet
  • 原文地址:https://www.cnblogs.com/68xi/p/11590398.html
Copyright © 2020-2023  润新知