摘要:原文地址近期在項目中使用到了相比較為齊全的工具這個非關系型數據庫客戶端只能通過與服務器端進行交互于是有了為這個數據編寫個簡便的客戶端工具的想法。如果用戶沒有傳入對應的參數則使用默認的參數進行綁定。
原文地址:
http://52sox.com/use-python-write-a-memcached-cli/
近期在項目中使用到了Memcached,相比redis較為齊全的工具,這個非關系型數據庫客戶端只能通過telnet與服務器端進行交互,于是有了為這個數據編寫1個簡便的客戶端工具的想法。
如果你使用過redis提供的redis-cli,你會發(fā)現這個工具是多么的方便,比如某個命令你忘記了其使用的方式,你可以通過如下的方式來查看:
127.0.0.1:6379> help get GET key summary: Get the value of a key since: 1.0.0 group: string目標
于是,打算參考redis-cli編寫1個Memcached的CLI,在這個版本中,我們要實現:
輸入正確命令和參數后立即返回對應的結果
1個提示幫助命令的功能
實現思路為了實現這個命令行版本,我們需要考慮以下幾個方面:
支持修改連接服務器的監(jiān)聽地址和端口
對傳入的參數進行解析并調用對應的方法
調用對應命令并傳入參數后,如果參數不對能給出錯誤的提示
支持幫助選項
對于第1個問題,我們可以通過參數的方式來解決。如果用戶沒有傳入對應的參數,則使用默認的參數進行綁定。關于從命令行中解析參數的方式,Python提供了幾種方式,這里我選用的是argparse模塊來操作。
而對應后面3個問題,我們可以借助標準庫中的cmd模塊來實現。
在Python的Memcached的客戶端實現中,有python-memcached、pymemcache以及pylibmc等多種第3方庫,這里我采用的是pymemcache來說明我們這個命令行的實現,主要原因在于它是純python實現中最快和異常處理比較好的1個庫。
實現下面,我們正式開始實現這個命令行。由于我們一般不會直接實例化Cmd類。我們先定義1個MemcachedCLI類,這個類繼承自cmd模塊中的Cmd類。接著,我們會實例化1個Memcached類的實例。
from pymemcache.client.base import Client from cmd import Cmd class MemcachedCLI(Cmd): def __init__(self, host, port): self.client = Client((host, port))
之后,我們需要對用戶輸入的內容進行解析并調用其對應的方法。這方面,cmd模塊已經幫助處理這方面的內容了,我們只需要在該類中實現1個do_*的方法,當我們在命令中輸入的1個對應的命令時,比如hello,其將調用1個do_hello的方法。
我們知道,在Memcached中有多個命令,如果我們對這些命令1個個的實現,不是1件容易的事情。比如,在memcached中有1個get方法用于獲取指定鍵名的數值,而在pymemcache的實現中,Client實例有1個get方法對應上述的這個指令。
因此,在這里,我們采用動態(tài)獲取屬性的方式來簡化的工作量,即通過如下的方式來調用對應的get方法:
getattr(self.client,"get")
我們將這個屬性的處理過程封裝在1個get_action的方法中:
def get_action(self, client): for name in dir(client): if not name.startswith("_"): attr = getattr(client, name) if callback(attr): setattr(self.__class__, "do_" + name, self._make_cmd(name))
在這里,我們遍歷Client類實例的每個屬性,如果對應的屬性不以_字符開頭,我們則獲取該屬性,如果該屬性可以調用,我們再進行屬性的設置,將其設置為該類的do_*屬性,通過該類_make_cmd方法返回對應的數值。
在這里,我們將生成的cmd命令封裝在_make_cmd中,在這里我們將通過name屬性獲取到用戶在命令行中輸入的第1個參數:
def _make_cmd(self, name): def handler(self, line): parts = line.split() try: print(getattr(self.client, name)( *parts)) except Exception as e: print("Error:{0}".format(e)) return handler
在這里我們需要對傳入的字符串進行切分。比如,用戶輸入了set name 20,那么后面2個參數將以字符串name 20的形式傳入。之后,我們嘗試獲取Client類的該屬性,并傳入解包后的參數進行調用。如果傳入的參數不正確,將觸發(fā)1個異常而被捕獲,并直接輸出。最后,我們返回1個handler函數。
這樣,當我們輸入如下的命令時:
set name 20
這將調用Client實例的set方法,并將name和20以參數的形式傳入,從而實現設置對應鍵名及其鍵值。
這樣,我們就完成了我們前3個思路的工作。關于命令幫助的問題,在Python中存在1個docstring的東西,我們可以直接使用該類每個方法的__doc__屬性來實現對其文檔的獲取。而在cmd中提供了help_*的方法來實現對某個命令幫助文檔的調用。
而在pymemcache庫中這方面已經幫助我們做好了,因此我們可以直接使用,我們只需要在之前的get_action方法中添加這么幾行代碼:
doc = (getattr(attr, "__doc__", "") or "").strip() if doc: setattr(self.__class__, "help_" + name, self._make_help(doc))
我們將其進行判斷得到的對應文檔是否為空字符串,如果不是才設置其對應的方法。我將幫助文檔的內容封裝在了1個_make_help的方法中:
def _make_help(self, doc): def help(self): print(doc) return help
在這里,我們直接輸出文檔的內容即可。
總結最后,我們來看實際的效果,首先是help列出所有可用的命令:
127.0.0.1:11211>help Documented commands (type help): ======================================== EOF check_key delete_many get gets_many quit set_multi add close delete_multi get_many help replace stats append decr exit get_multi incr set touch cas delete flush_all gets prepend set_many version
然后是獲取某個指令的說明:
127.0.0.1:11211>help get The memcached "get" command, but only for one key, as a convenience. Args: key: str, see class docs for details. Returns: The value for the key, or None if the key wasn"t found.
最后是獲取和設置對應的鍵值:
127.0.0.1:11211>get name None 127.0.0.1:11211>set name zhangsan True 127.0.0.1:11211>get name zhangsan
由于時間的限制,有一些細節(jié)的功能就不一一實現了。最后,可以通過如下的方式安裝使用:
pip install memcached-cli
參考文章:
https://pymemcache.readthedocs.io/en/latest/apidoc/modules.html
https://tghw.com/blog/cheeky-python-a-redis-cli
https://docs.python.org/2/library/cmd.html#module-cmd
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/38043.html
摘要:原文地址近期在項目中使用到了相比較為齊全的工具這個非關系型數據庫客戶端只能通過與服務器端進行交互于是有了為這個數據編寫個簡便的客戶端工具的想法。如果用戶沒有傳入對應的參數則使用默認的參數進行綁定。 原文地址: http://52sox.com/use-python-write-a-memcached-cli/ 近期在項目中使用到了Memcached,相比redis較為齊全的工具,這個非...
前言 在若干次前的一場面試,面試官看我做過python爬蟲/后端 的工作,順帶問了我些后端相關的問題:你覺得什么是后端? 送命題。當時腦瓦特了,答曰:邏輯處理和數據增刪改查。。。 showImg(https://user-gold-cdn.xitu.io/2019/4/24/16a4ed4fc8c18078); 當場被懟得體無完膚,羞愧難當。事后再反思這問題,結合資料總結了一下。發(fā)現自己學過的Re...
摘要:安裝前準備修改默認主機名稱安裝依賴庫刪除系統(tǒng)默認數據庫配置文件查詢刪除確認卸載系統(tǒng)自帶查詢刪除安裝數據庫下載安裝包解壓創(chuàng)建數據庫安裝目錄,數據存放目錄, 安裝前準備 修改默認主機名稱 [root@iZuf60c5bxd15kr9gycvv6Z ~]# hostnamectl set-hostname centos [root@iZuf60c5bxd15kr9gycvv6Z ~]# re...
閱讀 2817·2021-11-24 09:39
閱讀 3387·2021-11-19 09:40
閱讀 2257·2021-11-17 09:33
閱讀 3749·2021-10-08 10:04
閱讀 3037·2021-09-26 09:55
閱讀 1663·2021-09-22 15:26
閱讀 927·2021-09-10 10:51
閱讀 3124·2019-08-30 15:44