command-line

在node.js里,可以自定义命令,借用commander包实现一些小工具。

假设数据库根据用户ID分库,那么如何知道一个userID分布在哪个库呢?

假设书库库根据用户ID分表,那么如何知道一个userID分布在哪个表呢?

我们可以用commander包来实现一个命令行工具,只需要输入用户ID就可以获取用户的分库分表信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
'use strict'

const program = require('commander')

program
.version('0.0.1')
.option('-u, --user <user>', '用户ID', String)
.parse(process.argv);

let user = program.user
if (!user) console.log('请输入用户ID')

let tableIndex = parseInt(user.slice(6, 8), 16) % 128

let server = parseInt(user.slice(-3), 16) % 28 + 1

let goldServer = parseInt(user.slice(-3), 16) % 16 + 1

console.log(`DB: ${server}, index: ${tableIndex}`)
console.log(`goldcoin DB: ${goldServer}`)

process.exit(0)

在上述代码里,我们假设用户根据ID的后3位取16进制,并对28取模,加1后就是用户所在的库名。

然后根据ID的6-8位取16进制,并对128取模,就是用户所在的表名。

这样随机生成的userID会正态分布的落在这28库128表中。

大家根据自己公司的业务修改上述代码的分库分表,并安装在全局目录下,这样就可以在任务地方使用这个工具来查找用户信息了。

如果不知道你的命令有哪些参数,可以-h参数获取对应的信息。

1
2
3
4
5
6
7
8
9
$ node summery/user-db-info.js -h

Usage: user-db-info.js [options]

Options:

-h, --help output usage information
-V, --version output the version number
-u --user <user> 用户ID

我这里没有制成全局命令,大家可以需要自行做。