社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Git

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

机器学习研究组订阅 • 3 年前 • 411 次点击  

在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-JonesSTORED


    
get 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/


想要了解更多资讯,请扫描下方二维码,关注机器学习研究会

                                          


转自:新智元

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/133487
 
411 次点击