zoukankan      html  css  js  c++  java
  • 一篇文章让你了解并掌握memcached

    第一章 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工具类

      1 package com.cmcc.core.Util; 
      2 
      3 import java.util.Date;
      4 
      5 import com.danga.MemCached.MemCachedClient;
      6 
      7 import com.danga.MemCached.SockIOPool;
      8 
      9  
     10 
     11 public class MemcachedUtil {
     12 
     13    
     14 
     15     protected static MemCachedClient mcc = new MemCachedClient();
     16 
     17  
     18 
     19     protected static MemcachedUtil memCached = new MemcachedUtil();
     20 
     21  
     22 
     23    
     24 
     25     static {
     26 
     27       
     28 
     29        String[] servers = { "127.0.0.1:11211" };
     30 
     31        Integer[] weights = { 3 };
     32 
     33  
     34 
     35        //获取连接池的实例
     36 
     37        SockIOPool pool = SockIOPool.getInstance();
     38 
     39  
     40 
     41        //设置连接服务器和权重
     42 
     43        pool.setServers(servers);
     44 
     45        pool.setWeights(weights);
     46 
     47  
     48 
     49        pool.setInitConn(5);//设置初始连接数
     50 
     51        pool.setMinConn(5);//设置最小连接数
     52 
     53        pool.setMaxConn(250);//设置最大连接数
     54 
     55        pool.setMaxIdle(1000 * 60 * 60 * 6);//设置最大处理时间
     56 
     57  
     58 
     59        pool.setMaintSleep(30);//设置连接池守护线程的睡眠时间
     60 
     61  
     62 
     63        //设置TCP参数,连接超时
     64 
     65        pool.setNagle(false);
     66 
     67        pool.setSocketTO(3000);
     68 
     69        pool.setSocketConnectTO(0);
     70 
     71  
     72 
     73        //初始化并启动线程池
     74 
     75        pool.initialize();
     76 
     77  
     78 
     79        //压缩设置,超过指定大小的都压缩
     80 
     81        mcc.setCompressEnable(true);
     82 
     83        mcc.setCompressThreshold(64 * 1024);
     84 
     85     }
     86 
     87  
     88 
     89     /**
     90 
     91      * 构造函数
     92 
     93      *
     94 
     95      */
     96 
     97     protected MemcachedUtil() {
     98 
     99  
    100 
    101     }
    102 
    103  
    104 
    105     /**
    106 
    107      * 获取memcached实例
    108 
    109      *
    110 
    111      * @return
    112 
    113      */
    114 
    115     public static MemcachedUtil getInstance() {
    116 
    117        return memCached;
    118 
    119     }
    120 
    121  
    122 
    123     /**
    124 
    125      * 退出
    126 
    127      */
    128 
    129     public static void shutDown() {
    130 
    131        memCached.shutDown();
    132 
    133     }
    134 
    135  
    136 
    137     /**
    138 
    139      * 添加
    140 
    141      *
    142 
    143      * @param key
    144 
    145      * @param value
    146 
    147      * @return
    148 
    149      */
    150 
    151     public boolean add(String key, Object value) {
    152 
    153        return mcc.add(key, value);
    154 
    155     }
    156 
    157  
    158 
    159     public boolean add(String key, Object value, Date expiry) {
    160 
    161        return mcc.add(key, value, expiry);
    162 
    163     }
    164 
    165  
    166 
    167     public boolean replace(String key, Object value) {
    168 
    169        return mcc.replace(key, value);
    170 
    171     }
    172 
    173  
    174 
    175     public boolean replace(String key, Object value, Date expiry) {
    176 
    177        return mcc.replace(key, value, expiry);
    178 
    179     }
    180 
    181  
    182 
    183     /**
    184 
    185      * 根据键取值
    186 
    187      *
    188 
    189      * @param key
    190 
    191      * @return
    192 
    193      */
    194 
    195     public Object get(String key) {
    196 
    197        return mcc.get(key);
    198 
    199     }
    200 
    201  
    202 
    203     public static void main(String[] args) {
    204 
    205        MemcachedUtil cache = MemcachedUtil.getInstance();
    206 
    207        cache.add(" hello ", 234);
    208 
    209        System.out.print(" get value :  " + cache.get(" hello "));
    210 
    211     }
    212 
    213 }

     

    (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配置文件

     1 <!-- 数据库配置文件读取 -->
     2 
     3 <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     4 
     5     <property name="order" value="1"/> 
     6 
     7     <property name="ignoreUnresolvablePlaceholders" value="true"/>
     8 
     9     <property name="locations"> 
    10 
    11         <list> 
    12 
    13             <value>classpath:com/cmcc/core/Config/database.properties</value>
    14 
    15             <value>classpath:com/cmcc/core/Log/memcache.properties</value>
    16 
    17         </list> 
    18 
    19       </property>
    20 
    21 </bean>
     1 <!-- memecached配置 -->
     2 
     3 <bean id="memcachedPool" class="com.danga.MemCached.SockIOPool" factory-method="getInstance"
     4 
     5       init-method="initialize" destroy-method="shutDown">
     6 
     7        <constructor-arg><value>memCachedPool</value></constructor-arg>
     8 
     9        <property name="servers"><list><value>${memcache.server}</value></list></property>
    10 
    11        <property name="weights"><list><value>${memcache.weights}</value></list></property>
    12 
    13        <property name="initConn"><value>${memcache.initConn}</value></property>
    14 
    15        <property name="minConn"><value>${memcache.minConn}</value></property>
    16 
    17        <property name="maxConn"><value>${memcache.maxConn}</value></property>
    18 
    19        <property name="maintSleep"><value>${memcache.maintSleep}</value></property>
    20 
    21        <property name="nagle"><value>${memcache.nagle}</value></property>
    22 
    23        <property name="socketTO"><value>${memcache.socketTO}</value></property>
    24 
    25 </bean>
    26 
    27  
    28 
    29 <bean id="memCacheClient" class="com.danga.MemCached.MemCachedClient">
    30 
    31         <constructor-arg><value>memCachedPool</value></constructor-arg>
    32 
    33 </bean>

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

     

  • 相关阅读:
    水滴二次开发日志5
    水滴二次开发日志4
    水滴二次开发日志3
    水滴二次开发日志2
    NOIp2020AFO记
    Diary(2020十一月 NOIP赛前集训)
    我们的Gary真的是太强辣
    Diary(2020十月 CSP赛前集训)
    Diary(2020九月 半集训)
    Music
  • 原文地址:https://www.cnblogs.com/zlbx/p/5892939.html
Copyright © 2011-2022 走看看