python之Memcached 安裝及操作

来源:https://www.cnblogs.com/mengqingjian/archive/2018/03/06/8516799.html
-Advertisement-
Play Games

一、Memcached Memcached 是一個高性能的分散式記憶體對象緩存系統,用於動態Web應用以減輕資料庫負載。它通過在記憶體中緩存數據和對象來減少讀取資料庫的次數,從而提高動態、資料庫驅動網站的速度。Memcached基於一個存儲鍵/值對的hashmap。其守護進程(daemon )是用C寫的 ...


一、Memcached

Memcached 是一個高性能的分散式記憶體對象緩存系統,用於動態Web應用以減輕資料庫負載。它通過在記憶體中緩存數據和對象來減少讀取資料庫的次數,從而提高動態、資料庫驅動網站的速度。Memcached基於一個存儲鍵/值對的hashmap。其守護進程(daemon )是用C寫的,但是客戶端可以用任何語言來編寫,並通過memcached協議與守護進程通信。

二、memcached的安裝基本使用

1、memcached安裝:

wget http://memcached.org/latest
tar -zxvf memcached-1.x.x.tar.gz
cd memcached-1.x.x
./configure && make && make test && sudo make install
 
PS:依賴libevent
       yum install libevent-devel
       apt-get install libevent-dev

2、啟動Memcached

memcached -d -m 10    -u root -l 10.211.55.4 -p 12000 -c 256 -P /tmp/memcached.pid
 
參數說明:
    -d 是啟動一個守護進程
    -m 是分配給Memcache使用的記憶體數量,單位是MB
    -u 是運行Memcache的用戶
    -l 是監聽的伺服器IP地址
    -p 是設置Memcache監聽的埠,最好是1024以上的埠
    -c 選項是最大運行的併發連接數,預設是1024,按照你伺服器的負載量來設定
    -P 是設置保存Memcache的pid文件

3、Memcached命令

存儲命令: set/add/replace/append/prepend/cas
獲取命令: get/gets
其他命令: delete/stats..

Python操作Memcached

三、安裝API

1 2 python操作Memcached使用Python-memcached模塊 下載安裝:https://pypi.python.org/pypi/python-memcached

1、第一次操作

1 2 3 4 5 6 import memcache   mc = memcache.Client(['10.211.55.4:12000'], debug=True) mc.set("foo""bar") ret = mc.get('foo') print ret

Ps:debug = True 表示運行出現錯誤時,現實錯誤信息,上線後移除該參數。

2、天生支持集群

python-memcached模塊原生支持集群操作,其原理是在記憶體維護一個主機列表,且集群中主機的權重值和主機在列表中重覆出現的次數成正比

1 2 3 4 5 6 7      主機    權重     1.1.1.1   1     1.1.1.2   2     1.1.1.3   1   那麼在記憶體中主機列表為:     host_list = ["1.1.1.1""1.1.1.2""1.1.1.2""1.1.1.3", ]

如果用戶根據如果要在記憶體中創建一個鍵值對(如:k1 = "v1"),那麼要執行一下步驟:

  • 根據演算法將 k1 轉換成一個數字
  • 將數字和主機列表長度求餘數,得到一個值 N( 0 <= N < 列表長度 )
  • 在主機列表中根據 第2步得到的值為索引獲取主機,例如:host_list[N]
  • 連接 將第3步中獲取的主機,將 k1 = "v1" 放置在該伺服器的記憶體中

代碼實現如下:

1 2 3 mc = memcache.Client([('1.1.1.1:12000'1), ('1.1.1.2:12000'2), ('1.1.1.3:12000'1)], debug=True)   mc.set('k1''v1')

3、add
添加一條鍵值對,如果已經存在的 key,重覆執行add操作異常

1 2 3 4 5 6 7 #!/usr/bin/env python # -*- coding:utf-8 -*- import memcache   mc = memcache.Client(['10.211.55.4:12000'], debug=True) mc.add('k1''v1') # mc.add('k1', 'v2') # 報錯,對已經存在的key重覆添加,失敗!!!

4、replace
replace 修改某個key的值,如果key不存在,則異常

1 2 3 4 5 6 7 #!/usr/bin/env python # -*- coding:utf-8 -*- import memcache   mc = memcache.Client(['10.211.55.4:12000'], debug=True) # 如果memcache中存在kkkk,則替換成功,否則一場 mc.replace('kkkk','999')

5、set 和 set_multi

set            設置一個鍵值對,如果key不存在,則創建,如果key存在,則修改
set_multi   設置多個鍵值對,如果key不存在,則創建,如果key存在,則修改

1 2 3 4 5 6 7 8 9 #!/usr/bin/env python # -*- coding:utf-8 -*- import memcache   mc = memcache.Client(['10.211.55.4:12000'], debug=True)   mc.set('key0''wupeiqi')   mc.set_multi({'key1''val1''key2''val2'})

6、delete 和 delete_multi

delete             在Memcached中刪除指定的一個鍵值對
delete_multi    在Memcached中刪除指定的多個鍵值對

1 2 3 4 5 6 7 8 #!/usr/bin/env python # -*- coding:utf-8 -*- import memcache   mc = memcache.Client(['10.211.55.4:12000'], debug=True)   mc.delete('key0') mc.delete_multi(['key1''key2'])

7、get 和 get_multi

get            獲取一個鍵值對
get_multi   獲取多一個鍵值對

1 2 3 4 5 6 7 8 #!/usr/bin/env python # -*- coding:utf-8 -*- import memcache   mc = memcache.Client(['10.211.55.4:12000'], debug=True)   val = mc.get('key0') item_dict = mc.get_multi(["key1""key2""key3"])

8、append 和 prepend

append    修改指定key的值,在該值 後面 追加內容
prepend   修改指定key的值,在該值 前面 插入內容

1 2 3 4 5 6 7 8 9 10 11 12 #!/usr/bin/env python # -*- coding:utf-8 -*- import memcache   mc = memcache.Client(['10.211.55.4:12000'], debug=True) # k1 = "v1"   mc.append('k1''after') # k1 = "v1after"   mc.prepend('k1''before') # k1 = "beforev1after"

9、decr 和 incr  

incr  自增,將Memcached中的某一個值增加 N ( N預設為1 )
decr 自減,將Memcached中的某一個值減少 N ( N預設為1 )

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #!/usr/bin/env python # -*- coding:utf-8 -*- import memcache   mc = memcache.Client(['10.211.55.4:12000'], debug=True) mc.set('k1''777')   mc.incr('k1') # k1 = 778   mc.incr('k1'10) # k1 = 788   mc.decr('k1') # k1 = 787   mc.decr('k1'10) # k1 = 777

10、gets 和 cas

如商城商品剩餘個數,假設改值保存在memcache中,product_count = 900
A用戶刷新頁面從memcache中讀取到product_count = 900
B用戶刷新頁面從memcache中讀取到product_count = 900

如果A、B用戶均購買商品

A用戶修改商品剩餘個數 product_count=899
B用戶修改商品剩餘個數 product_count=899

如此一來緩存內的數據便不在正確,兩個用戶購買商品後,商品剩餘還是 899
如果使用python的set和get來操作以上過程,那麼程式就會如上述所示情況!

如果想要避免此情況的發生,只要使用 gets 和 cas 即可,如:

1 2 3 4 5 6 7 8 9 #!/usr/bin/env python # -*- coding:utf-8 -*- import memcache mc = memcache.Client(['10.211.55.4:12000'], debug=True, cache_cas=True)   = mc.gets('product_count') # ... # 如果有人在gets之後和cas之前修改了product_count,那麼,下麵的設置將會執行失敗,剖出異常,從而避免非正常數據的產生 mc.cas('product_count'"899")

Ps:本質上每次執行gets時,會從memcache中獲取一個自增的數字,通過cas去修改gets的值時,會攜帶之前獲取的自增值和memcache中的自增值進行比較,如果相等,則可以提交,如果不想等,那表示在gets和cas執行之間,又有其他人執行了gets(獲取了緩衝的指定值), 如此一來有可能出現非正常數據,則不允許修改


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. CentOS7安裝MySQL # wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm # rpm -ivh mysql-community-release-el7-5.noarch.rpm # yum i ...
  • Description 給定兩個集合A和B的所有元素,計算它們的交、並、差集。 Input 輸入數據有多組,第一行為數據的組數T,接下來有2T行,每組數據占2行,每行有若幹個整數,第一行的所有整數構成集合A,第二行的所有整數構成集合B,分別用空格分隔。A和B最多分別不超過100個元素。 Output ...
  • 對象(四) 一、封裝 面向對象的三大特征:封裝、繼承、多態。 今天呢,我們來談談,其中兩個 封裝和繼承。而多態呢,如果沒有繼承也就沒有多態一說,這個我們後續繼續聊。 隱藏了實現細節,提供公共的訪問方式 提高了代碼復用性 提高安全性 隱藏了實現細節,提供公共的訪問方式 提高了代碼復用性 提高安全性 3 ...
  • 引言 本來計劃每周完成一篇Python的自學博客,由於上一篇到這一篇遇到了過年、開學等雜事,導致托更到現在。現在又是一個新的學期,春天也越來越近了(冷到感冒)。好了,閑話就說這麼多。開始本周的自學Python之路。而且,同時從這周開始,也要開始自學Tensorflow。希望能嚴格要求自己,不會托更。 ...
  • 1101: [POI2007]Zap Description FGD正在破解一段密碼,他需要回答很多類似的問題:對於給定的整數a,b和d,有多少正整數對x,y,滿足x<=a,y<=b,並且gcd(x,y)=d。作為FGD的同學,FGD希望得到你的幫助。 FGD正在破解一段密碼,他需要回答很多類似的問 ...
  • 1、 Iterable 與 Iterator Iterable 是個介面,實現此介面使集合對象可以通過迭代器遍歷自身元素. public interface Iterable<T> 第一個介面iterator()是jdk1.5引入的,需要子類實現一個內部迭代器Iterator遍歷元素。 後兩個介面是 ...
  • 堆和非堆記憶體 按照官方的說法:“Java 虛擬機具有一個堆(Heap),堆是運行時數據區域,所有類實例和數組的記憶體均從此處分配。堆是在 Java 虛擬機啟動時創建的。”“在JVM中堆之外的記憶體稱為非堆記憶體(Non-heap memory)”。 JVM主要管理兩種類型的記憶體:堆和非堆。 Heap me ...
  • 首先,將全部的輸入連接起來,存儲到字元串str中,再將\\全部替換為\空格。再依次遍歷str。對於:“A”:“B”這種情況,我們以:為分界點來分別存儲key和value來進行存儲對於:“A”:{ “B”:“C” }的這種情況,我們如果在:號後面遇到的不是引號,那就將value設置為OBJECT,進行 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...