一、安裝gcc
# yum -y install gcc
二、安裝libevent
# wget http://www.monkey.org/~provos/libevent-2.0.12-stable.tar.gz
# tar zxf libevent-2.0.12-stable.tar.gz
# cd libevent-2.0.12-stable
#./configure --prefix=/usr/local/lib
# make && make install
三、下載安裝最新版本:http://memcached.org/downloads
# wget http://memcached.org/files/memcached-1.4.20.tar.gz
#tar zxvf memcached-1.4.20.tar.gz
# cd memcached-1.4.20
#./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/lib && make && make install
四、配置啟動
# vi /etc/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/local
/usr/sbin/ntpdate ntpupdate.tencentyun.com >/dev/null 2>&1 &
/usr/local/agenttools/agent/startagent.sh /usr/local/agenttools/agent /dev/null
#secu-tcs-agent bootstart, install at Tue Apr 29 17:21:38 CST 2014.
/usr/local/sa/agent/secu-tcs-agent-mon-safe.sh > /dev/null 2>&1
/usr/local/memcached/bin/memcached -p 12677 -U 0 -d -r -u root -m 2040 -c 1024 -t 4
保存后退出,手動啟動服務
# /usr/local/memcached/bin/memcached -p 12677 -U 0 -d -r -u root -m 2040 -c 1024 -t 4
參數說明: -d 是啟動一個守護進程 -m 是分配給Memcache使用的內存數量,單位是MB -u 是運行Memcache的用戶 -l 是監聽的服務器IP地址 -p 是設置Memcache監聽的端口,最好是1024以上的端口 -c 選項是最大運行的並發連接數,默認是1024,按照你服務器的負載量來設定 -P 是設置保存Memcache的pid文件
注:如果出現/usr/local/memcached/bin/memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory異常在/etc/ld.so.conf中加入/usr/local/lib這一行,保存之后,再運行:/sbin/ldconfig –v更新一下配置即可。
# vi /etc/ld.so.conf
# /sbin/ldconfig -V
五、測試memcached
# telnet 127.0.0.1 12677
出現以下信息表示啟動成功
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.(退出telnet的方法是:quit+回車)
上部分轉載自http://blog.csdn.net/fengyily/article/details/35569433
Memcached命令
1
2
3
|
存儲命令:
set
/
add
/
replace
/
append
/
prepend
/
cas
獲取命令: get
/
gets
其他命令: delete
/
stats..
|
Python操作Memcached
安裝API
1
2
|
python操作Memcached使用Python
-
memcached模塊
pip install 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
)
v
=
mc.gets(
'product_count'
)
# ...
# 如果有人在gets之后和cas之前修改了product_count,那么,下面的設置將會執行失敗,剖出異常,從而避免非正常數據的產生
mc.cas(
'product_count'
,
"899"
)
|
Ps:本質上每次執行gets時,會從memcache中獲取一個自增的數字,通過cas去修改gets的值時,會攜帶之前獲取的自增值和memcache中的自增值進行比較,如果相等,則可以提交,如果不想等,那表示在gets和cas執行之間,又有其他人執行了gets(獲取了緩沖的指定值), 如此一來有可能出現非正常數據,則不允許修改。
此部分轉載:http://www.cnblogs.com/wupeiqi/articles/5132791.html