第一章 memcached简介

1.1为什么引入memcached

随着数据量的增大,访问的集中,REBMS负担加重,数据库响应恶化。

Memcached是高性能的分布式内存缓存服务器,目的是通过缓存数据库查询结果,减少数据库的访问次数,以提高动态web应用的速度,提高扩展性。

1.2memcached作为高速运行的分布式缓存服务器具有的特点

具有以下特点:

(1)协议简单:基于文本的协议,最终使用二进制协议代替文本协议,提高memcached的性能,减少文本协议漏洞。从1.3版本开始支持二进制协议。

(2)基于libevent的事件处理:所以能在linux、BSD、Solaris等操作系统上发挥其高性能。

(3)内置内存存储方式:memcached保存的数据都存储在memcached内置的内存存储空间中,重启memcached或重启系统,都会导致数据全部消失。几户不占用CPU。

(4)memcached不互通信的分布式:memcached尽管是分布式缓存服务器,但是服务器端并没有分布式功能。各个memcached不会互相通信以共享信息。他的分布式主要是通过客户端来实现。

第二章 memcached内存管理

2.1 Slab Allocator内存管理

Memcached采用Slab Allocator来进行内存管理。

Slab Allocator基本原理:按照预先规定的大小,将分配的内存分割成特定长度的块。已完全解决内存碎片问题。

Slab Allocator缺点:由于分配的是特定长度的内存,因此无法有效利用分配的内存。例如将100字节的数据缓存到128字节的chunk中,剩余的28字节就浪费了。可以通过growth factor选项,调节slab class大小的差别。

2.2 memcached中的数据删除

删除数据时并不会真正从memcached中消失,memcached也不会释放已分配的内存。记录超时后,客户端无法查看该记录(透明的),其存储空间即可重复利用。

Memcached采用的是lazy expiration,内部不会监视记录是否过期,而是get时查看记录的时间戳,检查记录是否过期。

缓存容量满时的删除机制,需要考虑多种机制。一方面是按队列机制,一方面应该对应缓存对象本省的优先级,根据缓存对象的优先级进行对象的删除。

第三章 memcached分布式

3.1memcached分布式

Memcached虽然称为分布式缓存服务器,但是服务器端并没有分布式功能。Memcached的分布式完全由客户端实现。

例如:下面假设memcached服务器有node1~node3三台,应用程序要保存键名为“tokyo”“kanagawa”“chiba”“saitama”“gunma” 的数据。

首先向memcached中添加“tokyo”。将“tokyo”传给客户端程序库后,客户端实现的算法就会根据“键”来决定保存数据的memcached服务器。服务器选定后,即命令它保存“tokyo”及其值。同样,“kanagawa”“chiba”“saitama”“gunma”都是先选择服务器再保存。

接下来获取保存的数据。获取时也要将要获取的键“tokyo”传递给函数库。函数库通过与数据保存时相同的算法,根据“键”选择服务器。使用的算法相同,就能选中与保存时相同的服务器,然后发送get命令。只要数据没有因为某些原因被删除,就能获得保存的值。

这样,将不同的键保存到不同的服务器上,就实现了memcached的分布式。 memcached服务器增多后,键就会分散,即使一台memcached服务器发生故障无法连接,也不会影响其他的缓存,系统依然能继续运行。

第四章 缓存多副本

4.1缓存失效情况

(1)缓存超时被移除

(2)缓存由于存储空间限制被移除

(3)由于缓存节点变化而导致的缓存失效

4.2缓存多副本作用

缓存多副本主要是用于在缓存数据时存放缓存的多个副本,以防止缓存失效,同时,缓存多个副本可以作分布式并行读。

第五章 缓存的一致性问题

5.1缓存的一致性问题

对于读的情况下,如果存在数据变化,一种是同时更新缓存和数据库,另一种是直接对缓存进行失效处理。

缓存数据尽量只读,缓存本省不适合大量写和更新操作的数据场景。

第六章 memcached与spring整合

Memcached在项目中使用有两种方式,一种是使用工具类进行操作,另外一种是通过配置application.xml文件来进行操作。不论哪种方式,都需要先安装memcached.exe,启动服务后才可以在项目中进行操作。

6.1memcached.exe安装

(1)安装memcached.exe,解压后放在c盘的memcached文件下。

(2)cmd下,安装memcached

c:/memcached/memcached.exe –d install

(3)cmd下,启动memcached服务

c:/memcached/memcached.exe –d start

6.2使用工具类进行操作

(1)引入java_memcached-release_2.0.1.jar

(2)编写memcached工具类

 package com.cmcc.core.Util; 

 import java.util.Date;

 import com.danga.MemCached.MemCachedClient;

 import com.danga.MemCached.SockIOPool;

 public class MemcachedUtil {

     protected static MemCachedClient mcc = new MemCachedClient();

     protected static MemcachedUtil memCached = new MemcachedUtil();

     static {

        String[] servers = { "127.0.0.1:11211" };

        Integer[] weights = { 3 };

        //获取连接池的实例

        SockIOPool pool = SockIOPool.getInstance();

        //设置连接服务器和权重

        pool.setServers(servers);

        pool.setWeights(weights);

        pool.setInitConn(5);//设置初始连接数

        pool.setMinConn(5);//设置最小连接数

        pool.setMaxConn(250);//设置最大连接数

        pool.setMaxIdle(1000 * 60 * 60 * 6);//设置最大处理时间

        pool.setMaintSleep(30);//设置连接池守护线程的睡眠时间

        //设置TCP参数,连接超时

        pool.setNagle(false);

        pool.setSocketTO(3000);

        pool.setSocketConnectTO(0);

        //初始化并启动线程池

        pool.initialize();

        //压缩设置,超过指定大小的都压缩

        mcc.setCompressEnable(true);

        mcc.setCompressThreshold(64 * 1024);

     }

     /**

      * 构造函数

      *

      */

     protected MemcachedUtil() {

     }

     /**

      * 获取memcached实例

      *

      * @return

      */

     public static MemcachedUtil getInstance() {

        return memCached;

     }

     /**

      * 退出

      */

     public static void shutDown() {

        memCached.shutDown();

     }

     /**

      * 添加

      *

      * @param key

      * @param value

      * @return

      */

     public boolean add(String key, Object value) {

        return mcc.add(key, value);

     }

     public boolean add(String key, Object value, Date expiry) {

        return mcc.add(key, value, expiry);

     }

     public boolean replace(String key, Object value) {

        return mcc.replace(key, value);

     }

     public boolean replace(String key, Object value, Date expiry) {

        return mcc.replace(key, value, expiry);

     }

     /**

      * 根据键取值

      *

      * @param key

      * @return

      */

     public Object get(String key) {

        return mcc.get(key);

     }

     public static void main(String[] args) {

        MemcachedUtil cache = MemcachedUtil.getInstance();

        cache.add(" hello ", 234);

        System.out.print(" get value :  " + cache.get(" hello "));

     }

 }

(3)如果需要缓存自定义对象,则该类必须实现Serializable接口。

6.3 spring配置文件中进行配置

(1)引入java_memcached-release_2.0.1.jar

(2)编写memcache.properties文件

memcache.server=127.0.0.1:11211

memcache.weights=1

memcache.initConn=1

memcache.minConn=1

memcache.maxConn=50

memcache.maintSleep=3000

memcache.nagle=false

memcache.socketTO=3000

(3)修改spring配置文件

 <!-- 数据库配置文件读取 -->

 <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 

     <property name="order" value="1"/> 

     <property name="ignoreUnresolvablePlaceholders" value="true"/>

     <property name="locations"> 

         <list> 

             <value>classpath:com/cmcc/core/Config/database.properties</value>

             <value>classpath:com/cmcc/core/Log/memcache.properties</value>

         </list> 

       </property>

 </bean>
 <!-- memecached配置 -->

 <bean id="memcachedPool" class="com.danga.MemCached.SockIOPool" factory-method="getInstance"

       init-method="initialize" destroy-method="shutDown">

        <constructor-arg><value>memCachedPool</value></constructor-arg>

        <property name="servers"><list><value>${memcache.server}</value></list></property>

        <property name="weights"><list><value>${memcache.weights}</value></list></property>

        <property name="initConn"><value>${memcache.initConn}</value></property>

        <property name="minConn"><value>${memcache.minConn}</value></property>

        <property name="maxConn"><value>${memcache.maxConn}</value></property>

        <property name="maintSleep"><value>${memcache.maintSleep}</value></property>

        <property name="nagle"><value>${memcache.nagle}</value></property>

        <property name="socketTO"><value>${memcache.socketTO}</value></property>

 </bean>

 <bean id="memCacheClient" class="com.danga.MemCached.MemCachedClient">

         <constructor-arg><value>memCachedPool</value></constructor-arg>

 </bean>

(4)在业务逻辑中可以直接自动注入使用memCacheClient操作。

一篇文章让你了解并掌握memcached的更多相关文章

  1. 还分不清 Cookie、Session、Token、JWT?一篇文章讲清楚

    还分不清 Cookie.Session.Token.JWT?一篇文章讲清楚 转载来源 公众号:前端加加 作者:秋天不落叶 什么是认证(Authentication) 通俗地讲就是验证当前用户的身份,证 ...

  2. 一篇文章带你了解NoSql数据库——Redis简单入门

    一篇文章带你了解NoSql数据库--Redis简单入门 Redis是一个基于内存的key-value结构数据库 我们会利用其内存存储速度快,读写性能高的特点去完成企业中的一些热门数据的储存信息 在本篇 ...

  3. 一篇文章让Oracle程序猿学会MySql【未完待续】

    一篇文章让Oracle DB学会MySql[未完待续] 随笔前言: 本篇文章是针对已经能够熟练使用Oracle数据库的DB所写的快速学会MySql,为什么敢这么说,是因为本人认为Oracle在功能性方 ...

  4. 由一篇文章引发的思考——多线程处理大数组

    今天领导给我们发了一篇文章文章,让我们学习一下. 文章链接:TAM - Threaded Array Manipulator 这是codeproject上的一篇文章,花了一番时间阅读了一下.文章主要是 ...

  5. 一篇文章告诉你为何GitHub估值能达20亿美元

    软件开发平台GitHub今日宣布,已获得硅谷多家知名风投2.5亿美元融资,这也让其融资总额达到了3.5亿美元,此轮融资对GitHub的估值约为20亿美元. GitHub有何特别之处? GitHub创立 ...

  6. DEDECMS教程:上/下一篇文章标题长度的截取方法

    对dedecms了解的朋友们,想必对如何获取上一篇.下一篇文章的标签也是非常熟悉.dedecms获取上一篇.下一篇文章的标签分别为:{dede:prenext get='pre'/}.{dede:pr ...

  7. Android:学习AIDL,这一篇文章就够了(下)

    前言 上一篇博文介绍了关于AIDL是什么,为什么我们需要AIDL,AIDL的语法以及如何使用AIDL等方面的知识,这一篇博文将顺着上一篇的思路往下走,接着介绍关于AIDL的一些更加深入的知识.强烈建议 ...

  8. Android:学习AIDL,这一篇文章就够了(上)

    前言 在决定用这个标题之前甚是忐忑,主要是担心自己对AIDL的理解不够深入,到时候大家看了之后说——你这是什么玩意儿,就这么点东西就敢说够了?简直是坐井观天不知所谓——那样就很尴尬了.不过又转念一想, ...

  9. 一篇文章一张思维导图看懂Android学习最佳路线

    一篇文章一张思维导图看懂Android学习最佳路线 先上一张android开发知识点学习路线图思维导图 Android学习路线从4个阶段来对Android的学习过程做一个全面的分析:Android初级 ...

随机推荐

  1. New Concept English three (35)

    27 55 The word justice is usually associated with courts of law. We might say that justice has been ...

  2. ndoutils_mq项目: 发送Nagios的性能、报警、配置文件到RabbitMQ

    本人目前开发的一个项目,改造ndoutils,主要是它的ndomod. 将性能.报警.配置文件使用JSON格式发送到RabbitMQ. 由于NEB(Nagios Event Broker)使用C开发, ...

  3. 深度学习实战-----0001(移植反向传播Python to c++)

    1. https://mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/  老外教程 2. https://github. ...

  4. easyui1.4 汉化出问题

    easyui 1.4 的textbox 验证汉化不了,需要在easyui-lang-zh_CN.js 加入 if ($.fn.textbox){ $.fn.textbox.defaults.missi ...

  5. NOIP模拟题 友好国度

    题目大意 给定一棵树,每个点有点权,求有多少组点对满足两点简单路径上的所有点点权的$gcd=1$. $n,val_i\leq 10^5$ 题解 考虑设$G_i$表示简单路径上所有点点权均为$i$的倍数 ...

  6. HihoCoder - 1615矩阵游戏II(贪心)

    矩阵游戏II 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个NxN的整数矩阵,小Hi每次操作可以选择两列,将这两列中的所有数变成它的相反数. 小Hi可以进行任意 ...

  7. HihoCoder 1183 : 连通性一·割边与割点(模板)

    连通性一·割边与割点 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 还记得上次小Hi和小Ho学校被黑客攻击的事情么,那一次攻击最后造成了学校网络数据的丢失.为了避免再次 ...

  8. AngularJS方法 —— angular.bootstrap

    描述: 此方法用于手动加载angularjs模板 (官方翻译:注意基于端到端的测试不能使用此功能来引导手动加载,他们必须使用ngapp. angularjs会检测这个模板是否被浏览器加载或者加载多次并 ...

  9. Asp.Net构架(Http请求处理流程) - Part.1

    引言 我查阅过不少Asp.Net的书籍,发现大多数作者都是站在一个比较高的层次上讲解Asp.Net.他们耐心.细致地告诉你如何一步步拖放控件.设置控件属性.编写CodeBehind代码,以实现某个特定 ...

  10. 避免Android内存泄露

    摘自:http://blog.csdn.net/xyz_lmn/article/details/7108011 Android的应用被限制为最多占用16m的内存,至少在T-Mobile G1上是这样的 ...