亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Memcached Java客戶端編程

系統 2049 0

最近一直在做一個項目的前期設計工作,考慮到后期系統的擴展和性能問題也找了很多解決方法,有一個就是用到了數據庫的緩存工具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目錄下,然后我們來編寫代碼,比如我提供的一個應用類如下:

    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如下:

    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方法中加入如下幾行代碼:

    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的一點小學習和實踐,在以后的項目開發過程中將會更深入的學習和應用這一緩存工具,也希望和有興趣的同行一起討論學習該工具的使用~~

?

[ 轉自 : http://q.sohu.com/forum/5/topic/640252 ]

Memcached Java客戶端編程


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 香蕉视频网站免费观视频 | 成人国产精品一级毛片天堂 | 久久天堂网 | 亚洲免费一级视频 | 亚洲最大成人在线 | 777奇米影视色888成人 | 久久国产精品永久免费网站 | 欧美天天干 | 欧美高清在线精品一区二区不卡 | 久久久久亚洲精品一区二区三区 | 香蕉久久精品国产 | 婷婷国产天堂久久综合五月 | 精品一久久香蕉国产线看播放 | 五月四房| 成人亚州 | 亚洲图片 欧美 | 精品国产午夜久久久久九九 | 国产精品亚洲一区二区三区正片 | 色八戒国产一区二区三区四区 | 色悠久久综合 | 草草福利影院 | 一级淫片免费看 | 四虎影永久在线观看网址 | 97视频在线视频 | 亚洲成人视| 国产成年网站v片在线观看 国产成人 免费观看 | 亚洲第一区香蕉_国产a | 精品在线播放视频 | 啪啪99久久综合精品色 | 日韩欧美一区二区精品久久 | 久久综合九色综合77 | 久久人人网 | 国产亚洲一区二区三区在线观看 | 日本久久久久久久中文字幕 | 国产网址 | 免费九九视频 | 久久夜色精品国产噜噜小说 | 亚洲午夜久久久久中文字幕久 | 一级高清毛片免费a级高清毛片 | 亚洲va高清中文字幕 | 日韩久久免费视频 |