rpm -qa|grep libevent yum install libevent libevent-devel-y
yum -y install –enablerepo=rpmforge memcached /usr/bin/memcached -d -m 1024m -c 1024 -u root
/usr/local/memcached/bin/memcached -d -m 10m -p 11211 -u root
-d選項是啓動一個守護進程, -m是分配給Memcache使用的內存數量,單位是MB,這裏是10MB, -u是運行Memcache的用戶,這裏是root, -l是監聽的服務器IP地址,若是有多個地址的話,這裏指定了服務器的IP地址192.168.0.200, -p是設置Memcache監聽的端口,這裏設置了12000,最好是1024以上的端口, -c選項是最大運行的併發鏈接數,默認是1024,這裏設置了256,按照服務器的負載量來設定, -P是設置保存Memcache的pid文件,我這裏是保存在 /tmp/memcached.pid,也能夠啓動多個守護進程,不過端口不能重複
<!-- 緩存 --> <dependency> <groupId>com.whalin</groupId> <artifactId>Memcached-Java-Client</artifactId> <version>3.0.1</version> <type>jar</type> <scope>compile</scope> </dependency>
public class MemCached { // 建立全局的惟一實例 public static MemCachedClient mcc = new MemCachedClient(); public volatile static MemCached memCached = null; // 設置與緩存服務器的鏈接池 static { // 服務器列表和其權重 String[] servers = {"119.23.245.84:11211"}; //String[] servers = {"120.77.44.111:10201"}; Integer[] weights = {3}; // 獲取socke鏈接池的實例對象 // 這個類用來建立管理客戶端和服務器通信鏈接池, // 客戶端主要的工做(包括數據通信、服務器定位、hash碼生成等)都是由這個類完成的。 SockIOPool pool = SockIOPool.getInstance(); // 設置服務器信息 pool.setServers(servers); // 設置Server權重 pool.setWeights(weights); // 設置初始鏈接數、最小和最大鏈接數以及最大處理時間 pool.setInitConn(5); pool.setMinConn(5); pool.setMaxConn(250); pool.setMaxIdle(1000 * 60 * 60 * 6); // 設置主線程的睡眠時間 pool.setMaintSleep(30); // 設置鏈接心跳監測開關 // true:每次通訊都要進行鏈接是否有效的監測,形成通訊次數倍增,加大網絡負載, // 所以在對HighAvailability要求比較高的場合應該設爲true // 默認狀態是false,建議保持默認。 pool.setAliveCheck(false); // 設置鏈接失敗恢復開關 // 設置爲true,當宕機的服務器啓動或中斷的網絡鏈接後,這個socket鏈接還可繼續使用,不然將再也不使用. // 默認狀態是true,建議保持默認。 pool.setFailback(true); // 設置容錯開關 // true:噹噹前socket不可用時,程序會自動查找可用鏈接並返回,不然返回NULL // 默認狀態是true,建議保持默認。 pool.setFailover(true); // 設置hash算法 // alg=0 使用String.hashCode()得到hash code,該方法依賴JDK,可能和其餘客戶端不兼容,建議不使用 // alg=1 使用original 兼容hash算法,兼容其餘客戶端 // alg=2 使用CRC32兼容hash算法,兼容其餘客戶端,性能優於original算法 // alg=3 使用MD5 hash算法 // 採用前三種hash算法的時候,查找cache服務器使用餘數方法。採用最後一種hash算法查找cache服務時使用consistent方法。 // 默認值爲0 pool.setHashingAlg(0); // 設置是否使用Nagle算法,由於咱們的通信數據量一般都比較大(相對TCP控制數據)並且要求響應及時, // 所以該值須要設置爲false(默認是true) pool.setNagle(false); // 設置socket的讀取等待超時值 pool.setSocketTO(3000); // 設置socket的鏈接等待超時值 pool.setSocketConnectTO(0); // 初始化鏈接池 pool.initialize(); // 壓縮設置,超過指定大小(單位爲K)的數據都會被壓縮 // mcc.setCompressEnable(true); //UnsupportedOperation // mcc.setCompressThreshold(64 * 1024); } private MemCached() { } /** *<p>Description:單例模式-二次校驗</p> *<p>Author:Boomer</p> *<p>Date:2017/8/24 13:32</p> **/ public static MemCached getInstance() { if (null == memCached) { synchronized (MemCached.class) {// 二次校驗 if (null == memCached) { memCached = new MemCached(); } } } return memCached; } /** * 添加一個指定的鍵值對到緩存中. * * @param key * @param value * @return */ public boolean add(String key, Object value) { return mcc.add(key, value); } /** * 添加一個指定的鍵值對到緩存中. * * @param key * @param value * @param minute 多少分鐘以後過時 * @return */ public boolean add(String key, Object value, int minute) { return mcc.add(key, value, new Date(60000 * minute)); } public boolean set(String key, Object value) { return mcc.set(key, value); } public boolean set(String key, Object value, int minute) { return mcc.set(key, value, new Date(60000 * minute)); } public boolean replace(String key, Object value) { return mcc.replace(key, value); } public boolean replace(String key, Object value, int minute) { return mcc.replace(key, value, new Date(60000 * minute)); } /** * 根據指定的關鍵字獲取對象. * * @param key * @return */ public Object get(String key) { return mcc.get(key); } /** * 刪除指定緩存 * * @param key * @return */ public boolean del(String key) { return mcc.delete(key); } }
MemCached memCached = MemCached.getInstance(); memCached.add("test","hello World"); System.out.println(memCached.get("test"));
輸出 hello World 成功算法