像SQL一样设计Redis数据库表?

像SQL一样设计Redis数据库表?,sql,redis,nosql,Sql,Redis,Nosql,假设我的数据库表结构如下 id name college address 1 xxx nnn xn 2 yyy nnm yn 3 zzz nnz zn 如果我想根据sql中的名称获取学生详细信息,如下所示 从学生中选择*,其中姓名='xxx' 因此,如何在redis数据库中实现它,与其他NoSQL数据存储一样,基于您将要做的事情,有不同的要求 Redis有几种数据结构,根据您的需要,它们可能会很有用。例如,如果您希望从学生中选择一个名为“xxx”的se

假设我的数据库表结构如下

id name college address
1  xxx   nnn     xn
2  yyy   nnm     yn
3  zzz   nnz     zn
如果我想根据sql中的名称获取学生详细信息,如下所示 从学生中选择*,其中姓名='xxx'
因此,如何在redis数据库中实现它,与其他NoSQL数据存储一样,基于您将要做的事情,有不同的要求

Redis有几种数据结构,根据您的需要,它们可能会很有用。例如,如果您希望从学生中选择一个名为“xxx”的
select*,
,您可以使用Redis
散列

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"
但是,如果您还有其他查询,比如您想做同样的事情,但选择on
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"
对于这样的数据结构,如果您想找到所有关于上大学的姓名的信息,您首先要选择
集合
,然后根据
集合
中返回的姓名选择每个
散列


您的需求通常会驱动您使用的设计和结构。

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

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

RedisV4提供对模块的支持,我刚刚编写了一个小模块,将SQLite嵌入redis本身

有了这个模块,您实际上可以在redis Instance中使用一个功能齐全的SQL数据库。

您可以尝试使用这个框架。searchbox通过其Criteria api提供了查询redis数据的简单方法。

仅凭6条原则(我收集的),一个有SQL头脑的人很容易适应redis方法。简而言之,它们是:

  • 最重要的是,不要害怕生成大量的键值对。因此,请随意将表的每一行存储在不同的键中
  • 使用Redis的哈希映射数据类型
  • 使用分隔符(例如“:”)从表的主键值中提取表单键名
  • 将剩余字段存储为散列
  • 当您想要查询单行时,直接形成键并检索其结果
  • 当您想要查询一个范围时,请对您的键使用野生字符“*”

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

    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
    

    阅读更多信息:

    希望不要太晚,因为原来的问题长达六年。您可以尝试我的dbx插件: 它支持简单的SQL来维护REDIS中的哈希。大概是这样的:

    127.0.0.1:6379>dbx.select name,tel from phonebook,其中性别='F'按年龄顺序描述
    
    或者从壳牌公司打来的电话

    $redis cli“dbx.select name,tel from phonebook,其中性别='F'按年龄顺序描述”
    

    希望这对我有所帮助。

    在X学院,我会如何找到所有名字为Y或描述包括Z的学生?我宁愿写
    hmset学生:xxx id 1学院nnn地址xn
    ,然后写
    hgetall学生:xxx
    。否?@Supersharp,如果您改为使用
    college:nnn
    ,而不是像我的例子那样使用
    college.nnn
    ,那么这听起来确实是个好主意。名称空间是一件好事。我可以证实RediSql确实非常强大!这里还有另一个RediSql:它非常强大,直接在Redis中支持SQL,而且速度非常快,可用于复制!RediSQL的主要目标是支持该公司:
    find user 0 -1 username = * password = * skills * c
    1) (integer) 1
    2) "user:dota"
    3) "dota"
    4) "123456"
    5) "java,go,c"