下載Memcached的服務器端軟件
Windows平臺版本下載:http://splinedancer.com/memcached-win32/memcached-1.2.4-Win32-Preview-20080309_bin.zip
Linux平臺版本下載:http://memcached.googlecode.com/files/memcached-1.4.10.tar.gz
3. 在服務器上部署Memcached Server
以下以Windows平臺爲例:
參考:http://www.codeforest.net/how-to-install-memcached-on-windows-machine
下載下來的Windows版本解壓到C:/memcached/
在控制檯輸入命令安裝:
c:/memcached/memcached.exe -d install |
啓動:
c:/memcached/memcached.exe -d start |
或:
|
默認的緩存大小爲64M,如果不夠用,請打開註冊表,找到:
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/memcached Server . |
將其內容修改爲:
“C:/memcached/memcached.exe” -d runservice -m 512 |
4. 下載Memcached的客戶端API包
下載地址:http://spymemcached.googlecode.com/files/memcached-2.5.jar
5. 編寫一個Java數據類
|
6. 編寫一個Memcached的客戶端
|
7. 運行測試
運行結果應該如下:
|
1. 構造函數(java_memcached-release_2.5.1.jar跟這個包實現的有點差別,但意思一樣)
public MemcachedClient(InetSocketAddress[] ia) throws IOException; |
public MemcachedClient(List<InetSocketAddress> addrs) throws IOException; |
public MemcachedClient(ConnectionFactory cf, List<InetSocketAddress> addrs) throws IOException; |
其中最簡單的構造函數就是第一個,可以直接傳遞一個InetSocketAddress,也可以是InetSocketAddress的數組。其實InetSocketAddress也是被轉換成數組的。
比如:
MemcachedClient cache = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211)); |
2. 常用方法
一般緩存數據的常用操作有:set(add+replace)、get、replace、add
public Future<Boolean> set(String key, int exp, Object o) |
第一個參數:鍵(key)
第二個參數:過期時間(單位是秒)
第三個參數:要設置緩存中的對象(value),如果沒有則插入,如果有則修改。
public Object get(String key) |
第一個參數:鍵(key)
public Future<Boolean> replace(String key, int exp, Object o) |
第一個參數:鍵(key)
第二個參數:過期時間(單位是秒)
第三個參數:該鍵的新值(new value),如果有則修改。
public Future<Boolean> add(String key, int exp, Object o) |
第一個參數:鍵(key)
第二個參數:過期時間(單位是秒)
第三個參數:該鍵的值(value),如果沒有則插入。
一、基本參數
在我們第一次安裝Memcached時,一般都是用過這個命令:
memcached -m 512 -u root -d -l 127.0.0.1 -p 11211 |
-m 指定緩存所使用的最大內存容量,單位是Megabytes,默認是64MB
-u 只有以root身份運行時才指定該參數
-d 以daemon的形式運行
-l 指定監聽的地址
-p 指定監聽的TCP端口號,默認是11211
二、其他常用的參數
-t 指定線程數,默認是4個
-h 打印幫助信息
-c 最大同時連接數,默認是1024.
-U 指定監聽的UDP端口號,默認是11211
-M 內存耗盡時顯示錯誤,而不是刪除項
一開始說的“-d”參數需要進行進一步的解釋
-d install 安裝memcached
-d uninstall 卸載memcached
-d start 啓動memcached服務
-d restart 重啓memcached服務
-d stop 停止memcached服務
-d shutdown 停止memcached服務
三、更多參數
使用"-h"去了解吧~
四、使用服務軟件的經驗
寫到這裏,最後說一句。在使用任何軟件的時候,首先要去關注這樣幾點:
1. 打印幫助信息:
這個一般都是“-h”,當然也有需要“-help”纔可以的。
2. 啓動、停止、重啓/重載配置的命令:
要注意,是同一個命令的不同參數來標識的,還是用不同的命令或腳本。
3. 配置
首先,啓動是否需要配置文件。
其次,如果是比較大型的軟件,一般都需要配置文件,那麼默認的配置文件在哪裏要清楚。
再次,指定加載配置文件的命令格式如何。
4. 指定使用內存容量、線程數、硬盤容量等
是否有這方面的配置參數需要指定,以及如何設置。
5. 日誌文件
首先,是否有日誌文件需要存儲。
其次,如果有日誌文件,默認的存儲目錄是什麼。
最後,手動指定日誌文件的命令格式如何。
6. 最大連接數
首先,是否提供監聽的連接服務。
其次,如果提供,默認的最大連接數是多少。
最後,手動指定最大連接數的命令格式如何。
Memcached的CAS協議
CAS的基本原理
基本原理非常簡單,一言以蔽之,就是“版本號”。每個存儲的數據對象,多有一個版本號。我們可以從下面的例子來理解:
如果不採用CAS,則有如下的情景:
第一步,A取出數據對象X;
第二步,B取出數據對象X;
第三步,B修改數據對象X,並將其放入緩存;
第四步,A修改數據對象X,並將其放入緩存。
我們可以發現,第四步中會產生數據寫入衝突。
如果採用CAS協議,則是如下的情景。
第一步,A取出數據對象X,並獲取到CAS-ID1;
第二步,B取出數據對象X,並獲取到CAS-ID2;
第三步,B修改數據對象X,在寫入緩存前,檢查CAS-ID與緩存空間中該數據的CAS-ID是否一致。結果是“一致”,就將修改後的帶有CAS-ID2的X寫入到緩存。
第四步,A修改數據對象Y,在寫入緩存前,檢查CAS-ID與緩存空間中該數據的CAS-ID是否一致。結果是“不一致”,則拒絕寫入,返回存儲失敗。
這樣CAS協議就用了“版本號”的思想,解決了衝突問題。
1. 非CAS
首先看一個不是CAS的Memcached程序實例。實例的問題原型,見上一篇博文。
程序實例:
|
運行結果:
|
可見在多個Client操作時,一定會引起寫不一致性的問題。
2. CAS
程序實例:
|
運行結果:
|