【发布时间】: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数据库中实现的
【问题讨论】:
假设我的数据库表结构是这样的
id name college address
1 xxx nnn xn
2 yyy nnm yn
3 zzz nnz zn
如果我想像这样根据 sql 中的名称获取学生详细信息 select * from student where name = 'xxx' 那么它是如何在redis数据库中实现的
【问题讨论】:
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。
您的要求通常会推动您使用的设计和结构。
【讨论】:
hmset students:xxx id 1 college nnn address xn,然后写hgetall students:xxx。没有?
college:nnn 而不是college.nnn,就像我的示例一样,这听起来是个好主意。命名空间是个好东西。
只需 6 条原则(我收集了 here),一个有 SQL 头脑的人很容易让自己适应 Redis 方法。简而言之,它们是:
- 最重要的是,不要害怕生成大量的键值对。因此,您可以随意将表格的每一行存储在不同的键中。
- 使用 Redis 的哈希映射数据类型
- 用分隔符(如“:”)从表的主键值中形成键名
- 将剩余字段存储为哈希
- 当你要查询单行时,直接形成键并检索其结果
- 当您要查询范围时,请对您的键使用通配符“*”。
该链接仅提供了一个简单的表格示例以及如何在 Redis 中对其进行建模。遵循这 6 条原则,您可以继续像对待普通桌子一样思考。 (当然没有一些不那么相关的概念,如 CRUD、约束、关系等)
【讨论】:
对于普通的香草 redis,其他答案是完全正确的,但是,昨天(2016 年 12 月 2 日)redis 4-rc1 已发布。
redis v4 提供了对模块的支持,我只是写了一个小模块来将 SQLite 嵌入到 redis 本身中; rediSQL.
使用该模块,您实际上可以在您的 redis 实例中使用功能齐全的 SQL 数据库。
【讨论】:
【讨论】:
希望现在还不算太晚,因为最初的问题已经长达六年了。你可以试试我的 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"
希望对您有所帮助。
【讨论】:
你可以试试searchbox 框架。 searchbox 通过其 Criteria api 提供了查询 redis 数据的简便方法。
【讨论】:
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
【讨论】: