MemcachedとJAVAを組み合わせた簡単な使用例

6721 ワード

最近ずっと1つのプロジェクトの前期の設計の仕事をして、後期のシステムの拡張と性能の問題を考慮しても多くの解決方法を探して、1つはデータベースのキャッシュツール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-win 32.zipとjava_です.memcached-release_1.6.zip、それぞれ解凍すればいい!
 説明:windowバージョンのmemcacheサービスソフトウェアのダウンロードリンクは無効で、私は新しいリンク
を提供します
   http://splinedancer.com/memcached-win32/
まずmemcachedサーバをインストールして実行し、memcached-1.2.1-win 32.zipを解凍した後、ディレクトリに入り、次のコマンドを実行します.
c:>memcached.exe -d install c:>memcached.exe -l 127.0.0.1 -m 32 -d start
    最初の行はmemcachedをインストールしてサービスになります.そうしないと、正常に動作しません.そうしないと、実行に失敗します.最初の行はmemcachedを起動し、テストとして32 Mメモリのみを簡単に割り当て、ホストポートを傍受し、実行を守ります.実行が完了すると、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"};  //     memcache      ,           
        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に対する少しの学習と実践で、今後のプロジェクト開発の過程の中で更に深くこのキャッシュツールを学習して応用することができて、興味のある同業者と一緒にこのツールの使用を学ぶことを討論したいです