實(shí)例講解分布式緩存軟件Memcached的Java客戶端使用
Memcached介紹
下面就來(lái)介紹一下Memcached。
1、什么是Memcached
Memcached是一個(gè)開源的高性能,分布式的內(nèi)存對(duì)象緩存系統(tǒng),通過(guò)鍵值隊(duì)的形式來(lái)對(duì)數(shù)據(jù)進(jìn)行存取,Memcached是簡(jiǎn)單而強(qiáng)大,它的簡(jiǎn)單設(shè)計(jì)促進(jìn)快速部署,易于開發(fā),解決了大數(shù)據(jù)緩存面臨的許多問(wèn)題。
官方網(wǎng)址是:http://memcached.org/,目前已經(jīng)有很多知名的互聯(lián)網(wǎng)應(yīng)用使用到了Memcached,比如Wikipedia、Flickr、Youtube、Wordpress等等。
2、下載Windows平臺(tái)下的MemCached,地址為:
http://code.jellycan.com/files/memcached-1.2.6-win32-bin.zip
對(duì)應(yīng)的源碼地址為:
http://code.jellycan.com/files/memcached-1.2.6-win32-src.zip
然后,解壓開來(lái),會(huì)看到一個(gè)memcached.exe文件,進(jìn)行如下圖的安裝,將以系統(tǒng)服務(wù)的形式安裝到機(jī)上

然后查看系統(tǒng)服務(wù),會(huì)發(fā)現(xiàn)已經(jīng)可以看到memcached服務(wù)了

然后,選中此服務(wù)點(diǎn)鼠標(biāo)右鍵,啟動(dòng)此服務(wù)。
在DOS界面中輸入:telnet 127.0.0.1 11211來(lái)確認(rèn)服務(wù)是否啟動(dòng)無(wú)誤,如果無(wú)誤,則會(huì)顯示如下窗口:

上面圖中顯示的ERROR是我隨便輸入字符后按回車顯示的,這是因?yàn)槟阈枰惭bmemcached規(guī)定的協(xié)議來(lái)進(jìn)行輸入,否則就顯示如上所示錯(cuò)誤。
3、 memcached的協(xié)議與數(shù)據(jù)存取
所謂協(xié)議,可以理解為對(duì)其操作(數(shù)據(jù)存取)的語(yǔ)法規(guī)則,存取數(shù)據(jù)的常用命令和參數(shù)如下:
set:存入一條記錄
key:記錄的鍵值
flags:十進(jìn)制的int,標(biāo)識(shí)存儲(chǔ)記錄時(shí)的客戶端標(biāo)志,在記錄取出時(shí)會(huì)返回。
exptim:數(shù)據(jù)的過(guò)期時(shí)間,0表示不過(guò)期,其他數(shù)值則表示有效的毫秒數(shù),在過(guò)期后,客戶端將取不到這條記錄,memcached中的過(guò)期記錄會(huì)被清空或刪除。
get:表示從memcached取出key對(duì)應(yīng)的值,如果沒(méi)有對(duì)應(yīng)的值則返回結(jié)束標(biāo)志END
append:表示對(duì)key所對(duì)應(yīng)的值在最后再加入輸入的內(nèi)容
delete:刪除key對(duì)應(yīng)的值
更多協(xié)議可參考:memcached包中所帶的protocol.txt
具體例子如:
需要注意的是:在set時(shí)如果指定的字符長(zhǎng)度為5,而輸入的內(nèi)容超過(guò)了這個(gè)長(zhǎng)度,那么就會(huì)報(bào)錯(cuò):CLIENT_ERROR bad data chunk

4、 編寫代碼對(duì)memcached進(jìn)行數(shù)據(jù)存取操作
一般而言,可以使用開源已封裝好的memcached客戶端來(lái)對(duì)memcached進(jìn)行操作,當(dāng)然你也可以根據(jù)memcached的協(xié)議在代碼中通過(guò)編寫socket通信程序?qū)崿F(xiàn)。
Memcached-Java-Client的下載頁(yè)面:
http://github.com/gwhalin/Memcached-Java-Client/downloads,然后選擇下載:
java_memcached-release_2.5.1.zip
在解壓開的Test目錄中可以看到有些寫好的例子,可以通過(guò)運(yùn)行com.danga.MemCached.test. TestMemcached來(lái)查看數(shù)據(jù)存入和取出情況,這里也貼出其代碼:
package com.danga.MemCached.test;
import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;
import org.apache.log4j.*;
public class TestMemcached {
public static void main(String[] args) {
// memcached should be running on port 11211 but NOT on 11212
BasicConfigurator.configure();
//緩存服務(wù)器地址,多臺(tái)服務(wù)器則以逗號(hào)隔開,11211為memcached使用的端口號(hào)
String[] servers = { “l(fā)ocalhost:11211″ };
//得到一個(gè)鏈接池對(duì)象并進(jìn)行一些初始化工作
SockIOPool pool = SockIOPool.getInstance();
pool.setServers( servers );
pool.setFailover( true );
pool.setInitConn( 10 );
pool.setMinConn( 5 );
pool.setMaxConn( 250 );
//pool.setMaintSleep( 30 );
pool.setNagle( false );
pool.setSocketTO( 3000 );
pool.setAliveCheck( true );
pool.initialize();
MemCachedClient mcc = new MemCachedClient();
// turn off most memcached client logging:
//Logger.getLogger( MemCachedClient.class.getName() ).setLevel( com.schooner.MemCached.Logger. );
//以下是數(shù)據(jù)寫入和取出操作例子
for ( int i = 0; i < 10; i++ ) {
boolean success = mcc.set( “” + i, “Hello!” );
String result = (String)mcc.get( “” + i );
System.out.println( String.format( “set( %d ): %s”, i, success ) );
System.out.println( String.format( “get( %d ): %s”, i, result ) );
}
System.out.println( “\n\t — sleeping –\n” );
try { Thread.sleep( 10000 ); } catch ( Exception ex ) { }
for ( int i = 0; i < 10; i++ ) {
boolean success = mcc.set( “” + i, “Hello!” );
String result = (String)mcc.get( “” + i );
System.out.println( String.format( “set( %d ): %s”, i, success ) );
System.out.println( String.format( “get( %d ): %s”, i, result ) );
}
}
}
MemCached的java客戶端實(shí)例
package com.danga.MemCached.test;
import com.danga.MemCached.*;
public class TestMemcached {
public static void main(String[] args) {
/*初始化SockIOPool,管理memcached的連接池*/
String[] servers = { "192.168.105.217:11211" };
SockIOPool pool = SockIOPool.getInstance();
pool.setServers(servers);
pool.setFailover(true);
pool.setInitConn(10);
pool.setMinConn(5);
pool.setMaxConn(250);
pool.setMaintSleep(30);
pool.setNagle(false);
pool.setSocketTO(3000);
pool.setAliveCheck(true);
pool.initialize();
/*建立MemcachedClient實(shí)例*/
MemCachedClient memCachedClient = new MemCachedClient();
for (int i = 0; i < 10; i++) {
/*將對(duì)象加入到memcached緩存*/
boolean success = memCachedClient.set("" + i, "Hello!");
/*從memcached緩存中按key值取對(duì)象*/
String result = (String) memCachedClient.get("" + i);
System.out.println(String.format("set( %d ): %s", i, success));
System.out.println(String.format("get( %d ): %s", i, result));
}
}
}
1.解壓(本例中解壓到c:\memcached)。
2、在命令行狀態(tài)下輸入: c:\memcached\memcached.exe -d install 。至此memcached已經(jīng)安裝成windows服務(wù)
3、在命令行下輸入: c:\memcached\memcached.exe -d start 以啟動(dòng)memcached服務(wù)。當(dāng)然也可以選擇在windows服務(wù)中啟動(dòng)
相關(guān)文章
java使用randomaccessfile在文件任意位置寫入數(shù)據(jù)
Java在文件任意位置寫入數(shù)據(jù)可以使用RandomAccessFile方法來(lái)完成,下面看一個(gè)簡(jiǎn)單的示例就明白了2014-01-01
Java中注解@Async實(shí)現(xiàn)異步及導(dǎo)致失效原因分析
Async注解用于聲明一個(gè)方法是異步的,當(dāng)在方法上加上這個(gè)注解時(shí)將會(huì)在一個(gè)新的線程中執(zhí)行該方法,而不會(huì)阻塞原始線程,這篇文章主要給大家介紹了關(guān)于Java中注解@Async實(shí)現(xiàn)異步及導(dǎo)致失效原因分析的相關(guān)資料,需要的朋友可以參考下2024-07-07
SpringBoot異步任務(wù)實(shí)現(xiàn)下單校驗(yàn)庫(kù)存的項(xiàng)目實(shí)踐
在開發(fā)中,異步任務(wù)應(yīng)用的場(chǎng)景非常的廣泛,本文主要介紹了SpringBoot異步任務(wù)實(shí)現(xiàn)下單校驗(yàn)庫(kù)存的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09
springBoot+dubbo+zookeeper實(shí)現(xiàn)分布式開發(fā)應(yīng)用的項(xiàng)目實(shí)踐
本文主要介紹了springBoot+dubbo+zookeeper實(shí)現(xiàn)分布式開發(fā)應(yīng)用的項(xiàng)目實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
SpringBoot集成Access?DB實(shí)現(xiàn)數(shù)據(jù)導(dǎo)入和解析
microsoft?office?access是由微軟發(fā)布的關(guān)聯(lián)式數(shù)據(jù)庫(kù)管理系統(tǒng),它結(jié)合了?microsoft?jet?database?engine?和?圖形用戶界面兩項(xiàng)特點(diǎn),是一種關(guān)系數(shù)據(jù)庫(kù)工具,本文給大家介紹了SpringBoot集成Access?DB實(shí)現(xiàn)數(shù)據(jù)導(dǎo)入和解析,需要的朋友可以參考下2024-11-11
Java位集合之BitMap實(shí)現(xiàn)和應(yīng)用詳解
這篇文章主要介紹了Java位集合之BitMap實(shí)現(xiàn)和應(yīng)用的相關(guān)資料,BitMap是一種高效的數(shù)據(jù)結(jié)構(gòu),適用于快速排序、去重和查找等操作,通過(guò)簡(jiǎn)單的數(shù)組和位運(yùn)算,可以在Java中實(shí)現(xiàn)BitMap,從而節(jié)省存儲(chǔ)空間并提高性能,需要的朋友可以參考下2024-12-12
SpringBoot實(shí)現(xiàn)Logback輸出日志到Kafka方式
本文介紹了如何在SpringBoot應(yīng)用中通過(guò)自定義Appender實(shí)現(xiàn)Logback輸出日志到Kafka,包括配置maven依賴、Kafka工具類和logback.xml配置2025-02-02

