您的位置:首页 > 数据库 > Memcache

JAVA学习之Memcached

2020-07-18 11:40 1176 查看

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: