国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

使用 Python 編寫一個 Memcached 的 CLI

aisuhua / 1285人閱讀

摘要:原文地址近期在項目中使用到了相比較為齊全的工具這個非關系型數據庫客戶端只能通過與服務器端進行交互于是有了為這個數據編寫個簡便的客戶端工具的想法。如果用戶沒有傳入對應的參數則使用默認的參數進行綁定。

原文地址:

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-memcachedpymemcache以及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

相關文章

  • 使用 Python 編寫一個 Memcached CLI

    摘要:原文地址近期在項目中使用到了相比較為齊全的工具這個非關系型數據庫客戶端只能通過與服務器端進行交互于是有了為這個數據編寫個簡便的客戶端工具的想法。如果用戶沒有傳入對應的參數則使用默認的參數進行綁定。 原文地址: http://52sox.com/use-python-write-a-memcached-cli/ 近期在項目中使用到了Memcached,相比redis較為齊全的工具,這個非...

    RdouTyping 評論0 收藏0
  • 「真?全棧之路」Web前端開發(fā)后端指南

    前言 在若干次前的一場面試,面試官看我做過python爬蟲/后端 的工作,順帶問了我些后端相關的問題:你覺得什么是后端? 送命題。當時腦瓦特了,答曰:邏輯處理和數據增刪改查。。。 showImg(https://user-gold-cdn.xitu.io/2019/4/24/16a4ed4fc8c18078); 當場被懟得體無完膚,羞愧難當。事后再反思這問題,結合資料總結了一下。發(fā)現自己學過的Re...

    chuyao 評論0 收藏0
  • 啊里云centos7.6編譯安裝NGINX+PHP7+MariaDB+MEMCACHED

    摘要:安裝前準備修改默認主機名稱安裝依賴庫刪除系統(tǒng)默認數據庫配置文件查詢刪除確認卸載系統(tǒng)自帶查詢刪除安裝數據庫下載安裝包解壓創(chuàng)建數據庫安裝目錄,數據存放目錄, 安裝前準備 修改默認主機名稱 [root@iZuf60c5bxd15kr9gycvv6Z ~]# hostnamectl set-hostname centos [root@iZuf60c5bxd15kr9gycvv6Z ~]# re...

    yuanxin 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<