像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"
但是,如果您还有其他查询,比如您想做同样的事情,但选择onwhere 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中对其进行建模。遵循这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"