Memcache的简单介绍

大家好,我是IT修真院武汉分院第15期学员,一枚正直善良的JAVA程序员。

今天给大家分享一下,修真院官网JAVA任务6中需要使用的Memcache



1.背景介绍

MemCache是一个自由、源码开放、高性能、分布式的内存对象缓存系统,用于动态Web应用以减轻数据库的负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度。



2.知识剖析


Memcache通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。其本质上就是一个内存key-value数据库,但是不支持数据的持久化,服务器关闭之后数据全部丢失


Memcache的实现原理

memcache处理的原子是每一个key、value,key会通过一个hash表转换成hash的key,便于查找对比以及尽可能的做到散列。 memcache有两个核心组件:服务端和客户端。

在一个memcache组件查询中,client先通过key的hash值来确定kv在service端的位置,当server端确定后,客户端就会发一个请求到server端。 让它来查找出确切数据,因为这之间没有交互以及协议,因此memcache带给网络的影响最小。


memcached存储方式

为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。另外,内容容量达到指定值之后,就基于LRU算法自动删除不使用的缓存。memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。


常用命令

add -- 新增一个kv到Memcache服务器上

set -- 保存数据到Memcache服务器上

get --提取一个保存在Memcache服务器上的数据

replace --替换一个已经存在Memcache服务器上的项目

delete -- 从Memcache服务器上删除一个保存的项目

flush -- 刷新所有Memcache服务器上保存的项目





3.常见问题


1.Memcache和memcached区别?

2.memcache如何储存java对象?

3.memcached对java客户端有哪几种,各有什么优缺点?



4.解决方案

回答一:Memcache是这个项目的名称,而memcached是它服务器端的主程序文件名。 一个是项目名称,一个是主程序文件名(守护进程)。


回答二:memcache是通过序列化和反序列化来储存java对象的


回答三:Memcached的客户端目前有3种:Memcached Client for Java, SpyMemcached, XMemcached。

Memcached Client for Java:较早推出的memcached JAVA客户端API,应用广泛,运行比较稳定

SpyMemcached:支持异步,单线程的memcached客户端,用到了java1.5版本的concurrent和nio,存取速度会高于前者,但是稳定性不好,测试中常报timeOut等相关异常。

XMemcached同样是基于java nio的客户端,java nio相比于传统阻塞io模型来说,有效率高(特别在高并发下)和资源耗费相对较少的优点。传统阻塞IO为了提高效率,需要创建一定数量的连接形成连接池,而nio仅需要一个连接即可(nio也是可以做池化处理),相对来说减少了线程创建和切换的开销,这一点在高并发下特别明显。因此XMemcached与Spymemcached在性能都非常优秀,在某些方面(存储的数据比较小的情况下)Xmemcached比Spymemcached的表现更为优秀。



5.编码实战

Spring中配置:

<bean id="memcachedClientBuilder" class="net.rubyeye.xmemcached.XMemcachedClientBuilder"
      p:connectionPoolSize="${memcached.connectionPoolSize}" p:failureMode="${memcached.failureMode}">
    <constructor-arg>
        <list>
            <bean class="java.net.InetSocketAddress">
                <constructor-arg>
                    <value>${server1.memcached.host}</value>
                </constructor-arg>
                <constructor-arg>
                    <value>${server1.memcached.port}</value>
                </constructor-arg>
            </bean>
        </list>
    </constructor-arg>
    <constructor-arg>
        <list>
            <value>${server1.memcached.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>
</bean>

<!--创建缓存客户端-->
<bean id="memcachedClient" factory-bean="memcachedClientBuilder"
      factory-method="build" destroy-method="shutdown" />

配置文件:

memcached.connectionPoolSize=10
memcached.failureMode=true

#server1
server1.memcached.host=127.0.0.1
server1.memcached.port=11211
server1.memcached.weight=4

接口代码:

@Autowired
MemcachedClient memcachedClient;
@Override
public Integer queryWork(Integer isWork) throws Exception {
   Integer isWorks = memcachedClient.get(String.valueOf(isWork));
   if (isWorks!=null){
      return isWorks;
   }
   isWorks = dao.queryWork(isWork);
   memcachedClient.set(String.valueOf(isWork),900,isWorks);
   return isWorks;
}



6.扩展思考


memcache和redis有什么区别


什么是redis?

Redis是一个单线程, 开源的使用C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。Redis最大的瓶颈是机器内存或者网络带宽。


区别

1.Redis是单线程,而Memcached是多线程

2. redis有部份存在硬盘上,这样能保证数据的持久性,支持数据的持久化.而memecache 把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小

3.redis在数据支持上要比memecache多,Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。


7.参考文献

参考一:http://www.runoob.com/memcached/memcached-tutorial.html


参考二:https://blog.csdn.net/weixin_41910244/article/details/80412209


8.更多讨论

今天的分享就到这里啦,欢迎大家提问和探讨!

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页