Github开发大神教你玩转数据库编程

简介: Github开发大神教你玩转数据库编程

【新智元导读】每个人的心目中都有自己最喜欢的编程问题。这次,我们先跟着这位大佬去数据库的世界里溜一圈看看。


在Github上,一位名叫Arthur O’Dwyer的用户,经常发表关于C++编程语言方面的东西。

 

最近,他分享了一次发生在2013年的软件工程面试经历。


如今,9年时间已过,他却对此记忆犹新。


Dwyer表示,这道题可以说是大多数真实世界编程的一个缩影。

 

就比如说,当你维护一个庞大的代码库时,总会有一些你不完全理解的代码路径,一些感觉没有必要的风格,以及大量难以立足的代码。

 

给你3个小时,能够做出来吗?


首先我们来看看这个「编程挑战」长什么样。


通过incr和decr命令,memcached可以把k加到某一个数字上。然而,memcached不提供其它算术运算,尤其是没有乘以k这个操作。


现在,你要向memcached添加一个mult命令。在完成之后,能利用telnet到memcached的客户端运行如下命令:

 



mult age 10380


memcached入门


在这个题目中,面试者要求使用memcached数据库进行编程。

 

memcached是高性能的分布式缓存服务器,用来集中缓存数据库查询结果,减少数据库访问次数,以提高动态web应用的响应速度。

 

为了成功构建memcached,可能需要brew install libevent和其它一些东西。

 

你可以假设,所有参加面试者都已获得Linux设备的访问权限,它具有所有正确的依赖项。

 

让我们绕过GitHub Repo,解压一个当代的源代码发行版:

 






curl -O https://memcached.org/files/memcached-1.4.15.tar.gztar zxvf memcached-1.4.15.tar.gzcd memcached-1.4.15./configuremake

 

现在,就已经构建了memcached可执行文件,可以开始运行:

 


./memcached

 

通过默认的memcached端口11211与服务器通信,这可以使用普通的telnet来对话:

 





$ telnet 127.0.0.1 11211Trying 127.0.0.1...Connected to localhost.Escape character is '^]'.


如果没有telnet,也可以用nc-c代替。

 

玩转memcached


memcached是一个键值存储,这意味着可以告诉它记住一些东西,如键和值之间的关联。

 

在memcached中,键是指ASCII字符串,值是指任意字节流。

 

例如,在telnet会话中输入:

 



set fullname 0 3600 10John Smith


这等于告诉memcached记住:字符串键fullname和10字节值John Smith之间的关联。

 

这一行代码上的其它数字是一个「flags」值0,要与字节流值一起记住,到期超时3600秒。

 

之后,memcached将会忘记这个关联。

 

无论如何,在你输入这两行之后,memcached将会响应:

 


STORED

 

现在,你可以检索fullname值,在同一个telnet会话中输入:

 


get fullname


memcached将返回:

 




VALUE fullname 0 10John SmithEND

 

memcached可以覆盖fullname关联的值,通过发出另一个set fullname命令,可以要求memcached以特定的方式修改值。

 

例如,有专门的命令用于append和prepend。

 








append fullname 0 3600 6-JonesSTOREDget fullnameVALUE fullname 0 16John Smith-JonesEND


如果你想在客户端程序中附加-Jones到fullname,可以这样做:

 







# pip install python-memcachedimport memcachemc = memcache.Client(['127.0.0.1:11211'])v = mc.get('fullname')    # get the old value from memcachedv += '-Jones'             # append -Jonesmc.set('fullname', v)     # set the new value into memcached


如果你有多个客户端连接到相同的memcached服务器,他们都会同时添加到相同的键。


这个get/set版本可能会导致一些更新后的信息丢失,而append则保证会找到它们。

 

另一个执行的专用命令是incr:

 





set age 0 3600 237STOREDincr age 1


memcached会使用自增后的值进行响应:

 


38


这个响应很有用,因为有很多个客户端。如果你发出一个单独的get age命令,你只有在其它几个客户端完成各自更新后,才可能看到新的值。

 

假如,你打算将该值用作序列号、SQL主键或类似的东西,那么,有一种方法可以查看增加的值,这是非常好的。

 

当然,memcached也会记住增加的值:

 





get ageVALUE age 0 238END


注意37和38仍然以字节串的形式存储和返回。

 

它们被ASCII解码为整数,然后作为原子化操作的一部分返回。

 

如果你试着incr一个非整数值,你会得到一个错误:

 



incr fullname 1CLIENT_ERROR cannot increment or decrement non-numeric value

 

最后,记得incr或decr任何正值,而不仅仅是1。

 







incr age 1048decr age 1038incr age -1CLIENT_ERROR invalid numeric delta argument


顺便说一下,当你完成与memcached的通信并希望终止连接时,可以键入memcached命令quit,或者,你可以使用nc-c、Ctrl+D同样起作用。

 

最好的面试问题


「这是我在工程面试中遇到的最好问题!」9年后,Dwyer依然这么认为。

 

因为,它非常清晰地将候选人划分为三种:

 

第一种类型是看完题就直接懵了的人。不过他们可能没有多少能够在面试过程中走到这一步。


第二种类型可能会想:「我知道怎么做,乘法就是加法的重复,我们已经有了一个现成的加法子程序,即incr的形式。所以我只需要在这个基础上,嗯,把x的值加到它自己的身上……哦对了,整个过程还需要是的,然后再让我们来看看这个锁该怎么用……」

 

结果,他们在各种坑里越陷越深。最后,3个小时过去了,一点有用的东西都没有写出来。显然,这种类型的候选人也不会被录用。

 

第三种类型说:「我知道怎么做,乘法和加法一样,除了加法做+,乘法我应该做*。」

 

于是,他们复制粘贴把所有的「+s」改成「*s」,并在规定的时间内完成了。

 

这种类型的人就很可能被录用。

 

当然了,更加优秀的候选者会注意到,需要一些时间来润色他们的代码,才能正式提交。

 

Dwyer表示,这个挑战特别适合用在面试中,因为只有一个正确的答案,也就是将「bool incr」改为「int opcode」(或任何与之同构的答案)。与此同时,问题提供的代码和陈述和在一起提供了非常明确的暗示,目前有两个算术运算指令,而你的工作是将其扩展到三个算术运算指令。


顺便说一句,memcached数据库挑战需要熟练掌握C++语言,如果你的代码库都是Python和Go,你可能不会使用memcached。



有趣的是,出这道题的作者也看到了这个帖子并且回复称,自己是在工作了几个月之后想出来的。作者表示,数据库的代码非常庞大而且复杂,对于最开始的那一年,几乎每次维护都像是在做题。显然,「快速弄清楚一段不熟悉的代码块」这个技能,可以说是相当的重要了


参考资料:

https://quuxplusone.github.io/blog/2022/01/06/memcached-interview/

相关文章
|
5月前
|
存储 关系型数据库 数据库
附部署代码|云数据库RDS 全托管 Supabase服务:小白轻松搞定开发AI应用
本文通过一个 Agentic RAG 应用的完整构建流程,展示了如何借助 RDS Supabase 快速搭建具备知识处理与智能决策能力的 AI 应用,展示从数据准备到应用部署的全流程,相较于传统开发模式效率大幅提升。
附部署代码|云数据库RDS 全托管 Supabase服务:小白轻松搞定开发AI应用
|
3月前
|
存储 JSON 数据建模
鸿蒙 HarmonyOS NEXT端云一体化开发-云数据库篇
云数据库采用存储区、对象类型、对象三级结构,支持灵活的数据建模与权限管理,可通过AGC平台或本地项目初始化,实现数据的增删改查及端侧高效调用。
204 1
|
5月前
|
存储 SQL 前端开发
跟老卫学HarmonyOS开发:ArkTS关系型数据库开发
本节以“账本”为例,使用关系型数据库接口实现账单的增、删、改、查操作。通过创建ArkTSRdb应用,演示如何操作RdbStore进行数据管理,并结合界面按钮实现交互功能。
255 0
跟老卫学HarmonyOS开发:ArkTS关系型数据库开发
|
7月前
|
存储 缓存 自然语言处理
评论功能开发全解析:从数据库设计到多语言实现-优雅草卓伊凡
评论功能开发全解析:从数据库设计到多语言实现-优雅草卓伊凡
215 8
评论功能开发全解析:从数据库设计到多语言实现-优雅草卓伊凡
|
8月前
|
人工智能 IDE 搜索推荐
惊!GitHub Copilot或将颠覆传统编程,程序员即将失业?
GitHub Copilot引爆编程界!这个AI编程神器将彻底改变你的编程生涯!
428 22
惊!GitHub Copilot或将颠覆传统编程,程序员即将失业?
|
6月前
|
SQL 人工智能 关系型数据库
GitHub 热门!MindsDB 破解 AI + 数据库瓶颈,究竟有什么惊艳亮点?只需 SQL 即可实现智能预测
MindsDB 是一款将 AI 能力直接注入数据库的开源工具,支持 MySQL、PostgreSQL 等多种数据库连接,通过 SQL 即可完成模型训练与预测。它提供 AutoML 引擎、LLM 集成、联邦查询等功能,简化 MLOps 流程,实现数据到智能的无缝衔接。项目在 GitHub 上已获 32.4k 星,社区活跃,适用于客户流失预警、推荐系统、情感分析等场景。开发者无需深入模型细节,即可快速构建智能解决方案。项目地址:https://github.com/mindsdb/mindsdb。
1083 0
|
9月前
|
SQL 数据库连接 Linux
数据库编程:在PHP环境下使用SQL Server的方法。
看看你吧,就像一个调皮的小丑鱼在一片广阔的数据库海洋中游弋,一路上吞下大小数据如同海中的珍珠。不管有多少难关,只要记住这个流程,剩下的就只是探索未知的乐趣,沉浸在这个充满挑战的数据库海洋中。
242 16
|
8月前
|
SQL 调度 数据库
开发YashanDB数据库?用 DBeaver for YashanDB 更顺手
数据库开发复杂易错,尤其在企业级场景中。为提升效率,YashanDB 团队基于 DBeaver 开源工具打造专属解决方案——DBeaver for YashanDB。它支持多类型数据库对象管理(表、视图、函数等),适配 YashanDB 特有表结构(HEAP、LSC),提供智能补全、语法高亮、SQL 调试等功能,让开发更高效流畅。推荐用于数据库应用开发团队、高频调试用户及中大型企业统一工具栈场景。
|
8月前
|
SQL 数据可视化 IDE
开发数据库不想写命令?YashanDB Developer Center 帮你轻松搞定
YashanDB Developer Center(YDC)是一款可视化的数据库开发工具,专为提升数据库开发效率而设计。它通过图形化对象管理让数据库对象清晰可见,提供智能SQL编辑器支持语法高亮与自动补全,实现PL调试的图形化操作,帮助快速定位问题。此外,操作记录可追溯,多端灵活部署,适配多种场景。无论是中大型企业研发团队,还是不熟悉命令行的业务开发者,YDC都能显著优化开发体验,堪称YashanDB的“可视化IDE”。

热门文章

最新文章