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 , 方便测试,如果熟悉命令行的话, 可以不需要这个!
相关推荐
- 分别基于memcached和redis实现的RPC协议,适用于缓存服务的调用。 【Dubbo超时时间设置】 Dubbo提供了两种设置超时时间的方法:服务提供者端和消费者端。推荐在服务提供者端设置,因为它更了解服务特性。消费者...
- **memcache和redis协议**:分别基于memcached和redis实现的RPC协议,用于缓存服务。 2. **Dubbo超时时间设置**: - 服务提供者端设置,推荐由服务提供者根据服务特性来设定。 - 服务消费者端设置,优先级更高...
- Memcache和Redis协议是基于这些缓存系统实现的RPC协议,分别用于实现基于memcached和redis的远程调用。 关于超时时间设置,Dubbo允许在服务提供者和服务消费者两端设置。服务提供者端的超时时间更接近服务的实际...
- **定义**:Dubbo是一个分布式、高性能、透明化的RPC服务框架,提供服务自动注册、自动发现等高效服务治理方案,可以和Spring框架无缝集成。 - **主要应用场景**:透明化的远程方法调用、软负载均衡及容错机制、...
- **特点**:基于memcached实现的RPC协议。 - **应用场景**:适用于缓存相关的服务调用。 - **优点**:速度快,适用于缓存场景。 - **缺点**:功能相对单一。 #### 7. **Redis协议** - **特点**:基于Redis实现的...
6. Memcache 协议:基于 Memcached 实现的 RPC 协议。 7. Redis 协议:基于 Redis 实现的 RPC 协议。 二、Dubbo 超时时间怎样设置? Dubbo 超时时间设置有两种方式: 1. 服务提供者端设置超时时间,在 Dubbo 的...
6. **memcache协议**和**redis协议**:基于memcached和redis实现的RPC协议,用于利用这些内存数据库进行高速数据交互。 【Dubbo超时时间的设置】 Dubbo的超时时间可以通过服务提供者和服务消费者两端进行设置。服务...