阅读本文的前提是,你已经安装或者使用了MemCached,或具有相关的基本知识。

今天要介绍的是Simple-Spring-Memcached,它封装了对MemCached的调用,使MemCached的客户端开发变得超乎寻常的简单,只要一行代码就行:

@ReadThroughAssignCache(assignedKey = "VETS", expiration = 300, namespace = "NELZ")

是不是很神奇?这行代码指定了MemCached的key,过期时间和命名空间。假设你的MemCached服务器IP是:196.168.10.101,端口是:12000,那么在数据调用的配置文件中只要加上下面配置代码就可以了:

 

1 
   
   <
   
   import 
   
   resource
   
   ="classpath:simplesm-context.xml"
   
    
   
   />
   
   

   
    2 
   
   

   
    3 
   
    

   
    4 
   
   

   
    5 
   
     
   
   <
   
   bean 
   
   id
   
   ="memcachedConnectionBean"
   
    class
   
   ="net.nelz.simplesm.config.MemcachedConnectionBean"
   
   >
   
   

   
    6 
   
   

   
    7 
   
       
   
   <
   
   property 
   
   name
   
   ="consistentHashing"
   
    value
   
   ="true"
   
    
   
   />
   
   

   
    8 
   
   

   
    9 
   
       
   
   <
   
   property 
   
   name
   
   ="nodeList"
   
    value
   
   ="196.168.10.101:12000"
   
    
   
   />
   
   

   
   10 
   
   

   
   11 
   
     
   
   </
   
   bean
   
   >

 

从simplesm-context.xml的内容中,可以看出它所封装的类和方法:

 

1 
   
   <
   
   bean 
   
   id
   
   ="memcachedClientFactory"
   
    class
   
   ="net.nelz.simplesm.config.MemcachedClientFactory"
   
    
   
   >
   
   

   
     2 
   
   

   
     3 
   
                      
   
   <
   
   property 
   
   name
   
   ="bean"
   
    ref
   
   ="memcachedConnectionBean"
   
    
   
   />
   
   

   
     4 
   
   

   
     5 
   
            
   
   </
   
   bean
   
   >
   
   

   
     6 
   
   

   
     7 
   
    

   
     8 
   
   

   
     9 
   
            
   
   <
   
   bean 
   
   id
   
   ="memcachedClient"
   
    factory-bean
   
   ="memcachedClientFactory"
   
    factory-method
   
   ="createMemcachedClient"
   
    
   
   />
   
   

   
    10 
   
   

   
    11 
   
    

   
    12 
   
   

   
    13 
   
            
   
   <
   
   bean 
   
   id
   
   ="methodStore"
   
    class
   
   ="net.nelz.simplesm.aop.CacheKeyMethodStoreImpl"
   
    
   
   />
   
   

   
    14 
   
   

   
    15 
   
    

   
    16 
   
   

   
    17 
   
     
   
   <
   
   bean 
   
   id
   
   ="net.nelz.simplesm.DefaultKeyProvider"
   
    class
   
   ="net.nelz.simplesm.impl.DefaultKeyProvider"
   
   >
   
   

   
    18 
   
   

   
    19 
   
       
   
   <
   
   property 
   
   name
   
   ="methodStore"
   
    ref
   
   ="methodStore"
   
    
   
   />
   
   

   
    20 
   
   

   
    21 
   
     
   
   </
   
   bean
   
   >
   
   

   
    22 
   
   

   
    23 
   
    

   
    24 
   
   

   
    25 
   
     
   
   <
   
   bean 
   
   id
   
   ="readThroughSingleCache"
   
    class
   
   ="net.nelz.simplesm.aop.ReadThroughSingleCacheAdvice"
   
   >
   
   

   
    26 
   
   

   
    27 
   
                      
   
   <
   
   property 
   
   name
   
   ="cache"
   
    ref
   
   ="memcachedClient"
   
    
   
   />
   
   

   
    28 
   
   

   
    29 
   
                      
   
   <
   
   property 
   
   name
   
   ="methodStore"
   
    ref
   
   ="methodStore"
   
    
   
   />
   
   

   
    30 
   
   

   
    31 
   
       
   
   <
   
   property 
   
   name
   
   ="defaultKeyProvider"
   
    ref
   
   ="net.nelz.simplesm.DefaultKeyProvider"
   
    
   
   />
   
   

   
    32 
   
   

   
    33 
   
     
   
   </
   
   bean
   
   >
   
   

   
    34 
   
   

   
    35 
   
            
   
   <
   
   bean 
   
   id
   
   ="readThroughMultiCache"
   
    class
   
   ="net.nelz.simplesm.aop.ReadThroughMultiCacheAdvice"
   
   >
   
   

   
    36 
   
   

   
    37 
   
                      
   
   <
   
   property 
   
   name
   
   ="cache"
   
    ref
   
   ="memcachedClient"
   
    
   
   />
   
   

   
    38 
   
   

   
    39 
   
                      
   
   <
   
   property 
   
   name
   
   ="methodStore"
   
    ref
   
   ="methodStore"
   
    
   
   />
   
   

   
    40 
   
   

   
    41 
   
       
   
   <
   
   property 
   
   name
   
   ="defaultKeyProvider"
   
    ref
   
   ="net.nelz.simplesm.DefaultKeyProvider"
   
    
   
   />
   
   

   
    42 
   
   

   
    43 
   
            
   
   </
   
   bean
   
   >
   
   

   
    44 
   
   

   
    45 
   
     
   
   <
   
   bean 
   
   id
   
   ="readThroughAssignCache"
   
    class
   
   ="net.nelz.simplesm.aop.ReadThroughAssignCacheAdvice"
   
   >
   
   

   
    46 
   
   

   
    47 
   
       
   
   <
   
   property 
   
   name
   
   ="cache"
   
    ref
   
   ="memcachedClient"
   
    
   
   />
   
   

   
    48 
   
   

   
    49 
   
       
   
   <
   
   property 
   
   name
   
   ="methodStore"
   
    ref
   
   ="methodStore"
   
    
   
   />
   
   

   
    50 
   
   

   
    51 
   
       
   
   <
   
   property 
   
   name
   
   ="defaultKeyProvider"
   
    ref
   
   ="net.nelz.simplesm.DefaultKeyProvider"
   
    
   
   />
   
   

   
    52 
   
   

   
    53 
   
     
   
   </
   
   bean
   
   >
   
   

   
    54 
   
   

   
    55 
   
            
   
   <
   
   bean 
   
   id
   
   ="updateSingleCache"
   
    class
   
   ="net.nelz.simplesm.aop.UpdateSingleCacheAdvice"
   
   >
   
   

   
    56 
   
   

   
    57 
   
                      
   
   <
   
   property 
   
   name
   
   ="cache"
   
    ref
   
   ="memcachedClient"
   
    
   
   />
   
   

   
    58 
   
   

   
    59 
   
                      
   
   <
   
   property 
   
   name
   
   ="methodStore"
   
    ref
   
   ="methodStore"
   
    
   
   />
   
   

   
    60 
   
   

   
    61 
   
       
   
   <
   
   property 
   
   name
   
   ="defaultKeyProvider"
   
    ref
   
   ="net.nelz.simplesm.DefaultKeyProvider"
   
    
   
   />
   
   

   
    62 
   
   

   
    63 
   
            
   
   </
   
   bean
   
   >
   
   

   
    64 
   
   

   
    65 
   
            
   
   <
   
   bean 
   
   id
   
   ="updateMultiCache"
   
    class
   
   ="net.nelz.simplesm.aop.UpdateMultiCacheAdvice"
   
   >
   
   

   
    66 
   
   

   
    67 
   
                      
   
   <
   
   property 
   
   name
   
   ="cache"
   
    ref
   
   ="memcachedClient"
   
    
   
   />
   
   

   
    68 
   
   

   
    69 
   
                     
   
   <
   
   property 
   
   name
   
   ="methodStore"
   
    ref
   
   ="methodStore"
   
    
   
   />
   
   

   
    70 
   
   

   
    71 
   
       
   
   <
   
   property 
   
   name
   
   ="defaultKeyProvider"
   
    ref
   
   ="net.nelz.simplesm.DefaultKeyProvider"
   
    
   
   />
   
   

   
    72 
   
   

   
    73 
   
            
   
   </
   
   bean
   
   >
   
   

   
    74 
   
   

   
    75 
   
     
   
   <
   
   bean 
   
   id
   
   ="updateAssignCache"
   
    class
   
   ="net.nelz.simplesm.aop.UpdateAssignCacheAdvice"
   
   >
   
   

   
    76 
   
   

   
    77 
   
       
   
   <
   
   property 
   
   name
   
   ="cache"
   
    ref
   
   ="memcachedClient"
   
    
   
   />
   
   

   
    78 
   
   

   
    79 
   
       
   
   <
   
   property 
   
   name
   
   ="methodStore"
   
    ref
   
   ="methodStore"
   
    
   
   />
   
   

   
    80 
   
   

   
    81 
   
       
   
   <
   
   property 
   
   name
   
   ="defaultKeyProvider"
   
    ref
   
   ="net.nelz.simplesm.DefaultKeyProvider"
   
    
   
   />
   
   

   
    82 
   
   

   
    83 
   
     
   
   </
   
   bean
   
   >
   
   

   
    84 
   
   

   
    85 
   
     
   
   <
   
   bean 
   
   id
   
   ="invalidateSingleCache"
   
    class
   
   ="net.nelz.simplesm.aop.InvalidateSingleCacheAdvice"
   
   >
   
   

   
    86 
   
   

   
    87 
   
       
   
   <
   
   property 
   
   name
   
   ="cache"
   
    ref
   
   ="memcachedClient"
   
    
   
   />
   
   

   
    88 
   
   

   
    89 
   
       
   
   <
   
   property 
   
   name
   
   ="methodStore"
   
    ref
   
   ="methodStore"
   
    
   
   />
   
   

   
    90 
   
   

   
    91 
   
       
   
   <
   
   property 
   
   name
   
   ="defaultKeyProvider"
   
    ref
   
   ="net.nelz.simplesm.DefaultKeyProvider"
   
    
   
   />
   
   

   
    92 
   
   

   
    93 
   
     
   
   </
   
   bean
   
   >
   
   

   
    94 
   
   

   
    95 
   
     
   
   <
   
   bean 
   
   id
   
   ="invalidateMultiCache"
   
    class
   
   ="net.nelz.simplesm.aop.InvalidateMultiCacheAdvice"
   
   >
   
   

   
    96 
   
   

   
    97 
   
       
   
   <
   
   property 
   
   name
   
   ="cache"
   
    ref
   
   ="memcachedClient"
   
    
   
   />
   
   

   
    98 
   
   

   
    99 
   
       
   
   <
   
   property 
   
   name
   
   ="methodStore"
   
    ref
   
   ="methodStore"
   
    
   
   />
   
   

   
   100 
   
   

   
   101 
   
       
   
   <
   
   property 
   
   name
   
   ="defaultKeyProvider"
   
    ref
   
   ="net.nelz.simplesm.DefaultKeyProvider"
   
    
   
   />
   
   

   
   102 
   
   

   
   103 
   
     
   
   </
   
   bean
   
   >
   
   

   
   104 
   
   

   
   105 
   
     
   
   <
   
   bean 
   
   id
   
   ="invalidateAssignCache"
   
    class
   
   ="net.nelz.simplesm.aop.InvalidateAssignCacheAdvice"
   
   >
   
   

   
   106 
   
   

   
   107 
   
       
   
   <
   
   property 
   
   name
   
   ="cache"
   
    ref
   
   ="memcachedClient"
   
    
   
   />
   
   

   
   108 
   
   

   
   109 
   
       
   
   <
   
   property 
   
   name
   
   ="methodStore"
   
    ref
   
   ="methodStore"
   
    
   
   />
   
   

   
   110 
   
   

   
   111 
   
       
   
   <
   
   property 
   
   name
   
   ="defaultKeyProvider"
   
    ref
   
   ="net.nelz.simplesm.DefaultKeyProvider"
   
    
   
   />
   
   

   
   112 
   
   

   
   113 
   
     
   
   </
   
   bean
   
   >
   
   

   
   114 
   
   

   
   115

 

Simple-Spring-Memcached还提供了一个例子,在spring的petClinic例子中加入了几行代码,就实现了对MemCached的调用:

 

1 
   
   import
   
    net.nelz.simplesm.annotations.ReadThroughAssignCache;

   
    2 
   
   

   
    3 
   
    
   
   import
   
    net.nelz.simplesm.annotations.ReadThroughSingleCache;

   
    4 
   
   

   
    5 
   
   @ReadThroughAssignCache(assignedKey 
   
   =
   
    
   
   "
   
   VETS
   
   "
   
   , expiration 
   
   =
   
    
   
   300
   
   , namespace 
   
   =
   
    
   
   "
   
   NELZ
   
   "
   
   )

   
    6 
   
   

   
    7 
   
       
   
   public
   
    Collection
   
   <
   
   Vet
   
   >
   
    getVets() {

   
    8 
   
   

   
    9 
   
           System.out.println(
   
   "
   
   \n ! ! !Gonna wait a bit: 
   
   "
   
    
   
   +
   
    
   
   new
   
    Date() 
   
   +
   
    
   
   "
   
   \n
   
   "
   
   );        

   
   10 
   
   

   
   11 
   
           
   
   try
   
    {

   
   12 
   
   

   
   13 
   
               Thread.sleep(
   
   4000
   
   );

   
   14 
   
   

   
   15 
   
           } 
   
   catch
   
    (Exception ex) {}

   
   16 
   
   

   
   17 
   
           
   
   return
   
    sessionFactory.getCurrentSession().createQuery(
   
   "
   
   from Vet vet order by vet.lastName, vet.firstName
   
   "
   
   ).list();

   
   18 
   
   

   
   19 
   
            }

   
   20 
   
   

   
   21

 

为了加强测试的效果,在第一次读取数据时,故意停顿了一下(sleep)。

夜深了,大家也应该sleep了吧:)