Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby memcached是否有类似ORM的包装器_Ruby_Memcached - Fatal编程技术网

Ruby memcached是否有类似ORM的包装器

Ruby memcached是否有类似ORM的包装器,ruby,memcached,Ruby,Memcached,我正在寻找一个RubyGem(或rails插件),它以ActiveRecord抽象SQL细节的方式抽象memcached的细节。我不是在寻找帮助在memcached中缓存ActiveRecord模型的东西。我相信大约有4215颗宝石可以帮助解决这个问题 理想情况下,我希望能够做到以下几点: class Apple < MemcachedModel # whatever else here end 它将在memcached中查找这个类的JSON表示并反序列化它。我还可以做一些事情,比如:

我正在寻找一个RubyGem(或rails插件),它以ActiveRecord抽象SQL细节的方式抽象memcached的细节。我不是在寻找帮助在memcached中缓存ActiveRecord模型的东西。我相信大约有4215颗宝石可以帮助解决这个问题

理想情况下,我希望能够做到以下几点:

class Apple < MemcachedModel
# whatever else here
end
它将在memcached中查找这个类的JSON表示并反序列化它。我还可以做一些事情,比如:

my_apple.color = "red"

# persist changes back to memcached
my_apple.save 

# load any changes from memcached into local model
my_apple.update

现在看来,一定有人已经解决了这个问题,并按照这些思路创建了一些东西,但每当我在谷歌上搜索这样一个宝石时,我都会不断地找到一些东西来帮助使用memcached缓存AR模型。

我不知道有什么Ruby ActiveRecord之类的memcached适配器。类似的库可能很难创建,因为Memcached不充当关系数据库

结果是该库无法实现ActiveRecord支持的大约80%的功能,那么这种实现有什么好处呢? 在Rails中,您已经拥有了使用“CRUD”模式的memcache所需的一切


如果您觉得更舒服,可以创建一个包装器,并用相应的new/create/update/save/destroy方法代理这些方法。然而,仅仅因为Memcached并不打算成为一个关系数据库,您就永远无法超越基本的CRUD系统。

这很容易实现

require 'ostruct'
require 'active_support/cache'

class StoredStruct < OpenStruct
  attr_writer :store
  def self.store
    @store || superclass.store
  end

  def self.expand_key(key)
    'StoredStruct_' + (superclass == OpenStruct ? '' : "#{self}_") + key.to_s
  end

  def self.get_unique_id
    key = expand_key('unique_id')
    store.write(key, 0, :unless_exist => true)
    store.increment(key)
  end

  def self.save(instance)
    id = instance.id || get_unique_id
    store.write(expand_key(id), instance)
    id
  end

  def self.find(id)
    store.read(expand_key(id))
  end

  attr_reader :id

  def attributes
    @table
  end

  def attributes=(hash)
    @table = hash
  end

  def new_record?
    self.id.nil?
  end

  def save
    @id = self.class.save(self)
    true
  end

  def reload
    instance = self.class.find(self.id)
    self.attributes = instance.attributes unless self == instance
    self
  end
end
需要“ostruct”
需要“活动\u支持/缓存”
类StoredStructtrue)
存储增量(键)
结束
def self.save(实例)
id=instance.id | | get_unique_id
写入(扩展密钥(id),实例)
身份证件
结束
def自我查找(id)
存储读取(扩展密钥(id))
结束
属性读取器:id
def属性
@桌子
结束
def属性=(散列)
@表=散列
结束
def新记录?
self.id.nil?
结束
def保存
@id=self.class.save(self)
真的
结束
def重新加载
instance=self.class.find(self.id)
self.attributes=instance.attributes,除非self==instance
自己
结束
结束
像这样使用它:

# connect to memcached
StoredStruct.store = ActiveSupport::Cache::MemCacheStore.new("localhost:11211")

class Apple < StoredStruct
end

fruit = Apple.new
fruit.color = "red"
fruit.taste = "delicious"

fruit.id
#=> nil

fruit.save
#=> true
fruit.id
#=> 1

# to load any changes:
fruit.reload

Apple.find(1)
#=> fruit
#连接到memcached
StoredStruct.store=ActiveSupport::Cache::MemCacheStore.new(“localhost:11211”)
类Apple<存储结构
结束
水果=苹果
fruit.color=“红色”
水果味=“美味”
水果id
#=>零
水果。保存
#=>正确
水果id
#=> 1
#要加载任何更改,请执行以下操作:
水果装
苹果。查找(1)
#=>水果

您可能正在寻找。

您可以看看我的
moneta
gem,它是一种适用于各种键值存储的ORM'ish产品。您可以在以下网址查看:

moneta背后的基本思想是,所有KVS的行为应该与普通Ruby哈希的子集完全相同。我们支持:

#[]
#[]=
#delete
#fetch
#key?
#store
#update_key
#clear
store
update\u key
方法采用额外的选项散列,您可以使用该散列:

cache = Moneta::Memcache.new(:server => "localhost:11211", :namespace => "me")
cache.store("name", "wycats", :expires_in => 2)
cache.update_key("name", :expires_in => 10)
我们支持大量KVS:

  • 伯克利
  • CouchDB
  • DataMapper(指DM支持的任何存储)
  • 档案
  • LMC
  • 内存缓存
  • 进程内存
  • 蒙哥达
  • 雷迪斯
  • 东京内阁
  • 东京暴君
  • S3
  • SDBM
  • 使用XAttrs的文件
每个存储都支持到期,可以是本机(如memcached)或使用模拟memcache样式到期的标准模块。API始终是相同的,并且有一个共享规范,所有适配器都是根据该规范运行的,以确保遵从性


添加自己的适配器也很容易,这就是为什么存在这么多适配器的原因。

正如Simone Carletti所写,Memcached不是关系数据库;它甚至不能列出所有的键。因此,任何在Memcached中存储数据的类似ActiveRecord的模型都不会包含ActiveRecord的所有功能。尽管如此,我认为为所有模型提供一致的API是有价值的,因此,如果让其中一个模型将其数据存储在Memcached中是有意义的,那么您可以使用我为此创建的这个模块:


谢谢Sarah,但这正是我不想要的——ActiveRecord的缓存库。啊,我看我误解了你的问题。您想完全放弃ActiveRecord,只将对象存储在memcached中吗?我很好奇你将存储什么样的东西。是的,我有从另一个API获得的瞬态数据。我希望在本地缓存数据,这样我就不必每次为请求提供服务时都往返于另一个API。我缓存的东西是帐户信息——像用户、组织等对象。我特别喜欢你实现get_unique_id的方式。理想情况下,我希望使用现有的库,而不是重新发明轮子,但如果我真的需要从头开始做这件事,我很想偷你这里的:)这是一个非常有趣的库。谢谢你把它贴在这里!酷。谢谢你,耶胡达,我来看看。我一直在寻找一个借口来玩弄这些新出现的持久散列存储。
#[]
#[]=
#delete
#fetch
#key?
#store
#update_key
#clear
cache = Moneta::Memcache.new(:server => "localhost:11211", :namespace => "me")
cache.store("name", "wycats", :expires_in => 2)
cache.update_key("name", :expires_in => 10)