zoukankan      html  css  js  c++  java
  • simplespringmemcached简介

    memcached是一款非常优秀的分布式缓存工具,有效提升了按主键检索数据的性能问题。而simple-spring-memcached组件通过与spring框架整合,让memcached的调用变得更加简单。

    simple-spring-memcached本质上是采用了AOP的方式来实现缓存的调用和管理,其核心组件声明了一些Advice,当遇到相应的切入点时,会执行这些Advice来对memcached加以管理。

    切入点是通过标签的方式来进行声明的,在项目开发时,通常在DAO的方法上加以相应的标签描述,来表示组件对该方法的拦截
    组件所提供的切入点主要包括以下几种:
    ReadThroughSingleCache、ReadThroughMultiCache、ReadThroughAssignCache
    当遇到查询方法声明这些切入点时,组件首先会从缓存中读取数据,取到数据则跳过查询方法,直接返回。
    取不到数据在执行查询方法,并将查询结果放入缓存,以便下一次获取。
    InvalidateSingleCache、InvalidateMultiCache、InvalidateAssignCache
    当遇到删除方法声明这些切入点时,组件会删除缓存中的对应实体
    UpdateSingleCache、UpdateMultiCache、UpdateAssignCache
    当遇到更新方法声明这些切入点是,组件会更新缓存中对应的实体,以便下次从缓存中读取出的数据状态是最新的

    simple-spring-memcached本身并不提供cache机制的实现,只是为了cache的调用更加简单而设计的。
    在cache的实现上使用的是第三方组件(如x-memcached和spy-memcached),官方给出了针对这两种组件的相关配置

    http://code.google.com/p/simple-spring-memcached/wiki/Getting_Started

    simple-spring-memcached的使用:

    1.首先在Spring配置文件中加入如下两句:

    [html] view plaincopy
     
    1. <import resource="simplesm-context.xml" />  
    2. <aop:aspectj-autoproxy />  

    simplesm-context.xml封装在simple-spring-memcached-*.jar文件当中,主要用来加载组件核心的Advice,供程序调度使用。
    而由于simple-spring-memcached主要是基于AOP的代理,所以加入<aop:aspectj-autoproxy />让代理机制起到作用。

    2.定义memcached客户端

    memcached比较常用的java客户端有两种,spymemcached和xmemcached,xmemcached支持多线程

    [html] view plaincopy
     
    1. <bean name="defaultMemcachedClient" class="com.google.code.ssm.CacheFactory">  
    2.         <property name="cacheClientFactory">  
    3.             <bean class="com.google.code.ssm.providers.xmemcached.MemcacheClientFactoryImpl" />  
    4.         </property>  
    5.         <property name="addressProvider">  
    6.             <bean class="com.google.code.ssm.config.DefaultAddressProvider">  
    7.                 <property name="address" value="192.168.7.131:11211" />  
    8.             </bean>  
    9.         </property>  
    10.         <property name="configuration">  
    11.             <bean class="com.google.code.ssm.providers.CacheConfiguration">  
    12.                 <property name="consistentHashing" value="true" />  
    13.             </bean>  
    14.         </property>  
    15.     </bean>  

    com.google.code.ssm.CacheFactory是一个FactoryBean,会返回Cache实体供Advice使用
    address属性定义了缓存节点的IP地址和端口号

    consistentHashing属性定义了缓存节点的查找方法

    3.实体的定义

    memcached相当于一个功能强大的Map,通过Key/Value的形式来缓存POJO实体,在定义实体的时候,可通过@CacheKeyMethod标签来为实体指定Key值,同时实体及实体的每个成员变量必须是可序列化的,可实现Serializable接口,或通过Externalizable接口来为实体指定序列化方法。

    [java] view plaincopy
     
    1. public class User implements Serializable {  
    2.     private static final long serialVersionUID = 7517080513591583073L;  
    3.     private String userId;  
    4.     private String username;  
    5.     private String password;  
    6.     public String getUsername() {  
    7.         return username;  
    8.     }  
    9.     public void setUsername(String username) {  
    10.         this.username = username;  
    11.     }  
    12.     public String getPassword() {  
    13.         return password;  
    14.     }  
    15.     public void setPassword(String password) {  
    16.         this.password = password;  
    17.     }  
    18.     @CacheKeyMethod  
    19.     public String getUserId() {  
    20.         return userId;  
    21.     }  
    22.     public void setUserId(String userId) {  
    23.         this.userId = userId;  
    24.     }  
    25. }  

    4.DAO的定义
    缓存操作通常是对DAO的方法进行拦截,加入必要的通知以达到增删改查的效果

    切入点的声明主要通过之前提到的标签来实现

    [java] view plaincopy
     
      1. public class UserDaoImpl implements IUserDao {  
      2.     private static final String NAMESPACE="ns";  
      3.     private Map<String,User> users=new HashMap<String,User>();  
      4.     @Override  
      5.     public void saveUser(User user) {  
      6.         users.put(user.getUserId(), user);  
      7.     }  
      8.     /** 
      9.      * 当执行getById查询方法时,系统首先会从缓存中获取userId对应的实体 
      10.      * 如果实体还没有被缓存,则执行查询方法并将查询结果放入缓存中 
      11.      */  
      12.     @Override  
      13.     @ReadThroughSingleCache(namespace = NAMESPACE, expiration = 3600)  
      14.     public User getById(@ParameterValueKeyProvider String userId) {  
      15.         System.out.println(userId);  
      16.         return users.get(userId);  
      17.     }  
      18.     /** 
      19.      * 当执行updateUser方法时,系统会更新缓存中userId对应的实体 
      20.      * 将实体内容更新成@*DataUpdateContent标签所描述的实体 
      21.      */  
      22.     @UpdateSingleCache(namespace = NAMESPACE, expiration = 3600)  
      23.     @Override  
      24.     public void updateUser(@ParameterValueKeyProvider @ParameterDataUpdateContent User user) {  
      25.         users.put(user.getUserId(), user);  
      26.     }  
      27.     /** 
      28.      * 当执行deleteUser方法时,系统会删除缓存中userId对应的实体 
      29.      */  
      30.     @InvalidateSingleCache(namespace = NAMESPACE)  
      31.     @Override  
      32.     public void deleteUser(@ParameterValueKeyProvider String userId) {  
      33.         users.remove(userId);  
      34.     }  
      35. }  
  • 相关阅读:
    eclipse中的Invalid text string (xxx).
    在jsp文件中出现Unknown tag (c:out)
    eclipse 界面复原
    ecilpse 纠错插件
    Multiple annotations found at this line:- The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
    Port 8080 required by Tomcat v9.0 Server at localhost is already in use. The server may already be running in another process, or a system process may be using the port.
    调用第三方https接口
    调用第三方http接口
    创建带值枚举
    spring整合redis之Redis配置文件
  • 原文地址:https://www.cnblogs.com/scwanglijun/p/3758232.html
Copyright © 2011-2022 走看看