从移植到的SQLite的Redis(Porting from SQLite to Redis)

2019-06-24 21:49发布

我使用SQLite在我用来存放8-10列的应用程序。 我用于检索基于任何数量的这些属性的组合的数据。 现在我想移植到Redis的。 所以我建立了它的测试应用程序。

但我无法思考如何设计我的Redis系统以这样的方式,我将能够检索基于任何这些属性的数据。 任何您有任何意见/经验?

Answer 1:

我认为最好的建议是为了避免从RDBMS到Redis的移植时的东西粘在关系模型。 而超出模型,一个重要的区别是把重点放在数据访问路径以及数据结构。

Redis的不包括查询语言(而是命令一拉memcached的),因此无法回复任意查询。 如果对数据的访问路径不是数据结构的一部分,则该数据无法被有效地检索。

Redis的是不是最好的NoSQL存储时谈到支持任意查询。 例如,你将得到更好的通过类似的MongoDB服务。

现在,如果你真的想实现与Redis的你的东西,你可以尝试使用类似标记引擎的策略。 您的记录可以存储在哈希对象。 对于您需要支持的任意查询的每一列的一部分,你建立一个使用多组反向指标。

例如:

# Set up the records: one hash object per record
hmset user:1 name Bilbo type Hobbit job None
hmset user:2 name Frodo type Hobbit job None
hmset user:3 name Gandalf type Maiar job Wizard
hmset user:4 name Aragorn type Human job King
hmset user:5 name Boromir type Human job Warrior

# Set up the indexes: one set per value per field
sadd name:Bilbo 1
sadd name:Frodo 2
sadd name:Gandalf 3
sadd name:Aragorn 4
sadd name:Boromir 5
sadd type:Hobbit 1 2
sadd type:Maiar 3
sadd type:Human 4 5
sadd job:None 1 2
sadd job:Wizard 3
sadd job:King 4
sadd job:Warrior 5

# Perform a query: we want the humans who happen to be a king
# We just have to calculate the intersection of the corresponding sets
sinterstore tmp type:Human job:King
sort tmp by nosort get user:*->name get user:*->job get user:*->type
1) "Aragorn"
2) "King"
3) "Human"

通过组合并,交,差,更复杂的查询可以实现。 对于非离散的值,或者用于基于范围查询,有序集(zset)已被使用(并且可以与正常组相组合)。

这种方法通常是相当快的,如果值是足够的判别。 请注意,您没有RDBMS虽然灵活性(无正则表达式,没有前缀的搜索,范围查询是对付疼痛,等...)



文章来源: Porting from SQLite to Redis