2010-01-21 43 views
2

http://www.infoq.com/presentations/newport-evolving-key-value-programming-model是一个关于KV存储的视频,整个前提是redis提供了一种基于列的样式,用于将对象的属性存储在单独的键下,而不是串行化对象并将其存储在单键。可扩展对象的关键值存储区

(这个问题 Redis的特异性,但更多的是一般的风格和一般KV存储最佳实践。)

相反,比如说,一个“人”一个斑点,Redis的鼓励一基于列的样式,其中对象中的属性存储为单独的键,例如

R.set("U:123:firstname","Billy") 
R.set("U:123:surname","Newport") 
... 

我很好奇,如果这是最佳实践,并且人们采取不同的方法。

  • 例如,你可以在一个键下“腌”一个物体。这样做的优势的被获取或设置在一个请求

  • 或者一个人可能是一个列表与第一项作为一个字段名索引或这样?

这让我想 - 我想要一个分级密钥存储,例如

R.set(["U:123","firstname"],"Billy") 
R.set(["U:123","surname"],"Newport") 
R.get(["U:123"]) returns [("firstname","Billy"),("surname","Newport")] 

然后在交易补充:

with(R.get(["U:132"]) as user): 
    user.set("firstname","Paul") 
    user.set("lastname","Simon") 

从比例的角度来看,获取并设置将是重要的配料?

有没有支持这个或有其他适用的方法的关键商店?

回答

1

通过使用额外的Set来跟踪对象的单个成员,您可以在Redis中获得类似的行为。

SET U:123:firstname Billy 
SADD U:123:members firstname 
SET U:123:surname Cobin 
SADD U:123:members surname 

GET U:123:firstname => Billy 
GET U:123:firstname => Cobin 
SORT U:123:members GET U:123:* -> [Billy, Cobin] 
or 
SMEMBERS U:123:members -> [firstname, surname] 
MGET U:123:firstname U:123:firstname 

不完美的匹配,但在许多情况下足够好。有一个interesting article关于hurl如何与Redis一起使用此模式