日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Memcached Java客户端编程

發布時間:2025/7/14 java 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Memcached Java客户端编程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近一直在做一個項目的前期設計工作,考慮到后期系統的擴展和性能問題也找了很多解決方法,有一個就是用到了數據庫的緩存工具memcached(當然該工具并不僅僅局限于數據庫的緩存)。先簡單的介紹下什么是memcached。

??? Memcached是高性能的,分布式的內存對象緩存系統,用于在動態應用中減少數據庫負載,提升訪問速度。Memcached由Danga Interactive開發,用于提升LiveJournal.com訪問速度的。LJ每秒動態頁面訪問量幾千次,用戶700萬。Memcached將數據庫負載大幅度降低,更好的分配資源,更快速訪問。

??? 上網baidu了很多東西,幾乎都差不多,而且基于java的說的很少,所有只有在研究了各個其他語言類的應用后再來嘗試在java上進行簡單的操作應用。先從memcached上進行說明,memcached的最新版是采用c語言進行開發和設計的,據說舊版的是采用perl語言開發的,而且它是一個應用軟件來的,是作為緩存服務器的服務器端運行在服務器上的,需要使用特定的語言編寫客戶端與其進行通信來進行數據的緩存和獲取。通常我們是把 memcached安裝運行在web服務器上,然后通過對需要的數據進行緩存,據我目前所知,所有數據的緩存設置和存取操作,以及數據的更新后替換操作全部需要程序來進行,而不是自動進行的(自動不知道能不能成功,呵呵)。下面從一個實際的例子來應用memcached。

??? 首先到http://danga.com/memcached/ 下載memcached的windows版本和java客戶端jar包,目前最新版本是memcached-1.2.1-win32.zip和 java_memcached-release_1.6.zip,分別解壓后即可!首先是安裝運行memcached服務器,我們將memcached- 1.2.1-win32.zip解壓后,進入其目錄,然后運行如下命令:

c:>memcached.exe -d install
c:>memcached.exe -l 127.0.0.1 -m 32 -d start

??? 第一行是安裝memcached成為服務,這樣才能正常運行,否則運行失敗!第一行是啟動memcached的,作為測試我們就簡單的只分配32M內存了,然后監聽本機端口和以守護進行運行。執行完畢后,我們就可以在任務管理器中見到memcached.exe這個進程了。好了,我們的服務器已經正常運行了, 下面我們就來寫java的客戶端連接程序。

??? 我們將java_memcached-release_1.6.zip解壓后的目錄中的java_memcached-release_1.6.jar文件復制到java項目的lib目錄下,然后我們來編寫代碼,比如我提供的一個應用類如下:

Java代碼 ?
  • package?utils.cache; ??
  • ??
  • import?java.util.Date; ??
  • ??
  • import?com.danga.MemCached.MemCachedClient; ??
  • import?com.danga.MemCached.SockIOPool; ??
  • ??
  • ??
  • /** ?
  • *?使用memcached的緩存實用類. ?
  • * ?
  • *?@author?鐵木箱子 ?
  • * ?
  • */??
  • public?class?MemCached ??
  • { ??
  • ????//?創建全局的唯一實例 ??
  • ????protected?static?MemCachedClient?mcc?=?new?MemCachedClient(); ??
  • ??? ??
  • ????protected?static?MemCached?memCached?=?new?MemCached(); ??
  • ??? ??
  • ????//?設置與緩存服務器的連接池 ??
  • ????static?{ ??
  • ????????//?服務器列表和其權重 ??
  • ????????String[]?servers?=?{"127.0.0.1:11211"}; ??
  • ????????Integer[]?weights?=?{3}; ??
  • ??
  • ????????//?獲取socke連接池的實例對象 ??
  • ????????SockIOPool?pool?=?SockIOPool.getInstance(); ??
  • ??
  • ????????//?設置服務器信息 ??
  • ????????pool.setServers(?servers?); ??
  • ????????pool.setWeights(?weights?); ??
  • ??
  • ????????//?設置初始連接數、最小和最大連接數以及最大處理時間 ??
  • ????????pool.setInitConn(?5?); ??
  • ????????pool.setMinConn(?5?); ??
  • ????????pool.setMaxConn(?250?); ??
  • ????????pool.setMaxIdle(?1000?*?60?*?60?*?6?); ??
  • ??
  • ????????//?設置主線程的睡眠時間 ??
  • ????????pool.setMaintSleep(?30?); ??
  • ??
  • ????????//?設置TCP的參數,連接超時等 ??
  • ????????pool.setNagle(?false?); ??
  • ????????pool.setSocketTO(?3000?); ??
  • ????????pool.setSocketConnectTO(?0?); ??
  • ??
  • ????????//?初始化連接池 ??
  • ????????pool.initialize(); ??
  • ??
  • ????????//?壓縮設置,超過指定大小(單位為K)的數據都會被壓縮 ??
  • ????????mcc.setCompressEnable(?true?); ??
  • ????????mcc.setCompressThreshold(?64?*?1024?); ??
  • ????} ??
  • ??? ??
  • ????/** ?
  • ?????*?保護型構造方法,不允許實例化! ?
  • ?????* ?
  • ?????*/??
  • ????protected?MemCached() ??
  • ????{ ??
  • ??????? ??
  • ????} ??
  • ??? ??
  • ????/** ?
  • ?????*?獲取唯一實例. ?
  • ?????*?@return ?
  • ?????*/??
  • ????public?static?MemCached?getInstance() ??
  • ????{ ??
  • ????????return?memCached; ??
  • ????} ??
  • ??? ??
  • ????/** ?
  • ?????*?添加一個指定的值到緩存中. ?
  • ?????*?@param?key ?
  • ?????*?@param?value ?
  • ?????*?@return ?
  • ?????*/??
  • ????public?boolean?add(String?key,?Object?value) ??
  • ????{ ??
  • ????????return?mcc.add(key,?value); ??
  • ????} ??
  • ??? ??
  • ????public?boolean?add(String?key,?Object?value,?Date?expiry) ??
  • ????{ ??
  • ????????return?mcc.add(key,?value,?expiry); ??
  • ????} ??
  • ??? ??
  • ????public?boolean?replace(String?key,?Object?value) ??
  • ????{ ??
  • ????????return?mcc.replace(key,?value); ??
  • ????} ??
  • ??? ??
  • ????public?boolean?replace(String?key,?Object?value,?Date?expiry) ??
  • ????{ ??
  • ????????return?mcc.replace(key,?value,?expiry); ??
  • ????} ??
  • ??? ??
  • ????/** ?
  • ?????*?根據指定的關鍵字獲取對象. ?
  • ?????*?@param?key ?
  • ?????*?@return ?
  • ?????*/??
  • ????public?Object?get(String?key) ??
  • ????{ ??
  • ????????return?mcc.get(key); ??
  • ????} ??
  • ??? ??
  • ????public?static?void?main(String[]?args) ??
  • ????{ ??
  • ????????MemCached?cache?=?MemCached.getInstance(); ??
  • ????????cache.add("hello",?234); ??
  • ????????System.out.print("get?value?:?"?+?cache.get("hello")); ??
  • ????} ??
  • }??
  • package utils.cache;import java.util.Date;import com.danga.MemCached.MemCachedClient; import com.danga.MemCached.SockIOPool;/** * 使用memcached的緩存實用類. * * @author 鐵木箱子 * */ public class MemCached {// 創建全局的唯一實例protected static MemCachedClient mcc = new MemCachedClient();protected static MemCached memCached = new MemCached();// 設置與緩存服務器的連接池static {// 服務器列表和其權重String[] servers = {"127.0.0.1:11211"};Integer[] weights = {3};// 獲取socke連接池的實例對象SockIOPool pool = SockIOPool.getInstance();// 設置服務器信息pool.setServers( servers );pool.setWeights( weights );// 設置初始連接數、最小和最大連接數以及最大處理時間pool.setInitConn( 5 );pool.setMinConn( 5 );pool.setMaxConn( 250 );pool.setMaxIdle( 1000 * 60 * 60 * 6 );// 設置主線程的睡眠時間pool.setMaintSleep( 30 );// 設置TCP的參數,連接超時等pool.setNagle( false );pool.setSocketTO( 3000 );pool.setSocketConnectTO( 0 );// 初始化連接池pool.initialize();// 壓縮設置,超過指定大小(單位為K)的數據都會被壓縮mcc.setCompressEnable( true );mcc.setCompressThreshold( 64 * 1024 );}/*** 保護型構造方法,不允許實例化!**/protected MemCached(){}/*** 獲取唯一實例.* @return*/public static MemCached getInstance(){return memCached;}/*** 添加一個指定的值到緩存中.* @param key* @param value* @return*/public boolean add(String key, Object value){return mcc.add(key, value);}public boolean add(String key, Object value, Date expiry){return mcc.add(key, value, expiry);}public boolean replace(String key, Object value){return mcc.replace(key, value);}public boolean replace(String key, Object value, Date expiry){return mcc.replace(key, value, expiry);}/*** 根據指定的關鍵字獲取對象.* @param key* @return*/public Object get(String key){return mcc.get(key);}public static void main(String[] args){MemCached cache = MemCached.getInstance();cache.add("hello", 234);System.out.print("get value : " + cache.get("hello"));} }

    ?那么我們就可以通過簡單的像main方法中操作的一樣存入一個變量,然后再取出進行查看,我們可以看到先調用了add,然后再進行get,我們運行一次后,234這個值已經被我們存入了memcached的緩存中的了,我們將main方法中紅色的那一行注釋掉后,我們再運行還是可以看到get到的 value也是234,即緩存中我們已經存在了數據了。

    ??? 對基本的數據我們可以操作,對于普通的POJO而言,如果要進行存儲的話,那么比如讓其實現java.io.Serializable接口,因為 memcached是一個分布式的緩存服務器,多臺服務器間進行數據共享需要將對象序列化的,所以必須實現該接口,否則會報錯的 。比如我們寫一個簡單的測試Bean如下:

    Java代碼 ?
  • class?TBean?implements?java.io.Serializable ??
  • { ??
  • ????private?static?final?long?serialVersionUID?=?1945562032261336919L; ??
  • ??? ??
  • ????private?String?name; ??
  • ??
  • ????public?String?getName() ??
  • ????{ ??
  • ????????return?name; ??
  • ????} ??
  • ??
  • ????public?void?setName(String?name) ??
  • ????{ ??
  • ????????this.name?=?name; ??
  • ????} ??
  • }??
  • class TBean implements java.io.Serializable {private static final long serialVersionUID = 1945562032261336919L;private String name;public String getName(){return name;}public void setName(String name){this.name = name;} }

    ?然后我們在main方法中加入如下幾行代碼:

    Java代碼 ?
  • TBean?tb?=?new?TBean(); ??
  • tb.setName("鐵木箱子"); ??
  • cache.add("bean",?tb); ??
  • TBean?tb1?=?(TBean)cache.get("bean"); ??
  • System.out.print("name="?+?tb1.getName()); ??
  • tb1.setName("鐵木箱子_修改的"); ??
  • tb1?=?(TBean)cache.get("bean"); ??
  • System.out.print("name="?+?tb1.getName());??
  • TBean tb = new TBean(); tb.setName("鐵木箱子"); cache.add("bean", tb); TBean tb1 = (TBean)cache.get("bean"); System.out.print("name=" + tb1.getName()); tb1.setName("鐵木箱子_修改的"); tb1 = (TBean)cache.get("bean"); System.out.print("name=" + tb1.getName());

    ?我們首先把TBean的一個實例放入緩存中,然后再取出來,并進行名稱的修改,然后我們再取這個對象,我們再看其名稱,發現修改的對象并不是緩存中的對象,而是通過序列化過來的一個實例對象,這樣我們就無須擔心對原生類的無意修改導致緩存數據失效了,呵呵~~看來我也是多此一想啊。所以這表明從緩存中獲取的對象是存入對象的一個副本,對獲取對象的修改并不能真正的修改緩存中的數據,而應該使用其提供的replace等方法來進行修改

    ??? 以上是我在windows下對memcached的一點小學習和實踐,在以后的項目開發過程中將會更深入的學習和應用這一緩存工具,也希望和有興趣的同行一起討論學習該工具的使用~~

    總結

    以上是生活随笔為你收集整理的Memcached Java客户端编程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 欧美日韩一级黄色片 | 亚洲一区欧美一区 | 美女网站免费黄 | 成人精品一区二区三区在线 | 欧美激情69| 国产精品久久久久久久久免费相片 | 小视频在线播放 | 久久男人的天堂 | 色爽| 成人免费黄色大片 | 极品美女开粉嫩精品 | 懂色av粉嫩av蜜乳av | 久久黄色录像 | 国产99久久九九精品无码免费 | 日韩一区中文字幕 | 午夜激情久久久 | 一区二区三区四区不卡 | 91日批| 中文字幕在线观看视频一区 | 国产精品伦一区二区 | 91黄色入口 | 91成人看片 | 观看av | 亚洲国产中文字幕在线观看 | 视频一区中文字幕 | 免费无码不卡视频在线观看 | 久久亚洲精品小早川怜子 | 亚洲天堂影院 | 在线免费成人网 | 欧美极品在线视频 | 天堂视频一区二区 | 狠狠躁天天躁夜夜躁婷婷 | 韩国三级hd中文字幕 | 91久久久久久久久久久久 | 国产色诱视频 | 亚洲视频自拍偷拍 | 玖玖精品在线视频 | 国产一区二区高清 | 欧美三级免费观看 | 久久色在线观看 | 久色视频在线 | 国产精品久久福利 | 性爱视频在线免费 | av在线导航 | 蜜乳av一区二区三区 | 三级成人 | 久久91久久| 国产网站免费观看 | 日韩av二区 | sm国产在线调教视频 | 国产精品免费久久久久 | 人人妻人人玩人人澡人人爽 | 日噜噜夜噜噜 | 国产久草视频 | www.久久 | 开心激情网站 | 91麻豆国产福利精品 | 全部毛片永久免费看 | 成人国产免费视频 | 91久久国产视频 | 在哪里可以看黄色片 | 少妇一级淫片免费放 | 成人免费精品视频 | 午夜视频在线观看免费视频 | 国产精品无码久久久久久 | 啪啪小视频 | 国产精品永久免费 | 久久久久久久久久影视 | 99久免费精品视频在线观78 | 日韩乱码一区二区 | 国产福利在线看 | 国产另类ts人妖一区二区 | 九九热免费 | 一区二区三区欧美精品 | 国产三级精品视频 | 国产专区在线视频 | 国产成人精品一区在线播放 | 亚洲中文字幕无码一区二区三区 | 亚洲黄色影院 | 丁香花激情网 | 米奇av | 少妇一区二区视频 | 久色| 日本男人的天堂 | 中文写幕一区二区三区免费观成熟 | 欧美资源站 | 国产一区二区三区在线视频 | 亚洲av无码一区二区三区网站 | 老女人黄色片 | 在线观看成年人网站 | 狂野欧美性猛交xxxxhd | 欧美成人自拍视频 | 伊人激情综合 | 日韩欧美中文字幕在线播放 | 国产亚洲精久久久久久无码77777 | 不卡视频一区二区 | 蜜桃av色偷偷av老熟女 | 黄色一级免费网站 | 色播在线视频 |