【问题标题】:Design Redis database table like SQL?像 SQL 一样设计 Redis 数据库表?
【发布时间】:2014-02-16 07:38:57
【问题描述】:

假设我的数据库表结构是这样的

id name college address
1  xxx   nnn     xn
2  yyy   nnm     yn
3  zzz   nnz     zn

如果我想像这样根据 sql 中的名称获取学生详细信息 select * from student where name = 'xxx' 那么它是如何在redis数据库中实现的

【问题讨论】:

    标签: sql redis nosql


    【解决方案1】:

    Redis 与其他 NoSQL 数据存储一样,根据您将要执行的操作有不同的要求。

    Redis 有多种数据结构,根据您的需要可能会有用。例如,如果您希望使用 select * from student where name = 'xxx',您可以使用 Redis hash

    redis 127.0.0.1:6379> hmset student:xxx id 1 college nnn address xn
    OK
    redis 127.0.0.1:6379> hgetall student:xxx
    1) "id"
    2) "1"
    3) "college"
    4) "nnn"
    5) "address"
    6) "xn"
    

    如果您有其他查询,例如您想做同样的事情但选择where college = 'nnn',那么您将不得不对数据进行非规范化。非规范化在 SQL 中通常是一件坏事,但在 NoSQL 中却很常见。

    如果您的主要查询将针对姓名,但您可能需要针对学院进行查询,那么您可能会执行一些操作,例如在哈希之外添加 set

    redis 127.0.0.1:6379> sadd college:nnn student:xxx
    (integer) 1
    redis 127.0.0.1:6379> smembers college:nnn
    1) "student:xxx"
    

    使用这样的数据结构,如果您想查找上大学 xn 的姓名的所有信息,您将首先选择set,然后根据set 中返回的姓名选择每个hash

    您的要求通常会推动您使用的设计和结构。

    【讨论】:

    • 我如何在 X 学院找到所有姓名为 Y 或描述包含单词 Z 的学生?
    • 我宁愿写hmset students:xxx id 1 college nnn address xn,然后写hgetall students:xxx。没有?
    • @Supersharp,假设您更改为使用college:nnn 而不是college.nnn,就像我的示例一样,这听起来是个好主意。命名空间是个好东西。
    【解决方案2】:

    只需 6 条原则(我收集了 here),一个有 SQL 头脑的人很容易让自己适应 Redis 方法。简而言之,它们是:

    1. 最重要的是,不要害怕生成大量的键值对。因此,您可以随意将表格的每一行存储在不同的键中。
    2. 使用 Redis 的哈希映射数据类型
    3. 用分隔符(如“:”)从表的主键值中形成键名
    4. 将剩余字段存储为哈希
    5. 当你要查询单行时,直接形成键并检索其结果
    6. 当您要查询范围时,请对您的键使用通配符“*”。

    该链接仅提供了一个简单的表格示例以及如何在 Redis 中对其进行建模。遵循这 6 条原则,您可以继续像对待普通桌子一样思考。 (当然没有一些不那么相关的概念,如 CRUD、约束、关系等)

    【讨论】:

      【解决方案3】:

      对于普通的香草 redis,其他答案是完全正确的,但是,昨天(2016 年 12 月 2 日)redis 4-rc1 已发布。

      redis v4 提供了对模块的支持,我只是写了一个小模块来将 SQLite 嵌入到 redis 本身中; rediSQL.

      使用该模块,您实际上可以在您的 redis 实例中使用功能齐全的 SQL 数据库。

      【讨论】:

      • 我可以确认RediSql真的很强大!
      【解决方案4】:

      Redis 只是有一些基本的数据结构,NoSQL 和 SQL 是不同的世界。但是您可以像某些计划的 SQL 数据存储一样使用Redisgithub 上有一个有趣的程序 Redisql 尝试通过 SQL 来玩 Redis,Redisql 背后的想法就是 @sberry 提到的。

      【讨论】:

      【解决方案5】:

      希望现在还不算太晚,因为最初的问题已经长达六年了。你可以试试我的 dbx 插件:https://github.com/cscan/dbx 它支持简单的 SQL 来维护 REDIS 中的哈希值。像这样的:

      127.0.0.1:6379> dbx.select name, tel from phonebook where gender = 'F' order by age desc
      

      或从 shell 调用

      $ redis-cli "dbx.select name, tel from phonebook where gender = 'F' order by age desc" 
      

      希望对您有所帮助。

      【讨论】:

        【解决方案6】:

        你可以试试searchbox 框架。 searchbox 通过其 Criteria api 提供了查询 redis 数据的简便方法。

        【讨论】:

          【解决方案7】:

          OnceDB 是一个基于 Redis 的全文搜索内存数据库。它支持 SQL 关系数据库和 NoSQL 无模式数据库等数据管理。

          OnceDB 不改变 Redis 的数据存储结构,完全兼容 Redis。 Redis数据库文件可以直接在OnceDB中操作,然后返回Redis使用。

          OnceDB 通过算子自动创建辅助索引:

          = Ordinary field value, no index
          @ Primary key
          ? Grouping index
          * Keyword grouping index, separated by ',' between keywords
          \ Sort index, the score weight of the index is the value of the field
          

          例如,执行以下命令添加用户数据:

          upsert user username @ dota password = 123456 title ? SDEI skills * java,go,c
          > OK
          

          您可以通过运算符从索引中搜索,例如搜索包含 c 关键字的用户数据,并打印用户名和密码字段。

          find user 0 -1 username = * password = * skills * c
          
          find user 0 -1 username = * password = * skills * c
          1) (integer) 1
          2) "user:dota"
          3) "dota"
          4) "123456"
          5) "java,go,c"
          

          阅读全文:OnceDB quick start

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-12-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-26
            • 2012-08-11
            相关资源
            最近更新 更多