redis mysql联合查询_OnceDB 更新:在 Redis 中实现 SQL 数据库的多条件关联查询,内、外连接合并索引搜索使用教程...

OnceDB 是基于 Redis 二次开发的全文搜索内存数据库,支持像 SQL 关系数据库和 NoSQL 无模式数据库那样管理数据,目前还在不断更新完善中。

条件查询

在 OnceDB 的 node.js 驱动中,可直接使用类似 mongodb 的查询语法,来查询 redis 数据库:

oncedb.select(schemaName, query, options, callback)

示例,准备测试数据:

(async() => {

const util = require('util')

const oncedb = require('oncedb')()

// priomise 化接口,使用顺序语法执行异步函数

const upsert = util.promisify(oncedb.upsert).bind(oncedb)

const select = util.promisify(oncedb.select).bind(oncedb)

const zrange = util.promisify(oncedb.client.zrange).bind(oncedb.client)

// 定义 blog: id 自增 ID, user 分组索引, keys 关键字索引, visit 排序索引

oncedb.schema('blog', { id: 'id;sequence', user: 'group', keys: 'keywords', visit: 'sort' })

// 添加测试数据

await upsert('blog', { user: 'fire', keys: 'c,java,js', visit: 3899 })

await upsert('blog', { user: 'fire', keys: 'go,c,js', visit: 1000 })

await upsert('blog', { user: 'like', keys: 'java,c,node.js', visit: 1200 })

await upsert('blog', { user: 'like', keys: 'node.js,go,c', visit: 3206 })

await upsert('blog', { user: 'mind', keys: 'js,go,c', visit: 2106 })

await upsert('blog', { user: 'fire', keys: 'java,js,go,c', visit: 9999 })

})();

多条件查询, { user: 'fire', keys: 'c' }, 并且 visit 在 1000 和 4000 之间的数据:

var rows = await select('blog', { user: 'fire', keys: 'c' }, { sort: [ 'visit', 1000, 4000 ] })

console.log(rows)

输出结果:

[

{

_key: 'blog:2',

id: '2',

user: 'fire',

keys: [ 'go', 'c', 'js' ],

visit: '1000'

},

{

_key: 'blog:1',

id: '1',

user: 'fire',

keys: [ 'c', 'java', 'js' ],

visit: '3899'

}

]

连接查询

OnceDB 最新版添加了连接查询的功能,可以用数组实现多条件连接查询.

多条件查询的前提是搜索的字段在 schema 中都被定义成了索引,这样在 OnceDB 中可以通过一系列的交集和并集运算来提取数据,语法如下:

oncedb.select ([query1, query2 ...], options, cb)

oncedb.select ([[query1, options1], [query2, options2] ...], options, cb)

比如当两个搜索条件求其合集,并按 visit 排序:

var rows = await select('blog', [

[{ user: 'fire', keys: 'c' }, { sort: [ 'visit', 1000, 4000 ] }]

, [{ user: 'like', keys: 'java' }, { sort: 'visit' }]

])

console.log(rows)

输出结果:

[

{

_key: 'blog:2',

_score: 1000,

id: '2',

user: 'fire',

keys: [ 'go', 'c', 'js' ],

visit: '1000'

},

{

_key: 'blog:3',

_score: 1200,

id: '3',

user: 'like',

keys: [ 'java', 'c', 'node.js' ],

visit: '1200'

},

{

_key: 'blog:1',

_score: 3899,

id: '1',

user: 'fire',

keys: [ 'c', 'java', 'js' ],

visit: '3899'

}

]

保存索引

多条件联连查询是通过索引并集实现的,可通过 index 参数只输出索引,然后通过 OnceDB 的 zrangehmget 指令来提取数据,而不必每次都重新进行计算,这样能提高在海量数量下的性能:

比如,上文的例子通过 { index: 'blog_union' }) 保存在 blog_union 索引中:

var indexName = await select('blog', [

[{ user: 'fire', keys: 'c' }, { sort: [ 'visit', 1000, 4000 ] }]

, [{ user: 'like', keys: 'java' }, { sort: 'visit' }]

], { index: 'blog_union' })

打印索引内容:

var lines = await zrange(indexName, 0, -1)

console.log(lines)

输出:

[ '2', '3', '1' ]

使用 zrangehmget 指令,从索引中输出对应的 hash 数据:

首先 promise 化 zrangehmget 接口:

const zrangehmget = util.promisify(oncedb.client.zrangehmget).bind(oncedb.client)

查询从 1 到 1 的第 2 条数据(从零开始)

var rows = await zrangehmget('blog_union', 1, 1, 'blog: user keys visit')

console.log(rows)

输出结果:

[

{

_key: 'blog:3',

_score: 1200,

user: 'like',

keys: 'java,c,node.js',

visit: '1200'

}

]

参考资料:

zrangehmget 指令使用可参考 搜索、查询、计算、求和指令

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于mysql/redis等6大数据库,在7种java业务的选型与调优可以从以下角度来考虑: 1. 事务型业务:对于需要保证ACID(原子性、一致性、隔离性和持久性)特性的业务,如支付系统或订单系统,适合选择MySQL这类关系型数据库。可以通过使用InnoDB引擎来提供事务支持,并进行合理的索引设计与数据表分区来提高性能。 2. 缓存型业务:对于频繁读取的数据,如热门商品、热门文章等,可以选择使用Redis等内存数据库作为缓存,提高读取速度。可以使用Redis提供的Hash类型或Sorted Set等数据结构来存储和操作数据。 3. 日志型业务:对于需要记录用户操作日志或系统日志的业务,可以选择使用MySQL数据库。可以使用数据库的分区表或者分库分表技术来分散写入压力,使用数据库索引来提高查询效率。 4. 大数据量存储:对于需要处理大量数据的业务,如用户行为数据分析或日志分析等,可以选择使用Hadoop等大数据处理平台,将数据存储在分布式文件系统,如HDFS,再通过Hive或HBase等工具进行查询和分析。 5. 高并发读写:对于需要处理高并发读写请求的业务,如社交网络或在线视频等,可以考虑使用分布式数据库,如TiDB或Cassandra等,以支持水平扩展和负载均衡,提高系统的并发能力。 6. 实时计算:对于需要实时计算的业务,如推荐系统或风控系统,可以选择使用流式处理框架,如Flink或Spark Streaming等,结合类似Kafka等高吞吐量消息队列,对数据进行实时处理和计算。 在选型和调优时,需要根据具体业务需求和系统性能要求来选择合适的数据库,并进行合理的设计和配置。同时,还需要进行性能测试和监控,根据实际情况进行优化,如合理调整数据库参数、优化SQL查询语句、缓存数据等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值