【问题标题】:Porting from SQLite to Redis从 SQLite 移植到 Redis
【发布时间】:2012-06-03 09:08:52
【问题描述】:

我将 SQLite 用于我曾经在其中存储 8-10 列的应用程序。我曾经根据任意数量的这些属性的组合来检索数据。现在我想移植到 Redis。所以我正在为它构建一个测试应用程序。

但是我无法想到如何设计我的 redis 系统,以便我能够根据这些属性中的任何一个检索数据。大家有什么建议/经验吗?

【问题讨论】:

    标签: database redis key-value


    【解决方案1】:

    我认为最好的建议是在将某些内容从 RDBMS 移植到 Redis 时避免坚持使用关系模型。除了模型之外,一个重要的区别是关注数据访问路径以及数据结构。

    Redis 不包含查询语言(而是命令 la 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 的灵活性(没有正则表达式,没有前缀搜索,范围查询很难处理,等等......)

    【讨论】:

      猜你喜欢
      • 2014-08-23
      • 1970-01-01
      • 1970-01-01
      • 2015-11-04
      • 2015-04-23
      • 1970-01-01
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多