最近一直在做一个项目的前期设计工作,考虑到后期系统的扩展和性能问题也找了很多解决方法,有一个就是用到了数据库的缓存工具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 -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;
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);
}
/**保护型构造方法,不允许实例化!
* @类名:MemCached.java
* @描述:TODO
* @
*/
protected MemCached()
{
}
/**
* @方法功能说明:获取唯一实例
* @修改者名字:马铁利
* @修改时间:Feb 10, 2012 2:11:20 PM
* @修改内容:
* @参数:@return
* @return:MemCached
* @throws
*/
public static MemCached getInstance()
{
return memCached;
}
/**
* @方法功能说明:添加一个指定的值到缓存中.
* @修改者名字:马铁利
* @修改时间:Feb 10, 2012 2:07:17 PM
* @修改内容:
* @参数:@param key
* @参数:@param value
* @参数:@return
* @return:boolean
* @throws
*/
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);
}
/**
* @方法功能说明:替换
* @修改者名字:马铁利
* @修改时间:Feb 10, 2012 2:06:51 PM
* @修改内容:
* @参数:@param key
* @参数:@param value
* @参数:@return
* @return:boolean
* @throws
*/
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);
}
/**
* @方法功能说明:删除缓存中的值
* @修改者名字:马铁利
* @修改时间:Feb 10, 2012 2:09:07 PM
* @修改内容:
* @参数:@param key
* @参数:@return
* @return:boolean
* @throws
*/
public boolean delete(String key){
return mcc.delete(key);
}
/**
* @方法功能说明:根据指定的关键字获取对象.
* @修改者名字:马铁利
* @修改时间:Feb 10, 2012 2:08:48 PM
* @修改内容:
* @参数:@param key
* @参数:@return
* @return:Object
* @throws
*/
public Object get(String key)
{
return mcc.get(key);
}
}
在下载的jar中包含源码,可以自己关联下,然后读下相关源码。
测试类
Java代码 收藏代码
package utils.test;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import utils.cache.MemCached;
import utils.pojo.Student;
public class Test {
public static void main(String[] args) {
MemCached mc = MemCached.getInstance();
//测试缓存基本数据
mc.add("hello", "马铁利的第一个memcached");
System.out.println(mc.get("hello"));
mc.delete("hello");
mc.add("hello", "马铁利的第二个memcached");
System.out.println(mc.get("hello"));
mc.add("h", "121212", new Date());//奇怪,为什么加上日期后放不到缓存中去呢?调试一下放进去了,结果注释掉本行的时候,获得不到缓存中的值?
System.out.println(mc.get("h"));
//测试缓存pojo(注:pojo类必须要序列化)
Student s =new Student();
s.setName("matieli");
s.setAge(25);
mc.add("matieli", s);
System.out.println("pojo存储!");
Student s1=(Student)mc.get("matieli");
System.out.println("matieli对象的名字:"+s1.getName());
System.out.println("matieli对象的年龄:"+s1.getAge());
//测试缓存List<pojo>
mc.delete("list");//memcache的add方法不像list map 一样,要想修改值,使用replace或delete
Student tom =new Student();
tom.setName("Tom");
tom.setAge(56);
Student jack =new Student();
jack.setName("jack");
jack.setAge(54);
List<Student> list =new ArrayList<Student>();
list.add(jack);
list.add(tom);
mc.add("list", list);
List<Student> list1=(List<Student>)mc.get("list");
for (Student stu : list1) {
System.out.println(stu.getName());
System.out.println(stu.getAge());
System.out.println("-------------");
}
}
}
pojo实体类
Java代码 收藏代码
package utils.pojo;
public class Student implements java.io.Serializable {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
以上是我在windows下对memcached的一点小学习和实践,在以后的项目开发过程中将会更深入的学习和应用这一缓存工具,也希望和有兴趣的同行一起讨论学习该工具的使用~~
修改端口:
可以直接修改注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached Server\下的ImagePath为
"x:\xxx\memcached.exe" -p 端口 -m 内存 -d runservice
分享到:
相关推荐
Memcached介绍、应用场景、运行机制 Memcached安装 Memcached启动,参数 ...Memcached的Java客户端实例 Memcached的客户端分布式原理 Memcached的服务器端运行原理 Memcached的过期机制 Memcached同比 QA
本文较为详细的讲述了php下Memcached的入门知识与实例。分享给大家供大家参考。具体如下: memcache 在什么情况下被使用,什么情况下不要使用? 你在何时应该使用 memcache,又要在何时避免使用它?现在你已经知道了,...
该指南涵盖了云数据库Memcache版的基本概念、快速入门、基本操作、故障处理和高级主题等方面的内容。 云数据库Memcache版概述: 云数据库Memcache版是阿里云提供的一种基于Memcache协议的高性能NoSQL数据库,旨在...
2. **连接与操作**: 客户端库提供了连接到Memcache服务器的方法,如创建MemcachedClient实例。通过这个实例,你可以执行增删查改操作,例如`client.set(key, timeout, value)`用于设置键值对,`client.get(key)`用于...
这个示例中,你需要提供阿里云Memcache实例的主机名(形如`xxxxxxxx.m.yyyyyyyyyy.ocs.aliyuncs.com`)以及相应的用户名和密码来建立连接。 总的来说,阿里云的云数据库Memcache服务为开发者提供了一种高效、便捷的...
3. **快速入门**:这部分可能涵盖创建Memcache实例、配置参数、连接实例以及进行基本操作的步骤。用户可以通过阿里云控制台或API接口来创建和管理Memcache实例。 4. **功能特性**:可能包括高可用性、自动备份、...
最后,为了更好地理解和使用ThinkPHP框架下的Memcache缓存功能,建议参考更多ThinkPHP相关内容的教程和专题,如《ThinkPHP入门教程》、《ThinkPHP模板操作技巧总结》等,这些资源可以帮助开发者更加全面地掌握...
3. **分布式架构**:Memcache支持多实例部署,可以将数据分散到多个服务器上,实现负载均衡,提高系统的可扩展性。 4. **自动过期**:为了解决数据的持久化问题,Memcache允许设置每个缓存项的过期时间,过期后自动...
"快速入门"则为初次使用者提供了快速部署和使用Memcache的简明教程,包括创建实例、配置参数、连接数据库、管理数据等基本操作。 此外,文档可能还会深入到高级功能,如性能优化、监控与报警、备份与恢复、安全策略...
`java_memcache`相关的JAR文件通常包含了Java Memcached客户端库,如Xmemcached或spymemcached,这些库提供了API,让Java开发者能够方便地在Java应用中集成和使用Memcached服务。 在Windows环境下部署和使用...
除了法律声明和通用约定,指南还包括了产品介绍、使用教程、操作步骤、API参考等内容,帮助用户从快速入门到深入使用全面掌握云数据库Memcache服务。 6. **操作指导**: - 指南可能包含如何创建和管理Memcache...
3. **快速入门**: 介绍了如何创建和管理KVStore for Memcache实例,包括实例的创建、配置和连接。 4. **操作指南**: 提供详细的操作步骤,包括数据导入导出、监控与报警设置、安全策略配置等。 5. **API参考**: 列出...
初始化完成后,你可以在任何需要的地方通过`Zend_Registry`获取`$memcache`实例。例如,在`IndexController`的`indexAction()`中,我们从缓存中加载或存储友情链接数据: ```php $memcache = Zend_Registry::get('...
接下来,我们需要创建一个分布式处理函数,如`addServer`,来逐个添加这些服务器到MemCache实例: ```php foreach ($options['servers'] as $server) { $this->handler->$func($server['ip'], $server['port']); }...
- Memcache和APC扩展模块:这些缓存插件在提高项目性能时非常有用。 - DOM、Mcrypt、SOAP和GD扩展模块:虽然不是必须的,但在某些功能实现中可能需要。 #### 二、创建Yii项目实例 **2.1 创建新Yii程序骨架** - ...
Prometheus 入门讲解 Prometheus 是一个开源的监控系统,主要用于收集和存储时间序列数据。下面是对 Prometheus 的基本原理、组件介绍、工作过程、数据类型等方面的详细讲解。 基本原理 Prometheus 的核心是时序...
## 一、Memcached简介与使用入门 ### 1.1 Memcached概述 Memcached是一种高性能的分布式内存对象缓存系统,用于减轻数据库负载,加速动态Web应用,提高网站访问速度。其通过缓存数据库查询结果减少数据库访问次数...
入门你应该有: MySQL数据库(可选)可用的Memcached实例。 一个空的Sinatra应用程序班级达尔Dal实例为特定MySQL表提供DAL层,包括使用密钥有效期通过Memcached缓存进行的可选写操作。 要使用CrudService::Dal ,请...
本文还提到了一些与Yii框架及PHP开发相关的专题,比如Yii框架入门技巧、php优秀开发框架的总结、Smarty模板的入门基础教程、PHP缓存技术的总结、PHP面向对象程序设计的入门教程、PHP字符串的用法总结、PHP和MySQL...