`
huangzixun
  • 浏览: 68669 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

使用spring整合SSM实现注解式的缓存系统

 
阅读更多

近期公司的产品重构,底层使用了memcached 作为缓存系统,使用了几天之后发现每次增删查改之后都要手动进行更新缓存,为了偷懒,在网上查了查,发现使用SSM开源项目可以很方便的通过几个注解进行管理缓存。其实原理也很简单,主要利用了spring 的AOP编程,现在简单介绍下是如何实现的。

首先,在你的项目工程的pom.xml文件中添加以下依赖,ssm针对不同的memcached 客户端需要添加不同的实现

这是针对xmemcached 客户端
<dependency>
		<groupId>com.google.code.simple-spring-memcached</groupId>
		<artifactId>xmemcached-provider</artifactId>
		<version>3.1.0</version>
	</dependency>
这是针对spymemcached客户端
	<dependency>
		<groupId>com.google.code.simple-spring-memcached</groupId>
		<artifactId>spymemcached-provider</artifactId>
		<version>3.1.0</version>
	</dependency>



这是我的数据库实体类:HUser.java

package com.mailbill.datacore.entity;

import java.io.Serializable;
import java.util.Date;

import org.codehaus.jackson.annotate.JsonIgnoreProperties;

import com.google.code.ssm.api.CacheKeyMethod;

/**
 * auto create pojo
 * @author mycode
 * @version 1.0
 */
@JsonIgnoreProperties(ignoreUnknown=true)
public class Huser implements Saveable,Serializable{

	private static final long serialVersionUID = 1L;
	
	private static final String[] keyColumns = { "h_userid" };
	private static final String TABLENAME = "huser";

	@Override
	public String getTableName() {
		return TABLENAME;
	}

	@Override
	public String[] getKeyColumns() {
		return keyColumns;
	}
	private long h_userid = 0;
	
	@CacheKeyMethod
	public long geth_userid(){
		return h_userid;
	}
	
	public void seth_userid(long h_userid){
		this.h_userid = h_userid;
	}
	private String h_name = "";
	
	public String geth_name(){
		return h_name;
	}
	
	public void seth_name(String h_name){
		this.h_name = h_name;
	}
	private int h_age = 0;
	
	public int geth_age(){
		return h_age;
	}
	
	public void seth_age(int h_age){
		this.h_age = h_age;
	}
	
	@CacheKeyMethod
	public String getCacheKey(){
		return "huser_"+geth_userid();
	}
	
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return h_name+":"+h_userid+":"+h_age;
	}
}



可以看到geth_userid 方法上声明了一个注释:@CacheKeyMethod,这个是用来标识memcached 进行缓存操作时获取key的方法。

我的Dao类中的相关方法如下:

@ReadThroughSingleCache(namespace="user")
	public Huser getHuserById(@ParameterValueKeyProvider long id) throws Exception{
		String sql = "select * from huser where h_userid=?";
		System.out.println("没有缓存命中");
		return (Huser) queryOne(sql,new Object[]{id}, new Huser());
	}

@UpdateSingleCache(namespace="user")
	public int modHuser(@ParameterValueKeyProvider @ParameterDataUpdateContent Huser entity) throws Exception{
		return modify(entity);
	}


@InvalidateSingleCache(namespace="user")
	public int delUser(@ParameterValueKeyProvider long key) throws Exception {
		String sql = "delete from huser where h_userid=?";
		return delete(sql,new Object[]{key});
	}



可以看到上面三个方法中有几个注释,现在分别对上面几个注释进行简单的介绍下:
@ReadThroughSingleCache
作用:读取Cache中数据,如果不存在,则将读取的数据存入Cache
key生成规则:ParameterValueKeyProvider指定的参数,如果该参数对象中包含CacheKeyMethod注解的方法,则调用其方法,否则调用toString方法

@InvalidateSingleCache
作用:失效Cache中的数据
key生成规则:
使用 ParameterValueKeyProvider注解时,与ReadThroughSingleCache一致

@UpdateSingleCache
作用:更新Cache中的数据
key生成规则:ParameterValueKeyProvider指定
ParameterDataUpdateContent:方法参数中的数据,作为更新缓存的数据

除了以上几种注释之外,SSM还提供了一些其它的注释,可以参孝下文
http://www.colorfuldays.org/program/java/ssm_memcache/

现在看看spring的配置文件:memcached-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:context="http://www.springframework.org/schema/context" 
        xsi:schemaLocation="http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/aop 
           http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

  <import resource="simplesm-context.xml" />
<context:property-placeholder location="classpath:memcached.properties" ignore-unresolvable="true"/> 
  <aop:aspectj-autoproxy />  

  <bean name="defaultMemcachedClient" class="com.google.code.ssm.CacheFactory">
    <property name="cacheClientFactory">
      <bean name="cacheClientFactory" class="com.google.code.ssm.providers.xmemcached.MemcacheClientFactoryImpl" />
    </property>
    <property name="addressProvider">
      <bean class="com.google.code.ssm.config.DefaultAddressProvider">
      <!-- memcached 服务器地址,可配置多个,用“,”号隔开 -->
        <property name="address" value="${memcached.address}" />
      </bean>
    </property>
    <property name="configuration">
      <bean class="com.google.code.ssm.providers.CacheConfiguration">
      <!-- 是否使用哈希 -->
        <property name="consistentHashing" value="true" />
      </bean>
    </property>
    <!-- 该Memcached配置的Cache名称 一个应用中存在多个Memcached时,各个配置的cacheName必须不同。如果该值未设,系统默认为default 
    <property name="cacheName" value="mailbill"/>-->
  </bean>
</beans>



基本的配置及代码就写完了,现在写几个测试方法测试一下;MemcachedTest.java

package com.mailbill;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.mailbill.datacore.dao.HuserDao;
import com.mailbill.datacore.entity.Huser;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:applicationContext-jdbc-base.xml")
public class MemcachedTest extends AbstractJUnit4SpringContextTests {
	
	@Autowired
	private HuserDao dao;
	
	@Test
	public void save(){
		
		Huser user = new Huser();
		
		user.seth_name("hahah");
		user.seth_age(21);
		
		try {
			long userid = dao.addHuser(user);
			System.out.println(userid);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	@Test
	public void get(){
		try {
			Huser user  = dao.getHuserById(1);
			System.out.println(user);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	@Test
	public void update(){
		try {
			Huser user  = dao.getHuserById(2);
			
			user.seth_age(24);
			user.seth_name("xiaolongnv");
			
			dao.modHuser(user);
			
			
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	@Test
	public void delete(){
		
		try {
			dao.delUser(2);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}



测试的时候可以使用MemcacheD Manager 工具进行监控memcached 的缓存状态,如图:

 

  • 大小: 63.4 KB
分享到:
评论
5 楼 CJaver 2014-10-24  
<script>alert("111");</script>
4 楼 CJaver 2014-10-24  
[list]
  • [list]
  • [*][list]
  • [*][*][list]
  • [*][*][*][list]
  • [*][*][*][*][list]
  • [*][*][*][*][*][list]
  • [*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][img][list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*]
    引用
    [list] [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*] [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][/list][/img]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][/list]
  • [*][*][*][*][*][/list]
  • [*][*][*][*][/list]
  • [*][*][*][/list]
  • [*][*][/list]
  • [*][/list]
  • [/list]
  • [/list]
    3 楼 CJaver 2014-10-24  
    [/flash]
    ||||||||||||||
    |||||||||||||
    |||||||||||||
    ||||||||||||
    ||||||||||||
    |||||||||||
    |||||||||||
    ||||||||||
    ||||||||||
    |||||||||
    |||||||||
    ||||||||
    ||||||||
    |||||||
    |||||||
    ||||||
    ||||||
    |||||
    |||||
    ||||
    ||||
    |||
    |||
    ||
    ||
    |
    |
    2 楼 fxc13120 2014-02-10  
     <!-- 该Memcached配置的Cache名称 一个应用中存在多个Memcached时,各个配置的cacheName必须不同。如果该值未设,系统默认为default   
        <property name="cacheName" value="mailbill"/>-->  

    这一地方添加的cacheName,还得在Dao类上@CacheName("mailbill"),否则就会出错
    1 楼 yzhw 2013-11-18  
    分页查询能缓存吗?如果缓存了,更新某个记录后,分页查询能缓存会更新吗?

    相关推荐

      SSM整合Redis做缓存

      综上所述,SSM整合Redis做缓存是提高系统性能的有效手段,涉及到Spring框架的组件管理、Spring MVC的请求处理以及MyBatis的数据库操作,通过Redis实现了高效的数据缓存。在实际开发中,理解并熟练掌握这些知识点,...

      ssm框架整合redis实现缓存

      4. **整合Spring Cache**:如果使用Spring Cache,可以在配置中开启Redis作为缓存提供者,并指定注解如`@Cacheable`、`@CacheEvict`等的缓存名称。这样,通过注解即可实现方法级别的缓存管理。 5. **SSM中的拦截器*...

      (SSM框架)memcached整合Spring基于Cache注解.

      在SSM框架中引入Memcached并基于Spring的Cache注解进行整合,可以实现高效、分布式的数据缓存,提升系统性能。下面将详细阐述这一过程中的关键知识点。 1. **Memcached介绍**: Memcached是一款高性能、分布式的...

      SSM整合Redis缓存Demo

      SSM整合Redis缓存Demo是基于Spring、SpringMVC和MyBatis的高效开发框架,进一步结合了Redis作为缓存技术的示例项目。这个Demo适用于开发者在MyEclipse或Eclipse环境中导入并配置数据库,只要本地已安装Redis服务器,...

      超市订单管理系统——SSM实现

      本项目“超市订单管理系统——SSM实现”正是基于这样的需求,利用主流的Spring、SpringMVC和MyBatis(简称SSM)三大框架进行开发,旨在提供一个完整、功能完善的订单管理解决方案。下面,我们将深入探讨该系统的实现...

      SSM整合memcached缓存

      SSM整合Memcached缓存是将Spring、SpringMVC和MyBatis这三大Java Web开发框架与Memcached相结合,以实现高效的数据缓存功能。Memcached是一款轻量级的分布式内存对象缓存系统,用于减少数据库负载,提高应用程序性能...

      SSM框架Spring memcached整合基于注解形式

      在这个项目中,我们将探讨如何将Spring与memcached缓存系统进行整合,以提高应用程序的性能和响应速度。Memcached是一款高性能、分布式内存对象缓存系统,用于临时存储中间结果或频繁访问的数据,从而减轻数据库的...

      基于SSM框架,通过spring注解的方式,实现redis的数据缓存机制,将mysql的数据缓存到redis数据库.zip

      本项目主题聚焦于“基于SSM框架,通过spring注解的方式,实现redis的数据缓存机制,将mysql的数据缓存到redis数据库”,这涉及到Java开发中的多个核心技术。首先,我们来逐一解析这些知识点。 **1. SSM框架** SSM...

      Java EE互联网轻量级框架整合开发 SSM框架(Spring MVC+Spring+MyBatis)和Redis实现.rar

      Java EE互联网轻量级框架整合开发,主要集中在SSM框架的使用上,即Spring MVC、Spring和MyBatis的集成,以及Redis缓存技术的引入。这个主题旨在提高Web应用的开发效率,优化性能,同时降低项目的复杂度。 首先,...

      基于SSM框架的考试管理系统+说明书+ppt+sql文件

      综上所述,基于SSM框架的考试管理系统集成了Java Web开发的主流技术,提供了完整的功能和高效的性能,为在线考试提供了可靠的解决方案。无论是对于开发者还是使用者,都能从中受益,提升考试管理的效率和质量。

      SSM与memcached整合项目Spring Cache

      4. **启用Spring Cache**:在Spring配置文件中,使用`@EnableCaching`注解启用缓存功能。 5. **使用注解**:在业务逻辑的方法上使用`@Cacheable`、`@CacheEvict`和`@CachePut`注解,指定缓存的名称和键生成策略。...

      Spring4.0+SpringMVC4.0+Mybatis3.2框架整合例子(SSM) 自动生成代码

      SSM框架整合是Java开发中常见的技术组合,包括Spring 4.0、Spring MVC 4.0和Mybatis 3.2。这三个组件一起构建了一个强大的后端开发环境,能够处理复杂的业务逻辑、数据访问以及用户界面交互。下面将详细阐述这三个...

      SSM架构+redis缓存实例环境搭建

      接下来,我们将介绍如何将Redis缓存整合到SSM架构中: 1. Redis安装与配置:下载并安装Redis服务器,配置相关参数如端口、密码等,确保服务能够正常启动和运行。 2. 添加Redis客户端库:在项目中引入Jedis或...

      基于SSM框架的社区医院信息管理系统设计与实现.zip

      《基于SSM框架的社区医院信息管理系统设计与实现》 在信息技术日新月异的今天,社区医院的信息管理系统的建设显得尤为重要。本项目是作者在学习Java编程时,利用SSM(Spring、SpringMVC、MyBatis)框架构建的一个...

      ssm集成redis和shiro

      4. **使用Redis**: 在业务代码中,通过@Autowired注解注入RedisTemplate,实现数据的缓存操作。 **集成Shiro** 1. **引入依赖**: 添加Shiro的Maven或Gradle依赖,包括核心库、Web支持和任何必要的扩展。 2. **配置...

      Java SSM 航空票务管理系统 spring,mybatis,hibernate

      本文将深入探讨使用Java SSM框架(Spring、MyBatis、Hibernate)构建的航空票务管理系统的关键技术与实现细节。 1. Spring框架:作为Java企业级应用的核心框架,Spring提供了依赖注入(DI)和面向切面编程(AOP)等功能...

      SSM实现的CMS建站系统等.zip

      SSM框架,全称为Spring、SpringMVC和MyBatis的集成框架,是Java Web开发中常用的一种技术栈。这个“SSM实现的CMS建站系统”是一个基于SSM框架构建的内容管理系统,它具备完善的功能和无误的业务逻辑,为用户提供了...

      SSM整合包 spring+springMVC+Mybatis+bootstarp以及文件上传与下载

      综上所述,这个SSM整合包涵盖了后端开发的主要方面,包括核心框架的集成、Web MVC的实现、数据库操作的简便化以及前端UI的快速构建。同时,它还提供了文件操作的实践,这对于一个完整的Web应用来说是不可或缺的。...

      simple-spring-memcached(ssm) 和spring的集成

      `Simple-Spring-Memcached (SSM)` 是一个开源项目,它提供了将 `Memcached` 缓存系统与 `Spring` 框架无缝集成的解决方案。通过 `SSM`,开发者可以方便地在 `Spring` 应用程序中利用 `Memcached` 的高效缓存能力,...

      使用 SSM(Spring MVC + Spring + MyBatis)框架实现申报项目信息管理系统实验报告

      ### 使用SSM(Spring MVC + Spring + MyBatis)框架实现申报项目信息管理系统的知识点解析 #### 一、实验目标 1. **掌握MyBatis框架**: - MyBatis是一个优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射...

    Global site tag (gtag.js) - Google Analytics