`
younglibin
  • 浏览: 1210909 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

simple-spring-memcached集成memcache

 
阅读更多

001配置


POM 添加:
 
<dependency>
   <groupId>com.googlecode.xmemcached</groupId>
   <artifactId>xmemcached</artifactId>
   <version>1.3.5</version>
  </dependency>
  <dependency>
   <groupId>com.google.code.simple-spring-memcached</groupId>
   <artifactId>simple-spring-memcached</artifactId>
   <version>2.0.0</version>
  </dependency>
 
app添加:
 
 
<import resource="classpath:simplesm-context.xml" />
 
 
<bean name="cardtypeIcon" class="com.google.code.ssm.CacheFactory">
  <property name="cacheClientFactory">
   <bean
    class="com.google.code.ssm.providers.xmemcached.MemcacheClientFactoryImpl" />
  </property>
  <property name="addressProvider">
   <bean class="com.google.code.ssm.config.DefaultAddressProvider">
    <property name="address"
     value="192.168.232.201:11111,192.168.232.201:11112" />
   </bean>
  </property>
  <property name="configuration">
   <bean
    class="com.google.code.ssm.providers.xmemcached.XMemcachedConfiguration">
    <!--是否使用一致性哈希 -->
    <property name="consistentHashing" value="true" />
    <property name="operationTimeout" value="10000" />
   </bean>
  </property>
  <property name="cacheName">
   <value>cardtypeIcon</value>
  </property>
 </bean>
 
 
java 代码:
 /**
  * 通过cache查询
  *
  * @author libin
  * @param cardtypeId
  * memcached map 对应的key
  * @return
  */
@ReadThroughSingleCache(namespace = "yazuo.cardtypeIcon", expiration = 60) //失效时间单位秒
 @CacheName("cardtypeIcon")
 public String queryCardtypeIcon(
   @ParameterValueKeyProvider Integer cardtypeId) {
  CardtypeIcon cardtypeIcon = new CardtypeIcon();
  cardtypeIcon.setCardtypeId(cardtypeId);
  cardtypeIcon = cardtypeIconService.selectCardtypeIconByID(cardtypeIcon);
  try {
   Thread.sleep(5000);
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  if (null != cardtypeIcon) {
   return cardtypeIcon.getIcon();
  }
  return "";
 }
 
执行之后再cache 中可以使用:  get  yazuo.cardtypeIcon:cardtypeId
yazuo.cardtypeIcon:是namespace 
cardtypeId:是传过来的ID
 
例如: get  yazuo.cardtypeIcon:50
 
 get yazuo.cardtypeIcon:50
VALUE yazuo.cardtypeIcon:50 0 24
55185390502646010083.png
END
 
 
遗留问题:
 
  1、  怎么查看 cache 设置的失效时间 命令行
  2、  怎么设置到从数据库查询对象为空的时候, 不放入缓存,使用 ReadThroughSingleCache 怎么设置当返回对象为空,不放入缓存
            解决:按照ssm注解的意思是,只要数据库执行成功就能放到缓存, 执行失败就不放入缓存了, 所以可以采取抛出异常的方式,放整个方法失败, 这样就不会放入缓存了!
  3、使用注解怎么在程序启动的时候, 加载数据库的数据到缓存 
 
 
 
 
002-接口

1、增加或者更新
 
 /**
  * 通过cache查询
  *
  * @author libin
  * @param cardtypeId
  * memcached map 对应的key
  * @return
  */
 @ReadThroughSingleCache(namespace = WebCommonContents.CARDTYPEICON_CACHE, expiration = WebCommonContents.CARDTYPEICON_EXPIRATION)
 @CacheName("cardtypeIcon")
 public String queryCardtypeIcon(
   @ParameterValueKeyProvider Integer cardtypeId) {
  CardtypeIcon cardtypeIcon = new CardtypeIcon();
  cardtypeIcon.setCardtypeId(cardtypeId);
  cardtypeIcon = cardtypeIconService.selectCardtypeIconByID(cardtypeIcon);
  if (null != cardtypeIcon) {
   return cardtypeIcon.getIcon();
  }
  // TODO 返回空未处理
  return "";
 }
 
 /**
  * @author libin
  * @return
  */
 @UpdateSingleCache(namespace = WebCommonContents.CARDTYPEICON_CACHE, expiration = WebCommonContents.CARDTYPEICON_EXPIRATION)
 @CacheName("cardtypeIcon")
 @Override
 public void updateCardtypeIcon(
   @ParameterValueKeyProvider Integer cardtypeId,
   @ParameterDataUpdateContent String icon) {
  CardtypeIcon cardtypeIcon = new CardtypeIcon();
  cardtypeIcon.setCardtypeId(cardtypeId);
  cardtypeIcon = cardtypeIconService.selectCardtypeIconByID(cardtypeIcon);
  if (null == cardtypeIcon) {
   cardtypeIcon = new CardtypeIcon();
   cardtypeIcon.setCardtypeId(cardtypeId);
   cardtypeIcon.setIcon(icon);
   cardtypeIcon.setLastTime(new Timestamp(System.currentTimeMillis()));
   cardtypeIconService.addCardtypeIcon(cardtypeIcon);
  } else {
   cardtypeIcon.setIcon(icon);
   cardtypeIcon.setLastTime(new Timestamp(System.currentTimeMillis()));
   cardtypeIconService.updateCardtypeIconByID(cardtypeIcon);
  }
 }
 
 /**
  * @author libin
  * @return
  */
 @InvalidateSingleCache(namespace = WebCommonContents.CARDTYPEICON_CACHE)
 @CacheName("cardtypeIcon")
 @Override
 public void deleteIcon(@ParameterValueKeyProvider Integer cardtypeId) {
  CardtypeIcon cardtypeIcon = new CardtypeIcon();
  cardtypeIcon.setCardtypeId(cardtypeId);
  cardtypeIconService.removeCardtypeIconByObject(cardtypeIcon);
 }
 
 
spring 中使用到的注解:
 

@CacheKeyMethod

@ReadThroughSingleCache@ReadThroughMultiCache@ReadThroughAssignCache

@InvalidateSingleCache@InvalidateMultiCache@InvalidateAssignCache

@UpdateSingleCache@UpdateMultiCache@UpdateAssignCache

@ReadCounterFromCache

@IncrementCounterInCache@DecrementCounterInCache

@UpdateCounterInCache



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

simple-spring-memcached本身并不提供cache机制的实现,只是为了cache的调用更加简单而设计的。
在cache的实现上使用的是第三方组件(如x-memcached和spy-memcached),官方给出了针对这两种组件的相关配置
 
 
附件提供一个 java 客户端,可以查询 memcached 中的key 和value , 方便测试,如果熟悉命令行的话, 可以不需要这个!
分享到:
评论

相关推荐

    JAVA面试_Dubbo常问面试题30个.pdf

    - 分别基于memcached和redis实现的RPC协议,适用于缓存服务的调用。 【Dubbo超时时间设置】 Dubbo提供了两种设置超时时间的方法:服务提供者端和消费者端。推荐在服务提供者端设置,因为它更了解服务特性。消费者...

    Dubbo面试及答案(上

    - **memcache和redis协议**:分别基于memcached和redis实现的RPC协议,用于缓存服务。 2. **Dubbo超时时间设置**: - 服务提供者端设置,推荐由服务提供者根据服务特性来设定。 - 服务消费者端设置,优先级更高...

    Dubbo服务框架面试题及答案.pdf

    - Memcache和Redis协议是基于这些缓存系统实现的RPC协议,分别用于实现基于memcached和redis的远程调用。 关于超时时间设置,Dubbo允许在服务提供者和服务消费者两端设置。服务提供者端的超时时间更接近服务的实际...

    2021Java字节跳动面试题——面向字节_Dubbo(上).pdf

    - **定义**:Dubbo是一个分布式、高性能、透明化的RPC服务框架,提供服务自动注册、自动发现等高效服务治理方案,可以和Spring框架无缝集成。 - **主要应用场景**:透明化的远程方法调用、软负载均衡及容错机制、...

    Dubbo面试题集合.pdf

    - **特点**:基于memcached实现的RPC协议。 - **应用场景**:适用于缓存相关的服务调用。 - **优点**:速度快,适用于缓存场景。 - **缺点**:功能相对单一。 #### 7. **Redis协议** - **特点**:基于Redis实现的...

    Java Dubbo面试及答案

    6. Memcache 协议:基于 Memcached 实现的 RPC 协议。 7. Redis 协议:基于 Redis 实现的 RPC 协议。 二、Dubbo 超时时间怎样设置? Dubbo 超时时间设置有两种方式: 1. 服务提供者端设置超时时间,在 Dubbo 的...

    Dubbo面试及答案(上).pdf

    6. **memcache协议**和**redis协议**:基于memcached和redis实现的RPC协议,用于利用这些内存数据库进行高速数据交互。 【Dubbo超时时间的设置】 Dubbo的超时时间可以通过服务提供者和服务消费者两端进行设置。服务...

Global site tag (gtag.js) - Google Analytics