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