网易首页 > 网易号 > 正文 申请入驻

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

0
分享至

新智元报道

编辑:时光

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

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

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

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

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

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

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

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

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

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

mult age 10 380

memcached入门

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

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

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

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

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

curl -O https://memcached.org/files/memcached-1.4.15.tar.gz tar zxvf memcached-1.4.15.tar.gz cd memcached-1.4.15 ./configure make

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

./memcached

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

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

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

玩转memcached

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

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

例如,在telnet会话中输入:

set fullname 0 3600 10 John Smith

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

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

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

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

STORED

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

get fullname

memcached将返回:

VALUE fullname 0 10 John Smith END

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

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

append fullname 0 3600 6 -Jones STORED get fullname VALUE fullname 0 16 John Smith-Jones END

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

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

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

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

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

set age 0 3600 2 37 STORED incr age 1

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

38

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

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

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

get age VALUE age 0 2 38 END

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

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

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

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

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

incr age 10 48 decr age 10 38 incr age -1 CLIENT_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/

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
33岁刘翔再刷屏!肌肉炸裂,还撩走性感女私教!这样的人生我服了....

33岁刘翔再刷屏!肌肉炸裂,还撩走性感女私教!这样的人生我服了....

健身S叔
2024-05-04 14:37:27
“毁容超模”罕见带18岁儿子亮相,是开云总裁的娃,或会成继承者

“毁容超模”罕见带18岁儿子亮相,是开云总裁的娃,或会成继承者

译言
2024-10-22 12:33:50
工作单位的瓜真的好炸裂!看完网友分享,小脑都萎缩了

工作单位的瓜真的好炸裂!看完网友分享,小脑都萎缩了

热闹的河马
2024-07-19 13:16:31
曾经最美SUV“被抛弃”,20万实力仅售6万多,媲美比亚迪,却无人识货

曾经最美SUV“被抛弃”,20万实力仅售6万多,媲美比亚迪,却无人识货

隔壁说车老王
2024-10-23 15:28:35
老婆半夜去接男闺蜜,让老公下车淋雨走回家,次日到家妻子愣住了

老婆半夜去接男闺蜜,让老公下车淋雨走回家,次日到家妻子愣住了

凯裕说故事
2024-10-18 17:07:11
这样发工资你连人都招不到,招来的也是水货,还想干劲十足?

这样发工资你连人都招不到,招来的也是水货,还想干劲十足?

人情皆文史
2024-09-21 00:12:44
西方梦碎!乌军溃败,成为事实!

西方梦碎!乌军溃败,成为事实!

陆弃
2024-10-17 08:54:04
机场安全员提醒:这三样东西可以带上飞机,好多人不懂偷偷扔掉了

机场安全员提醒:这三样东西可以带上飞机,好多人不懂偷偷扔掉了

小啾咪侃侃史
2024-10-23 03:25:02
男子在河南嵩山坠下150米悬崖去世 救援队:曾失联2天,系退休教授

男子在河南嵩山坠下150米悬崖去世 救援队:曾失联2天,系退休教授

封面新闻
2024-10-23 14:23:05
乌克兰笑惨了,朝鲜援兵出现逃兵

乌克兰笑惨了,朝鲜援兵出现逃兵

叒女紫121
2024-10-22 15:43:59
这下实锤了!潘展乐不但“乐”不起来了,现在“哭”都来不及了!

这下实锤了!潘展乐不但“乐”不起来了,现在“哭”都来不及了!

笑熬浆糊111
2024-10-22 00:05:14
杨子黄圣依炒作翻车!节目外有说有笑,投诉婚变话题称关系融洽

杨子黄圣依炒作翻车!节目外有说有笑,投诉婚变话题称关系融洽

花花lo先森
2024-10-23 14:49:49
真39岁?赛后队友们都已瘫倒在地 C罗的这一幕引发热议

真39岁?赛后队友们都已瘫倒在地 C罗的这一幕引发热议

星耀国际足坛
2024-10-23 12:44:18
台风“潭美”明晚进入南海,我国南部海域大风持续刮6天,江苏上海浙江广东海南岛等地将有大到暴雨

台风“潭美”明晚进入南海,我国南部海域大风持续刮6天,江苏上海浙江广东海南岛等地将有大到暴雨

鲁中晨报
2024-10-23 21:53:29
伊朗最大内奸曝光?现任总统或面临15年监禁

伊朗最大内奸曝光?现任总统或面临15年监禁

头条爆料007
2024-10-22 12:54:46
谈判结束后,中方说法变了,冯德莱恩对华索赔,不给就发起制裁

谈判结束后,中方说法变了,冯德莱恩对华索赔,不给就发起制裁

阿离家居
2024-10-23 15:04:01
天津多家肯德基门店被立案调查

天津多家肯德基门店被立案调查

财联社
2024-10-22 11:32:10
刀郎为云朵发声,给了她最后的体面和尊严,保留了两人的师徒情分

刀郎为云朵发声,给了她最后的体面和尊严,保留了两人的师徒情分

娱乐的小灶
2024-10-19 14:38:52
烧伤妈妈绝望放弃治疗!家属称不要再捐款,回家的原因令人泪崩!

烧伤妈妈绝望放弃治疗!家属称不要再捐款,回家的原因令人泪崩!

小虎新车推荐员
2024-10-23 12:42:12
张斌:我们需要更大力度的降息

张斌:我们需要更大力度的降息

界面新闻
2024-10-23 09:12:08
2024-10-24 02:00:49
新智元
新智元
AI产业主平台领航智能+时代
11664文章数 65629关注度
往期回顾 全部

科技要闻

累计订单超8万、小鹏MONA深陷“交付门”

头条要闻

青岛一混凝土车与多车相撞 肇事司机已被控制

头条要闻

青岛一混凝土车与多车相撞 肇事司机已被控制

体育要闻

唐斯,兰德尔,双输的开局?

娱乐要闻

热巴生子风波愈演愈烈!网友扒出变化图

财经要闻

水晶剑价格倒挂 剑南春炮轰电商平台

汽车要闻

有趣带感/接棒GT精神 探店比亚迪海豹 06GT

态度原创

手机
教育
时尚
艺术
军事航空

手机要闻

真我GT7 Pro全球首发Eco²苍穹屏:非偏振自然光护眼技术

教育要闻

据说,鼓楼孩子人手PET优秀?

董洁说穿卫衣,放松穿才时髦

艺术要闻

故宫珍藏的墨迹《十七帖》,比拓本更精良,这才是地道的魏晋写法

军事要闻

以总理私宅遭袭受损照片公开:玻璃窗被打碎

无障碍浏览 进入关怀版