欢迎参与 8 月 1 日中午 11 点的线上分享,了解 GreptimeDB 联合处理指标和日志的最新方案! 👉🏻 点击加入

Skip to content
On this page
技术
2023-4-6

时序数据库能做什么|用 GreptimeDB 进行程序员键盘行为分析,最高频按键竟然是它

在过去的两周,GreptimeDB 依旧非常活跃,在带来新功能的同时,也和社区的贡献者们一起推动 GreptimeDB 成为一个更好的产品,再次感谢大家!

前一段时间 GreptimeDB 发布了 v0.1 的版本,虽然还很早期,但已经是一个比较可靠并且可以在实际场景中应用的数据库了。

是的,你已经是一个成熟的数据库,可以去做一些有意义的事情了。

我们都知道,时序数据主要在物联网以及监控领域产生,而且数据量通常很大且非常高频。

那么我一个普通程序员,每天就是坐在工位上敲键盘,哪里能接触到能产生高频海量数据的场景呢?

哎,等一下,敲键盘好像就是在产生时序数据,我也有点好奇每天到底会按多少次按键,以及哪些按键使用的频率更高一些。经常有梗图说程序员每天主要都在用 ctrl+Cctrl+V ,那程序员们到底每天会用多少次复制粘贴呢?

现在,有了 v0.1 版本的数据库,我们只需要写一个脚本,再配合使用 GreptimeDB 统计一下也许就能获得答案。

下载连接 数据库⏬

首先是在本地安装 GreptimeDB,我们最近刚刚上线了下载页,你可以在官网下载编译好的二进制版本,然后使用 greptime standalone start 启动一个单机版,不出意外的话,你应该可以看到:

(图 1:单机版)
(图 1:单机版)

我们使用 4000 端口的 HTTP 接口对数据库进行请求,只要发送 SQL 语句即可,具体语法参见:https://docs.greptime.com/user-guide/supported-protocols/http-api

编写脚本 记录信息⌨️

比如我们在命令行中输入 curl http://localhost:4000/v1/sql -d "sql=CREATE TABLE keymaster(key STRING, ts TIMESTAMP TIME INDEX) " 就可以创建一个新的表,用于记录按键信息。

接下来就是如何记录按键的信息,这里就用我比较熟悉的 Node.js 来解决了。

javascript
const axios = require('axios')
const qs = require('qs')
const { GlobalKeyboardListener } = require('node-global-key-listener')
const v = new GlobalKeyboardListener()
//Log every key that's pressed.
v.addListener(function (e, down) {
  if (e.state === 'DOWN') {
    let metaKey = Object.entries(down)
      .filter(([key, value]) => value === true && key.length > 1 && !/LOCK/.test(key))
      .map(([key, value]) => key)

    if (e.name.length === 1) metaKey.push(e.name)
    metaKey = metaKey.join('+')
    saveKeypressEvent(metaKey)
    console.log(${metaKey})
  }
})

const saveKeypressEvent = async (metaKey) => {
  try {
    const response = await axios.post(
      'http://127.0.0.1:4000/v1/sql?db=public',
      qs.stringify({
        sql: INSERT INTO keymaster(key, ts) VALUES('${metaKey}', ${new Date().valueOf()}),
      })
    )
  } catch (error) {
    console.log(error)
  }
}

这里我把多键的情况提取了出来,用来统计所有组合键的频率。

🔍查询 分析

接下来我用了 xbar 运行了一个定时脚本输出查询结果,当然,你们用其他的任何方式运行查询语句都可以。比如 SELECT key , COUNT(*) as times FROM keymaster WHERE LENGTH(key) < 2 GROUP BY key ORDER BY times DESC limit 10 可以查询点击最多的10个单字母按键;

SELECT key , COUNT(*) as times FROM keymaster WHERE key like '%+%' GROUP BY key ORDER BY times DESC limit 10 查询使用最多的10个组合键。

数据结果🤩

这个是在记录了一个多礼拜以后的累积数据,从这个结果可以获得很多有趣的结论:

(图 2:数据结果)
(图 2:数据结果)
  • ⌨️ 每天平均按键 10000 次左右

  • 🔙 有超过十分之一的按键是退格

  • 📝 使用最多的字母是 i ,比第二名 e 多出近 20%,应该是因为我日常使用 vim

  • 🪟 大量使用 cmd+w 关闭窗口,因为我是一个没有囤积标签页习惯的人

  • 💪 虽然开启了 auto save ,但是 cmd+s 好像已经形成了肌肉记忆

  • 🆒 cmd+Vcmd+C 多出近 20%,因为复制后至少有一次粘贴。

  • 🔛 复制粘贴果然是程序员高频使用的组合键

你们可能发现前面的截图还有一个 APM (Actions Per Minute),这是我用输入时间实时计算后存入另一张表的数据。

📈结果可视化

你可以在浏览器输入:http://localhost:4000/dashboard

打开控制台,输入 SELECT * FROM apm ORDER BY ts DESC LIMIT 1800 就可以查看可视化的数据图表。

Dashboard 是 Greptime 团队开源的另一个项目,用于帮助用户更方便地使用 GreptimeDB。Dashboard 已经被集成到 GreptimeDB 的发行版中,运行数据库后即可以在本地启动使用。

(图 3:Dashboard)
(图 3:Dashboard)

这是最近 30 分钟的每分钟平均输入数(APM,Actions Per Minute),我这个手速还可以吧😎。

哦,你在本地是看不到的这个数据,因为你还没有建立 APM 表,至于如何操作,相信看完前文以后,写一段统计脚本对于你来说应该很简单了吧。

如果在使用 GreptimeDB 以及 Dashboard 的过程中遇到任何问题,或者有建议欢迎为我们的项目提 issue 或者 pr。

这是一个非常简单的例子,也只用到了 GreptimeDB 诸多能力的一小部分,而且这个数据量也太小了,别说是一个人输入,就算是十个人一起用脸滚键盘,GreptimeDB 可以轻松接住。

所以如果大家有更大更多数据的场景,一定要试用一下我司的 GreptimeDB。

关于 Greptime

Greptime 格睿科技专注于为可观测、物联网及车联网等领域提供实时、高效的数据存储和分析服务,帮助客户挖掘数据的深层价值。目前基于云原生的时序数据库 GreptimeDB 已经衍生出多款适合不同用户的解决方案,更多信息或 demo 展示请联系下方小助手(微信号:greptime)。

欢迎对开源感兴趣的朋友们参与贡献和讨论,从带有 good first issue 标签的 issue 开始你的开源之旅吧~期待在开源社群里遇见你!添加小助手微信即可加入“技术交流群”与志同道合的朋友们面对面交流哦~

Star us on GitHub Now: https://github.com/GreptimeTeam/greptimedb

官网:https://greptime.cn/

文档:https://docs.greptime.cn/

Twitter: https://twitter.com/Greptime

Slack: https://greptime.com/slack

LinkedIn: https://www.linkedin.com/company/greptime/

加入我们的社区

获取 Greptime 最新更新,并与其他用户讨论。