首页 > 其他分享 >Memcached在项目中的应用

Memcached在项目中的应用

时间:2023-11-08 16:07:13浏览次数:28  
标签:缓存 word 应用 项目 memcached key Memcached pool


 Memcached是一个开源的快速分布式缓存框架,它和ehcached等缓存框架相比,具有下面的一些优势:

1、 跨jvm的缓存架。我们知道,在一个jvm进程中,一般情况下的有效内存利用最多为2G,如果你再把数据缓存在项目的jvm进程中,势必造成内存空间的紧 缺,严重的时候会出现堆栈溢出面导致项目终止运行。

2、 集群环境下的缓存框架。Memcached启动后,有自己的独立IP地址及端口号(默认是11211,当然你可以更改),因此,在集群环境下或不同的几个 项目间,都可以访问缓存服务器中的数据,非常的方便。

下面我们一起来看一看笔者在最近的一个项目中,是如何使用memached的。

一、安装memcached缓存服务器

如果你用的是windows服务器系统,请到http://jehiah.cz/projects/memcached-win32/下载,点其中的 exe可执行文件,Memcached就完成了启动,非常的简单。

如果你使用的是linux server,你需要如下的操作(以ubuntu为例):

$ sudo apt-get install memcached(安装)

$ memcached -d -m 50 -p 11211 -u root(启动)

上面命令行参数说明:-m 指定使用多少兆的缓存空间;-p 指定要监听的端口; -u 指定以哪个用户来运行,默认情况下,会在本机的11211端口监听操作连接,你可以通过netstat –ant查看memcached是否已经正常运行。

你也可以通过修改/etc/default/memcached配置文件,将ENABLE_MEMCACHED=yes,让系统启动时,自动运行 memcached,省去了每次都要手式启动的繁琐步骤。

二、下载memcached的java访问客户端。下载地址:http://github.com/gwhalin/Memcached-Java-Client/downloads,将压缩包中的java_memcached-release_2.5.1.jar放到你的工程目录中。

如果你是用的PHP,Ruby等,也可在网上找到相应的访问Memcached模块及示例代码。

三、在java程序中的访问。

首先要强调一下,放入memcached中缓存的对象,必须以键值对(key/value)的方式放入,取的时候根据key来取,但memcached有 几个自己的特殊要求:key必须为String,即字符串类型;而要缓存的对象必须要实现Serializable序列化接口。

本人之前的一个项目中,当用户将鼠标停留到某个单词上时,系统要弹出该单词的解释及音标,由于项目组在开发时并没有 找到一套合适的词库,我们的解决思路是:当有用户查询时,服务器向第三方翻译网站提交单词,再从返回的结果中解析出单词解释及发音。此查询过程相当费时, 且在网络状态不好时表现不佳,但在当时这也许是最好的解决办法了。

Word对象是我们封装的单词音标及解释对象,该对象实现Serializable接口。当用户查询某个单词时,我们先会在Memcached缓存中查 找,如果没有找到,则向数据库查询,如果数据库中也没有找到,再向第三方翻译网站提交,得到结果后返回给用户后,同时要把该单词存入数据库,同时放入 Memcached缓存,下次有用户查询同样的单词时,效率将会得到非常大的提升。系统得到一个单词翻译的代码如下

public Word getWordTranslate(String aWord) {

// 先从缓存中取
Word word = getWordFromCache(aWord);
  if (word != null) {
  
  return word;

}

//从数据库中取
word = wordDao.getWord(aWord);

if (word != null) {

  //放入缓存
  
  MemcachedAdapter.add(aWord, word);;
  
  return word;

}


//从网上查词
word = translateWordFromWebSite(aWord);

if (! "e".equals(tv.getWords())) {

  //存入数据库
  saveWord(word);
  //放入缓存
  MemcachedAdapter.add(aWord, word);

}

return word;

}



Memcached操作代码如下,其中的一些连接参数,你可以根据你的情况进行修改。



public class MemcachedAdapter {


protected static MemCachedClient mcc = new MemCachedClient();


static {

  SockIOPool pool = SockIOPool.getInstance();
 
  pool.setServers(new String[]{"127.0.0.1:11211"});
  
  Integer[] weights = { 3 };
  
  pool.setWeights( weights );
  
  pool.setInitConn( 5 );
  
  pool.setMinConn( 5 );
  
  pool.setMaxConn( 250 );
  
  pool.setMaxIdle( 1000 * 60 * 60 * 6 );
  
  pool.setMaintSleep( 30 );
  
  pool.setNagle( false );
  
  pool.setSocketTO( 3000 );
  
  pool.setSocketConnectTO( 0 );
  
  pool.initialize();


}


public static Object get(String key) {

  return mcc.get(key);

}


public static boolean set(String key, Object o) {
  return mcc.set(key, o);

}


public static boolean add(String key, Object o) {

  return mcc.add(key, o);

}


public static boolean replace(String key, Object o) {

  return mcc.replace(key, o);

}


public static boolean delete(String key) {

  return mcc.delete(key);

}


}




项目上线前,我们对单词翻译部分进行了压力测试,在很多用第一次查询某个单词的时候,速度很慢,但系统运行一段时候后,由于常用单词都在Memcached中 进行了缓存,速度上就基本就存在问题了。



最后还有一个问题要考虑,就是在操作系统重新启动后,Memcached中缓存的数据将不再存在,为了效率考虑,你可以在应用服务器启动时,将所有的单词 对象全部读出,再添加到Memcahced中。

标签:缓存,word,应用,项目,memcached,key,Memcached,pool
From: https://blog.51cto.com/u_809530/8255867

相关文章

  • 【安全测评/等保要求】金蝶V9/V10 “Apusic应用服务器未授权目录遍历” server_file
    最近网安不定时扫描,我们服务器的金蝶AAS中间件V9版本,被扫出了“Apusic应用服务器未授权目录遍历”server_file漏洞,我们先来回顾一下出现的问题: 漏洞页面https://www.xxx.com:1234/sso/..;/admin/protected/selector/server_file/files?folder=/etc/测试过程发现金......
  • Maven项目导入依赖报错问题的解决
    问题描述在我尝试将下面这个依赖加载到Maven项目中时:<!--https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client--><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version&......
  • 鸿蒙原生应用开发-DevEco Studio超级终端模拟器的使用
    一、了解超级终端模拟器支持的设备情况该特性在DevEcoStudioV2.1Release及更高版本中支持。目前超级终端模拟器支持“Phone+Phone”、“Phone+Tablet”和“Phone+TV”的设备组网方式,开发者可以使用该超级终端模拟器来调测具备跨设备特性的应用/服务,如应用/服务在不同设备间的流......
  • tomcat 配置ip地址访问不用加端口和项目名
    主要配置tomcat/conf目录下的server.xml文件1、先找到8080端口,把端口改为80。<!--A"Connector"representsanendpointbywhichrequestsarereceivedandresponsesarereturned.Documentationat:JavaHTTPConnector:/docs/config/http.html(bl......
  • Springboot项目出现Error resolving template [index]的解决方法
    在SpringBoot中遇到模板文件不存在的问题在SpringBoot开发中,有时候会遇到Errorresolvingtemplate[index],templatemightnotexist这个错误,一般来说,这个错误可能有以下几种原因:模板文件路径错误:需要确认模板文件是否存在,并且其路径是否正确。通常模板文件的路径应该是class......
  • 区块链技术在跑腿服务中的应用与App系统开发
    区块链技术为跑腿服务App系统带来了新的可能性,如支付安全、合同自动化、透明性等。本文将介绍如何在一个简单的跑腿服务App系统中应用区块链技术。智能合约智能合约是区块链的核心概念之一。它是在区块链上运行的自动化合同,可以自动执行、管理和验证合同条款。Solidity语言示例以......
  • 使用 TortoiseGit 在两个项目之间共享代码(cherry-pick)
    需求:项目A需要新增项目B的部分代码,要求不变更commitmessage信息做法项目A新增上游Remote,RemoteURL为项目B的URL新增方式:依次点击项目A文件夹内右键→TortoiseGit→Settings→Git→Remote,输入上游名称和URL点击确定后,TortoiseGit会询问是否为其禁用T......
  • SAE 2.0,让容器化应用开发更简单
    云原生容器化应用托管模式的演变云原生这个概念从提出,到壮大,再到今天的极大普及,始终处于一个不断演进和革新的过程中。云原生体系下应用的托管形态是随着企业应用架构在不断演进的。最早的应用大多是集中式、单体式的,应用通过优雅的分层来实现领域模型的共享和更细致的模块拆分。......
  • Unity项目开发中如何做资源加密
    Unity的游戏很容易被人反编译出来,然后再重新打包发布,把自己辛辛苦苦开发的游戏,抄写的一丝不挂。很多项目要求要做好资源加密,Unity中如何做好资源加密呢?本文給大家分享加密算法+资源打包整合思路:(1) 游戏资源加密如何选择加密算法;(2) Assetsbundle资源包的加密与解密;  ......
  • 系统安全及应用
    系统账号基本措施将非登录用户的shell设为/sbin/nologin锁定长期不适用的账号(passwd-l/usermod-L)删除无用的账号锁定账号文件passwd,shadowchattrchattr+iaa#给aa文件一个不可删除状态cahtte-iaa#将aa文件的不可删除状态撤销掉 #给了aa的i权限无法删除 #把a......