JAVA学习之Memcached
JAVA学习之Memcached
1、安装及命令
下载完成后,使用管理员运行cmd,进入memcached的目录下,即memcached.exe所在的目录
安装命令:memcached -d install
启动命令:memcached -d start
修改端口命令: memcached.exe -p 11211 -m 64 ( 指定它的监听端口是11211(这是它的默认端口,可以指定为其它大于1024的端口,因为小于1024的端口已经有了默认指定),最大使用内存为64m)
远程连接命令:telnet 127.0.0.1 11211 (注意:memcached默认的端口就是11211)
链接成功之后,可输入命令:
stats --> 查看状态
quit --> 退出链接
flush_all --> 刷新
存储命令的格式:
<command name> <key> <flags> <exptime> <bytes> <data block> 参数说明如下: <command name> set/add/replace <key> 查找关键字 <flags> 客户机使用它存储关于键值对的额外信息 <exptime> 该数据的存活时间,0表示永远 <bytes> 存储字节数 <data block> 存储的数据块(可直接理解为key-value结构中的value) 常用的几个命令:add/set/get/delete/gets/cas/replace
2、spring集成memcached过程
首先增加memcached的连接属性文件xmemcached.properties,代码如下:
#连接池大小即客户端个数
memcached.connectionPoolSize=1
memcached.failureMode=true
#server1
memcached.server1.host=127.0.0.1
memcached.server1.port=11211
memcached.server1.weight=1
然后增加spring对xmemcached的整合文件xmemcached.xml,代码如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.1.xsd"> <!-- properties config --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="order" value="1"/> <property name="ignoreUnresolvablePlaceholders" value="true"/> <property name="locations"> <list> <value>classpath:xmemcached.properties</value> </list> </property> </bean> <!-- Memcached配置 --> <!-- p:connectionPoolSize="${memcached.connectionPoolSize}" p:failureMode="${memcached.failureMode}" --> <bean id="memcachedClientBuilder" class="net.rubyeye.xmemcached.XMemcachedClientBuilder"> <constructor-arg> <list> <bean class="java.net.InetSocketAddress"> <constructor-arg> <value>${memcached.server1.host}</value> </constructor-arg> <constructor-arg> <value>${memcached.server1.port}</value> </constructor-arg> </bean> </list> </constructor-arg> <constructor-arg> <list> <value>${memcached.server1.weight}</value> </list> </constructor-arg> <property name="commandFactory" > <bean class="net.rubyeye.xmemcached.command.TextCommandFactory" /> </property> <property name="sessionLocator" > <bean class="net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator" /> </property> <property name="transcoder" > <bean class="net.rubyeye.xmemcached.transcoders.SerializingTranscoder" /> </property> <property name="connectionPoolSize" value="${memcached.connectionPoolSize}" /> <property name="failureMode" value="${memcached.failureMode}" /> </bean> <!-- Use factory bean to build memcached client --> <bean id="memcachedClient" factory-bean="memcachedClientBuilder" factory-method="build" destroy-method="shutdown" /> </beans>
然后在web.xml中增加对此配置文件的加载,代码如下:
<!-- 定义SPRING配置文件 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/conf/data-source.xml, <!--/WEB-INF/conf/dubbo/dubbo-source.xml,--> /WEB-INF/conf/memcached/xmemcached.xml </param-value> </context-param>
此时就可以使用spring容器中配置好的bean(memcachedClient)来连接memcached来存取值了,但是值得注意的是memcachedClient实例化真的是一个心酸的心路历程,首先我写了一个工具类,然后在工具类中利用注解自动注入memcachedClient这个bean,结果可想而知,在项目启动的时候,工具类都没有实例化,那它里边的memcachedClient更实例化不了了,每次都是空指针…,然后我就换了一种方式,把我存放相关memcached的一些工具方法写到了一个service中,增加了service的注解,然后使用set注入的方式来注入memcachedClient,依然没有成功,还是空指针…,一直以为是没有实例化到spring容器中,其实是因为set注入没有成功,并没有找到原因,工具业务类代码如下:
package com.privates.service.impl; import com.privates.comm.BaseComm; import com.privates.service.MemcachedService; import net.rubyeye.xmemcached.MemcachedClient; import net.rubyeye.xmemcached.exception.MemcachedException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.concurrent.TimeoutException; /** * @author renyf24249 * @version $ID: MemcachedUtils.java, v 2019/2/21 13:45 Exp $ */ @Service public class MemcachedServiceImpl extends BaseComm implements MemcachedService { private static final int TIME_OUT = 36000; @Autowired private MemcachedClient memcachedClient; @Override public void set(String key, Object value) { set(key, value, TIME_OUT); } @Override public void set(String key, Object value, Integer timeOut) { try { memcachedClient.set(key, timeOut, value); } catch (TimeoutException | InterruptedException | MemcachedException e) { log.error("set memcached error", e); } } @Override public Object get(String key) { try { return memcachedClient.get(key); } catch (TimeoutException | InterruptedException | MemcachedException e) { log.error("get memcached error", e); } return null; } @Override public void replace(String key, Object newValue) { replace(key, newValue ,TIME_OUT); } @Override public void replace(String key, Object newValue, Integer timeOut) { try { memcachedClient.replace(key, timeOut, newValue); } catch (TimeoutException | InterruptedException | MemcachedException e) { log.error("replace memcached error", e); } } @Override public void remove(String key) { try { memcachedClient.delete(key); } catch (TimeoutException | InterruptedException | MemcachedException e) { log.error("remove memcached error", e); } } }
然后就可以通过调用这个类中的方法操作memcached了。
3、memcached和redis的优缺点及区别
1.性能上:
性能上都很出色,具体到细节,由于Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比
Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起 Memcached,还是稍有逊色。
2.内存空间和数据量大小:
MemCached可以修改最大内存,采用LRU算法。Redis增加了VM的特性,突破了物理内存的限制。redis最大可以达到1GB,而memcache只有1MB
3.操作便利上:
MemCached数据结构单一,仅用来缓存数据,而Redis支持更加丰富的数据类型,也可以在服务器端直接对数据进行丰富的操作,这样可以减少网络IO次数和数据体积。
4.可靠性上:
MemCached不支持数据持久化,断电或重启后数据消失,但其稳定性是有保证的。Redis支持数据持久化和数据恢复,允许单点故障,但是同时也会付出性能的代价。
5.应用场景:
Memcached:动态系统中减轻数据库负载,提升性能;做缓存,适合多读少写,大数据量的情况(如人人网大量查询用户信息、好友信息、文章信息等)。
Redis:适用于对读写效率要求都很高,数据处理业务复杂和对安全性要求较高的系统(如新浪微博的计数和微博发布部分系统,对数据安全性、读写要求都很高)。
综上所诉,其实memached还是有自己的一些生存空间的,如果我们的目的仅仅是提高性能,而且是小数据量,读多写少,我相信memached完胜redis
- Memcached学习笔记 — 第四部分:Memcached Java 客户端-gwhalin(2)-性能测试
- Memcached学习二·Memcached客户端-Memcached-Java-Client
- 【学习】java、memcached、windows的配置及使用
- memcached高速缓存学习笔记003---利用JAVA程序操作memcached crud操作
- Memcached 入门学习三(java 连接Memcached)
- memcached学习——常用命令+基于java客户端的3种简单实现(二)
- Memcached学习笔记——windows上初步使用(与java结合)
- Memcached学习笔记 - 在JAVA中的应用
- JAVA缓存服务器Memcached学习
- memcached java Client学习
- Memcached学习笔记——windows上初步使用(与java结合)
- 学习Java前的准备。
- Java学习路径(二)书籍篇
- 新手如何学习java
- Java学习之神奇的i=i++
- JAVA学习笔记之Collection
- Java学习之神奇的i=i++
- Java学习之对象序列化(二)
- 新手如何学习java
- Java学习从入门到精通[原创]