【问题标题】:How can I back out of caching in ActiveModelSerializers?如何退出 ActiveModelSerializers 中的缓存?
【发布时间】:2017-04-01 17:25:51
【问题描述】:

今天我尝试使用 ActiveModelSerializers 设置缓存。我遇到了很多问题(我的连接一直超时)。所以我试图恢复我的所有更改,包括删除我正在处理的分支。

但是,自从我尝试设置缓存后,我使用的模型就表现出奇怪的行为。看起来它仍在加载缓存元素。这会在尝试访问该模型的端点时造成巨大的性能损失。

Started GET "/api/v1/entities" for ::1 at 2016-11-17 16:50:44 -0700
  ActiveRecord::SchemaMigration Load (0.3ms)  SELECT "schema_migrations".* FROM "schema_migrations"
Processing by Api::V1::EntitiesController#index as JSON
  Entity Load (0.4ms)  SELECT "entities".* FROM "entities"  ORDER BY "entities"."name" ASC
  Group Load (0.3ms)  SELECT "groups".* FROM "groups" WHERE "groups"."id" IN (2, 3, 1)  ORDER BY "groups"."name" ASC
  Platform Load (0.4ms)  SELECT "platforms".* FROM "platforms" WHERE "platforms"."id" IN (3, 8)  ORDER BY "platforms"."name" ASC
  HardwareType Load (19.3ms)  SELECT "hardware_types".* FROM "hardware_types" WHERE "hardware_types"."id" IN (1, 3, 19, 8)
  EntityType Load (0.2ms)  SELECT "entity_types".* FROM "entity_types" WHERE "entity_types"."id" IN (1)
  EntityOperationalState Load (0.4ms)  SELECT "entity_operational_states".* FROM "entity_operational_states" WHERE "entity_operational_states"."entity_id" IN (1, 2, 3, 4)
  OperationalState Load (0.2ms)  SELECT "operational_states".* FROM "operational_states" WHERE "operational_states"."id" IN (1)  ORDER BY "operational_states"."name" ASC
  EntityLifecycleState Load (0.4ms)  SELECT "entity_lifecycle_states".* FROM "entity_lifecycle_states" WHERE "entity_lifecycle_states"."entity_id" IN (1, 2, 3, 4)
  LifecycleState Load (0.3ms)  SELECT "lifecycle_states".* FROM "lifecycle_states" WHERE "lifecycle_states"."id" IN (2)  ORDER BY "lifecycle_states"."name" ASC
  IpAddress Load (0.3ms)  SELECT "ip_addresses".* FROM "ip_addresses" WHERE "ip_addresses"."entity_id" IN (1, 2, 3, 4)
  IpType Load (0.2ms)  SELECT "ip_types".* FROM "ip_types" WHERE "ip_types"."id" IN (1)
  IpUse Load (0.4ms)  SELECT "ip_uses".* FROM "ip_uses" WHERE "ip_uses"."id" IN (1, 2)
[active_model_serializers]   Entity Load (0.3ms)  SELECT  "entities".* FROM "entities" WHERE "entities"."id" = ?  ORDER BY "entities"."name" ASC LIMIT 1  [["id", 1]]
[active_model_serializers]   CACHE (0.0ms)  SELECT  "entities".* FROM "entities" WHERE "entities"."id" = ?  ORDER BY "entities"."name" ASC LIMIT 1  [["id", 1]]
[active_model_serializers]   Entity Load (0.2ms)  SELECT  "entities".* FROM "entities" WHERE "entities"."id" = ?  ORDER BY "entities"."name" ASC LIMIT 1  [["id", 2]]
[active_model_serializers]   CACHE (0.0ms)  SELECT  "entities".* FROM "entities" WHERE "entities"."id" = ?  ORDER BY "entities"."name" ASC LIMIT 1  [["id", 2]]
[active_model_serializers]   Entity Load (0.2ms)  SELECT  "entities".* FROM "entities" WHERE "entities"."id" = ?  ORDER BY "entities"."name" ASC LIMIT 1  [["id", 3]]
[active_model_serializers]   CACHE (0.0ms)  SELECT  "entities".* FROM "entities" WHERE "entities"."id" = ?  ORDER BY "entities"."name" ASC LIMIT 1  [["id", 3]]
[active_model_serializers] Rendered ActiveModel::Serializer::CollectionSerializer with ActiveModelSerializers::Adapter::Json (71.13ms)
Completed 200 OK in 617ms (Views: 474.3ms | ActiveRecord: 27.8ms)

[active_model_serializers] Load 和 CACHE 是让我相信序列化程序仍在尝试从缓存加载的新事物。

我的其他模型,我没有用一个 [active_model_serializers] 语句来加载,这是我预期的行为。

Started GET "/api/v1/groups" for ::1 at 2016-11-17 16:56:15 -0700
Processing by Api::V1::GroupsController#index as JSON
  Group Load (0.2ms)  SELECT "groups".* FROM "groups"  ORDER BY "groups"."name" ASC
  Platform Load (0.3ms)  SELECT "platforms".* FROM "platforms" WHERE "platforms"."id" IN (8, 3)  ORDER BY "platforms"."name" ASC
  GroupOperationalState Load (0.2ms)  SELECT "group_operational_states".* FROM "group_operational_states" WHERE "group_operational_states"."group_id" IN (1, 2, 3)
  OperationalState Load (0.2ms)  SELECT "operational_states".* FROM "operational_states" WHERE "operational_states"."id" IN (1)  ORDER BY "operational_states"."name" ASC
  GroupLifecycleState Load (0.4ms)  SELECT "group_lifecycle_states".* FROM "group_lifecycle_states" WHERE "group_lifecycle_states"."group_id" IN (1, 2, 3)
  LifecycleState Load (0.2ms)  SELECT "lifecycle_states".* FROM "lifecycle_states" WHERE "lifecycle_states"."id" IN (2)  ORDER BY "lifecycle_states"."name" ASC
  GroupConfigurationProfile Load (0.3ms)  SELECT "group_configuration_profiles".* FROM "group_configuration_profiles" WHERE "group_configuration_profiles"."group_id" IN (1, 2, 3)
  ConfigurationProfile Load (0.3ms)  SELECT "configuration_profiles".* FROM "configuration_profiles" WHERE "configuration_profiles"."id" IN (1, 2, 3)  ORDER BY "configuration_profiles"."name" ASC
[active_model_serializers] Rendered ActiveModel::Serializer::CollectionSerializer with ActiveModelSerializers::Adapter::Json (1.4ms)
Completed 200 OK in 51ms (Views: 36.3ms | ActiveRecord: 2.1ms)

Started GET "/api/v1/ip_addresses" for ::1 at 2016-11-17 16:58:34 -0700
Processing by Api::V1::IpAddressesController#index as JSON
  IpAddress Load (0.2ms)  SELECT "ip_addresses".* FROM "ip_addresses"
  Entity Load (0.3ms)  SELECT "entities".* FROM "entities" WHERE "entities"."id" IN (1, 2, 3)  ORDER BY "entities"."name" ASC
  IpUse Load (0.2ms)  SELECT "ip_uses".* FROM "ip_uses" WHERE "ip_uses"."id" IN (1, 2)
  IpType Load (0.1ms)  SELECT "ip_types".* FROM "ip_types" WHERE "ip_types"."id" IN (1)
[active_model_serializers] Rendered ActiveModel::Serializer::CollectionSerializer with ActiveModelSerializers::Adapter::Json (2.85ms)
Completed 200 OK in 28ms (Views: 14.8ms | ActiveRecord: 0.9ms)

如您所见,那些额外的数据库访问减慢了我的加载时间。这些模型现在都有大约 3 个对象,但是当我用更多的记录进行测试时,这变成了一个大问题。

如何强制 ActiveModelSerializer 忽略缓存的项目?

更好的选择是找出这些片段的缓存位置,以便我可以清除它们。我试过 Rails.cache.clear,但这没有效果。我也试过了,重启电脑,也关闭了我的 Redis 实例。

【问题讨论】:

    标签: ruby-on-rails caching active-model-serializers


    【解决方案1】:

    没关系。显然这与我正在做的缓存工作无关。

    在我的 has_many 关系中,我有一个对实体名称的循环引用

    【讨论】:

      猜你喜欢
      • 2011-10-05
      • 1970-01-01
      • 2017-10-01
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      • 2018-09-14
      • 2021-12-06
      • 1970-01-01
      相关资源
      最近更新 更多