大家好,我是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.youkuaiyun.com/weixin_41910244/article/details/80412209
8.更多讨论
今天的分享就到这里啦,欢迎大家提问和探讨!