`
xxj
  • 浏览: 430418 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

cached_model 简介

阅读更多
数据库是瓶颈,今天我们介绍model级别的cache。Cached Model 是一个简单的只对单记录做缓存的plugin.Cached Model的的存储分为本地存储和Memcached存储。本地存储大家都知道,一般都是用Hash来存储的。这里的Memcached是一种网络分布式存储。

我们先来看看如果应用cached model
一:安装
gem install cached_model -y
二:应用
简单的创建一个工程
rails cached_model_demo
新建Page
ruby script/generate scaffold_resource page title:string content:text created_at:timestamp
创建数据库
rake db:migrate
修改Page Model,继承CachedModel
class Page < CachedModel
end
在enviroment中增加memcached的配置的代码:
require 'cached_model'

memcache_options = {
  :c_threshold => 10_000,
  :compression => true,
  :debug => false,
  :namespace => 'cached_model_demo',
  :readonly => false,
  :urlencode => false
}

CACHE = MemCache.new memcache_options
CACHE.servers = 'localhost:11211'
上面都是一些简单的东西,我们就忽略了,有什么问题,大家提出来。

好了,准备就绪。cached_model 默认是采用memcached store的方式,当然你可以采用local的方式
CachedModel::use_local_cache=true
启动memcached server
memcached -vv
我们传递vv参数可以查看更多的日志信息,具体的可以查看--help


打开ruby script/console 并打开tail -f log/development.log查看日志
新建page
Page.create :title=>'Hello World'
Page.create :title=>'Hello World Again'
成功。cached_model只覆盖了ActiveRecord的两个方法,一个是find,一个是find_by_sql.我们具体的分析一下这两个方法
1:) find
 def self.find(*args)
        args[0] = args.first.to_i if args.first =~ /\A\d+\Z/
        # Only handle simple find requests.  If the request was more complicated,
        # let the base class handle it, but store the retrieved records in the
        # local cache in case we need them later.        
        if args.length != 1 || !Fixnum === args.first then
            # Rails requires multiple levels of indirection to look up a record
            # First call super
            records = super
            # Then, if it was a :all, just return
            return records if args.first == :all
            return records if RAILS_ENV == 'test'
            case records
            when Array then
                records.each { |r| r.cache_store }
            end
            return records
        end

        return super
    end
这里面压根没有读取cache的代码,不管这么样,都会先调用super执行查询,只有在
>参数个数不为1或第一个不是数字
>第一个参数不是:all
>不是test环境下
>返回结果为Array的时候才缓存model   
也就是说基本没什么作用。
我们试验下
Page.find 1

依然执行SQL,memcached无反应

Page.find 1,2
我们会看到memcached中有了两条记录
<1924 new client connection
<1924 set cached_model_demo:active_record:Page:1 0 900 95
>1924 STORED
<1924 set cached_model_demo:active_record:Page:2 0 900 101
>1924 STORED
保存了两条记录

在执行
Page.find 1
依然查询数据库。那我们该如何取这样的数据呢?
>> Cache.get "active_record:Page:1"
=> #"Hello World", "id"=>"1", "content"=>nil, "cr
ed_at"=>"2007-11-10 18:29:29"}>
2:)find_by_sql
 def self.find_by_sql(*args)
        return super unless args.first =~ /^SELECT \* FROM #{table_name} WHERE \(?#{table_name}\.#{primary_key} = '?(\d+)'?\)? +LIMIT 1/
很简单,但是他只cache根据主键id查询的record
Page.find_by_sql "SELECT * FROM PAGES WHERE PAGES.ID = 1 LIMIT 1"
<1924 get cached_model_demo:active_record:Page:1
>1924 sending key cached_model_demo:active_record:Page:1
>1924 END
development.log无SQL查询
MemCache Get (0.000000)  active_record:Page:1



这里取回的是我们刚才执行Page.find 1,2,缓存1的数据,如果没有,则会存储该数据,下次再查询直接从cache中获取。

三:更新
当该id的记录update,destroy都会更新cache,这个没什么好说的。

四:改进
这些功能太过于简单了,我们可以稍微对源码做点修改
一:缓存Page.find 的单条记录
if CachedModel.use_memcache?
        record = Cache.get "active_record:#{name}:#{args.first}"

        #return cached model
        return record unless record.nil?
        #call super find
        record = super
        #store in memcache
        record.cache_store

        return record
      end
    end


二:find_by_sql的改进,空格,大小写必须一致才能生效
这条正则表达式太过于简单,我们可以稍微修改
1:) 忽略大小写 /i
2:) 忽略table的名称,只需要id=?几匹配
2;) 忽略空格


警告:
对于有关联的Model请谨慎使用cached_model,建议不使用。
分享到:
评论
1 楼 yangzhihuan 2009-06-15  
能否提供一下 cached model  的下载地址吗?
这个名字太普遍了,都不知道那个是那个了.

相关推荐

    memcached的安装与配置

    gem install cached_model --no-rdoc --no-ri --with-include-dependencies gem install memcache-client --no-rdoc --no-ri --with-include-dependencies ``` 其中`--with-include-dependencies`参数表示在编译时...

    RNN+Attention实现Seq2Seq中英文机器翻译(pytorch)实现

    `model.py`则可能包含RNN+Attention模型的具体实现,包括编码器、解码器以及Attention层的定义。 - `translate-best.th`是模型的权重文件,表示经过训练得到的最佳模型。在实际应用或测试时,可以加载这些权重以...

    关于Django外键赋值问题详解

    本文主要给大家介绍关于Django外键赋值的相关内容,分享出来供大家参考学习,在开始之前,我们先来看一段代码: class Article(models.Model): title = models.... article = cached_fields.OneToOneField(Ar

    django model去掉unique_together报错的解决方案

    class Exam(models.Model): category = cached_fields.ForeignKeyField(Category) name = models.CharField(max_length=128) date = models.DateField() created_at = models.DateTimeField(auto_now_add=True) ...

    tensorflow-2.15.0-cp311-cp311-manylinux-2-17-x86-64.zip

    - **训练模型**:使用`model.compile()`配置损失函数、优化器和评估指标,然后用`model.fit()`进行训练。 - **保存与恢复模型**:`model.save()`和`tf.keras.models.load_model()`用于模型的持久化和加载。 5. **...

    Moshell_常用指令小结(Node-B)

    Parsing MOM (cached): /home/Administrator/moshell/jarxml/RBS_NODE_MODEL_L_5_6.xml.cache.gz ..Done. Fetching IOR file Done. Connecting to 134.57.20.170:56834 (CorbaSecurity=OFF, corba_class=2, ...

    Python-johnnycachedjango应用缓存框架

    @johnny_dbcache('my_model_cache', timeout=3600) def cached_method(self): # 计算过程 # ... return result ``` ### 5. 进阶使用 除了基础功能,johnny-cache还提供了丰富的进阶特性,如自定义缓存键生成...

    Python库 | SQLAlchemy-Utils-0.5.tar.gz

    5. **模型辅助功能**: 例如,`model_to_dict` 可以将 ORM 模型对象转换为字典,便于 JSON 序列化。`date_trunc` 函数则允许开发者对日期进行截断操作,如获取年份、月份等。 6. **缓存策略**: 提供了如 `cached_...

    activiti5.22数据库设计.doc

    根据提供的文档信息,我们可以深入探讨 Activiti 5.22 版本中的数据库设计细节,这...18. **ACT_RE_MODEL**:此表用于存储流程设计模型的部署信息。 - **字段说明**: - **ID_**:模型 ID。 - **REV_**:版本号。 ...

    python decorator==4.4.2

    在`decorator-4.4.2`这个库中,我们可以找到更高级和灵活的装饰器实现,它提供了如`@wraps`(保留被装饰函数元信息)、`@cached_property`(用于创建缓存属性)等实用工具。这些工具可以帮助我们在Odoo开发中编写...

    Activiti数据库文档的整理

    act_re_model 流程设计模型部署表 **简要描述**:用于保存通过流程设计器设计流程后产生的数据。 **表结构说明**:主要包括ID、REV、NAME、KEY、VERSION、META_INFO、DEPLOYMENT_ID、EDITOR_SOURCE_VALUE_ID、...

    flutter项目框架(后期会持续更新)

    例如,项目可能分为model(模型层)、view(视图层)、controller(控制器层)或BLoC(Business Logic Component)模式,确保代码的可读性和可维护性。此外,还可能涉及provider、riverpod等状态管理库的应用。 2、...

    涡轮增压数据分析:效率提升的秘诀

    cached_result = expensive_function(args) ``` ##### 7. 持续的自动化 自动化重复性的任务可以大大减少人工干预的时间。例如,可以使用Pandas自动化数据处理流程: ```python # 自动化数据处理流程 clean_data....

    38 Flutter仿京东商城项目 渲染结算页面商品数据.rar

    2. **数据模型(Data Model)**:为了存储和管理商品信息,我们需要创建一个数据模型类,包含商品名称、图片URL、单价、数量等属性。这将使我们的代码更加模块化和可维护。 3. **ListView与GridView**:用于显示...

    CUDA_C_Programming_Guide

    - **Constant Memory**: Optimized for read-only access and is cached on-chip for fast retrieval. **2.4 Heterogeneous Programming** CUDA enables developers to write code that can run on both the CPU ...

    CI框架装载器Loader.php源码分析

    - `model($model, $name, $return_object)`: 加载模型,如果需要,还可以提供模型的实例化对象或别名。 - `helper($helpers)`: 加载一组帮助函数。 - `view($view, $vars, $return)`: 加载视图文件,并可以向视图...

    查看opensuse硬件信息

    Cached: 278952 kB SwapCached: 0 kB Active: 428520 kB Inactive: 221364 kB Active(anon): 349624 kB Inactive(anon): 464 kB Active(file): 78896 kB Inactive(file): 220900 kB Unevictable: 0 kB Mlocked: 0 kB...

    加快Python算法的四个方法(一)PyTorch.docx

    使用`torch.cuda.memory_allocated()`和`torch.cuda.memory_cached()`来监控GPU的内存使用情况。 - 使用`torch.cuda.empty_cache()`可以释放GPU缓存,防止内存泄漏。 - 使用Tensor的`.to(device)`方法将数据和模型...

Global site tag (gtag.js) - Google Analytics