第一章 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. 基于用户登陆的struts2中action的分类详解

    在struts2中action的分类有:继承 ActionSupport 实现 Action,模型驱动(ModelDriven)的 Action,多方法的 Action三种方式. 1.继承 Actio ...

  2. 浅谈java使用指定字符集编码,以及常见的字符集

    问题的引入:在InputStreamReader(OutputStreamWriter)的构造方法中,有指定字符集编码,那么什么是字符集?有哪些常用的字符集?怎么用字符集进行编码? 一   什么是字符 ...

  3. Ubuntu命令:sudo、shutdown、apt-get、vim

    切换成ROOT用户: Ubuntu中默认不开启root账户,所以root账户是没有密码的, 但是会有一个非root的管理员账户,可以通过sudo来获得root权限,现在就可以用这个账户来设置密码 ** ...

  4. 神经网络中的Softmax激活函数

    Softmax回归模型是logistic回归模型在多分类问题上的推广,适用于多分类问题中,且类别之间互斥的场合. Softmax将多个神经元的输出,映射到(0,1)区间内,可以看成是当前输出是属于各个 ...

  5. Python 多版本共存之pyenv

    经常遇到这样的情况: 系统自带的 Python 是 2.6,自己需要 Python 2.7 中的某些特性: 系统自带的 Python 是 2.x,自己需要 Python 3.x: 此时需要在系统中安装 ...

  6. 给UIButton设置阴影及动画组

    //设置“开启旅程”按钮 UIButton *startBtn = self.startBtn; CGFloat btnW = ; CGFloat btnH = ; CGFloat btnX = (s ...

  7. 【4】JDK和CGLIB生成动态代理类的区别

    当一个对象(客户端)不能或者不想直接引用另一个对象(目标对象),这时可以应用代理模式在这两者之间构建一个桥梁--代理对象. 按照代理对象的创建时期不同,可以分为两种: 静态代理:事先写好代理对象类,在 ...

  8. #507. 「LibreOJ NOI Round #1」接竹竿 dp

    题目: 题解: 我们考虑把每对花色相同的牌看作区间. 那么如果我们设 \(f_i\) 表示决策在 \([1,i]\) 内的最优答案. 那么有 \(f_i = max\{max\{(f_{j-1}+\s ...

  9. sublime text3 中设置默认浏览器,并且设置快捷键

    1.打开packageControl   对应快捷键  command + shift + p 2.输入install package 3.安装插件 SideBarEnhancements 4.安装了 ...

  10. 转: django数据库操作-增删改查-多对多关系以及一对多(外键)关系

    原文链接:http://blog.csdn.net/u010271717/article/details/22044415 一.一对多(外键) 例子:一个作者对应多本书,一本书只有一个作者 model ...