`
bibo531651225
  • 浏览: 101784 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

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,分别解压后即可!

说明:window版本的memcache服务软件下载链接是无效的,我提供一个新的链接


   http://splinedancer.com/memcached-win32/

首先是安装运行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目录下,然后我们来编写代码,比如我提供的一个应用类如下:








001 package utils.cache;


002  


003 import java.util.Date;


004  


005 import com.danga.MemCached.MemCachedClient;


006 import com.danga.MemCached.SockIOPool;


007  


008  


009 /**


010 * 使用memcached的缓存实用类.


011 *


012 * @author 铁木箱子


013 *


014 */


015 public class MemCached


016 {


017     // 创建全局的唯一实例


018     protected static MemCachedClient mcc = new MemCachedClient();


019     


020     protected static MemCached memCached = new MemCached();


021     


022     // 设置与缓存服务器的连接池


023     static {


024         // 服务器列表和其权重


025         String[] servers = {"127.0.0.1:11211"};  //这个端口是memcache服务的端口号,是死的 不知道怎么修改


026         Integer[] weights = {3};


027  


028         // 获取socke连接池的实例对象


029         SockIOPool pool = SockIOPool.getInstance();


030  


031         // 设置服务器信息


032         pool.setServers( servers );


033         pool.setWeights( weights );


034  


035         // 设置初始连接数、最小和最大连接数以及最大处理时间


036         pool.setInitConn( 5 );


037         pool.setMinConn( 5 );


038         pool.setMaxConn( 250 );


039         pool.setMaxIdle( 1000 * 60 * 60 * 6 );


040  


041         // 设置主线程的睡眠时间


042         pool.setMaintSleep( 30 );


043  


044         // 设置TCP的参数,连接超时等


045         pool.setNagle( false );


046         pool.setSocketTO( 3000 );


047         pool.setSocketConnectTO( 0 );


048  


049         // 初始化连接池


050         pool.initialize();


051  


052         // 压缩设置,超过指定大小(单位为K)的数据都会被压缩


053         mcc.setCompressEnable( true );


054         mcc.setCompressThreshold( 64 * 1024 );


055     }


056     


057     /**


058      * 保护型构造方法,不允许实例化!


059      *


060      */


061     protected MemCached()


062     {


063         


064     }


065     


066     /**


067      * 获取唯一实例.


068      * @return


069      */


070     public static MemCached getInstance()


071     {


072         return memCached;


073     }


074     


075     /**


076      * 添加一个指定的值到缓存中.


077      * @param key


078      * @param value


079      * @return


080      */


081     public boolean add(String key, Object value)


082     {


083         return mcc.add(key, value);


084     }


085     


086     public boolean add(String key, Object value, Date expiry)


087     {


088         return mcc.add(key, value, expiry);


089     }


090     


091     public boolean replace(String key, Object value)


092     {


093         return mcc.replace(key, value);


094     }


095     


096     public boolean replace(String key, Object value, Date expiry)


097     {


098         return mcc.replace(key, value, expiry);


099     }


100     


101     /**


102      * 根据指定的关键字获取对象.


103      * @param key


104      * @return


105      */


106     public Object get(String key)


107     {


108         return mcc.get(key);


109     }


110     


111     public static void main(String[] args)


112     {


113         MemCached cache = MemCached.getInstance();


114         cache.add("hello", 234);


115         System.out.print("get value : " + cache.get("hello"));


116     }


117 }





    那么我们就可以通过简单的像main方法中操作的一样存入一个变量,然后再取出进行查看,我们可以看到先调用了add,然后再进行get,我们运行一次 后,234这个值已经被我们存入了memcached的缓存中的了,我们将main方法中红色的那一行注释掉后,我们再运行还是可以看到get到的 value也是234,即缓存中我们已经存在了数据了。

    对基本的数据我们可以操作,对于普通的POJO而言,如果要进行存储的话,那么比如让其实现java.io.Serializable接口,因为 memcached是一个分布式的缓存服务器,多台服务器间进行数据共享需要将对象序列化的,所以必须实现该接口,否则会报错的。比如我们写一个简单的测 试Bean如下:








01 class TBean implements java.io.Serializable


02 {


03     private static final long serialVersionUID = 1945562032261336919L;


04     


05     private String name;


06  


07     public String getName()


08     {


09         return name;


10     }


11  


12     public void setName(String name)


13     {


14         this.name = name;


15     }


16 }





    然后我们在main方法中加入如下几行代码:











1 TBean tb = new TBean();


2 tb.setName("铁木箱子");


3 cache.add("bean", tb);


4 TBean tb1 = (TBean)cache.get("bean");


5 System.out.print("name=" + tb1.getName());


6 tb1.setName("铁木箱子_修改的");


7 tb1 = (TBean)cache.get("bean");


8 System.out.print("name=" + tb1.getName());




    我们首先把TBean的一个实例放入缓存中,然后再取出来,并进行名称的修改,然后我们再取这个对象,我们再看其名称,发现修改的对象并不是缓存中的对 象,而是通过序列化过来的一个实例对象,这样我们就无须担心对原生类的无意修改导致缓存数据失效了,呵呵~~看来我也是多此一想啊。所以这表明从缓存中获 取的对象是存入对象的一个副本,对获取对象的修改并不能真正的修改缓存中的数据,而应该使用其提供的replace等方法来进行修改。


    以上是我在windows下对memcached的一点小学习和实践,在以后的项目开发过程中将会更深入的学习和应用这一缓存工具,也希望和有兴趣的同行一起讨论学习该工具的使用



分享到:
评论

相关推荐

    JAVA-memcached简单例子

    JAVA-memcached简单例子。

    memcached 的简单java实例

    java 开发的一个简单的memcached实例

    .Net下的Memcached使用

    一个简单的.Net使用Memcached的示例代码,采用Enyim做为客户端,将查询结果进行缓存,不含数据库,请参照代码建立数据库和一张简单的表,一百万条记录like检索由先前5000ms变为5ms,这个小例子体现了缓存在大型系统中...

    memcached程序,安装说明,以及简单代码实例

    memcached程序,安装说明,以及简单代码实例

    memcached java简单实例

    NULL 博文链接:https://stranger2008.iteye.com/blog/2042784

    memcached1

    下面从一个实际的例子来应用memcached。 首先到http://danga.com/memcached/下载memcached的windows版本和java客户端jar包,目前最新版本是memcached-1.2.1-win32.zip和java_memcached-release_1.6.zip,分别解压后...

    PHP 使用memcached简单示例分享

    在很多场合,我们都会听到 memcached 这个名字,但很多同学只是听过,...这里简单介绍一下,memcached 是高效、快速的分布式内存对象缓存系统,主要用于加速WEB动态应用程序。今天我们就先来简单探讨下memcached的用法

    Memcached的安装(包括所需文件和例子)

    1安装Memcached所需的文件;...3.运用Memcached的例子(需先按步骤把环境搭了,例子是vs2010环境下的,各位自行研究其方法);4.简单介绍Memcached的ppt。(其中例子和ppt是我们项目组内部培训用的,写的比较简单)

    php memcached缓存操作类

    实用缓存操作类,可根据需求实例不同的类 操作简单 实用

    Xmemcached memcached 实例

    类包括Xmemcached客户端实现和builder实现以及memcached client for java实现,对初学者有借鉴作用,特别是在开发简单例子时出现的超时情况的可以看看是否是同本事例相同。 xmemcached time out 5000 1000

    C++连接memcached服务的lib库,用vs2019打开sln工程文件直接可以编译取得lib库,简单方便实用,还有测试例子

    C++连接memcached服务的lib库,用vs2019打开sln工程文件直接可以编译取得lib库,简单方便实用,还有测试例子。适合运用C++操作memcached的开发工程师。

    php+Memcached实现简单留言板功能示例

    主要介绍了php+Memcached实现简单留言板功能,结合实例形式较为详细的分析了php结合memcached实现留言板的具体步骤与相关操作技巧,需要的朋友可以参考下

    Releases_MemCacheDManager_1_0_3_0.msi

    此实用工具的目的是减少你的管理任务时,部署和维护一个运行中的...不适用于非Windows Memcached的实例。 需要安装WMI来和所有的机器,你想管理运行。 需要在任何一台机器,你想管理的管理权限。 (模拟支持)。

    基于 Canal 的 MySql RabbitMQ Redis/memcached/mongodb

    6.保证对应关系的简单性:一个mysql表对应一个 redis实例(redis单线程,多实例保证分流不阻塞),关联关系数据交给接口业务 数据:mysql->binlog->MQ->redis(不过期、关闭RDB、AOF保证读写性能) (nosql数据仅用...

    ThinkPHP简单使用memcache缓存的方法

    本文实例讲述了ThinkPHP简单使用memcache缓存的方法。分享给大家供大家参考,具体如下: Thinkphp的默认缓存方式是以File方式,在/Runtime/Temp 下生成了好多缓存文件。 服务器装了memcached后想给更改成memecache...

    Memcahed协议简单实现代码

    一个在linux下实现Memcached命令的例子,用C++实现,并利用了libevent.

    mccli:简单的CLI实用程序,用于将一次性命令发送到Memcached实例

    一个简单的CLI实用程序,用于向Memcached服务器发出一次性命令 用法 Usage: mccli [-s server_ip] COMMAND Options: -s, --server Server address to connect to [default: "127.0.0.1"] -h, --help Show help ...

    libmemcached使用、测试及修改用例

    内含: libmemcached c/c++ ...在网络上查找了很久,基于C/C++的使用例子很少且简单,也并不能支持dead server的自动隔离和自动重连(源码存在些许“瑕疵”),对源码的修改涉及很少,对库的可靠性等并没有什么影响。

Global site tag (gtag.js) - Google Analytics