博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用spring整合SSM实现注解式的缓存系统
阅读量:7015 次
发布时间:2019-06-28

本文共 5006 字,大约阅读时间需要 16 分钟。

  hot3.png

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

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

这是针对xmemcached 客户端
        
com.google.code.simple-spring-memcached
        
xmemcached-provider
        
3.1.0
    
这是针对spymemcached客户端    
        
com.google.code.simple-spring-memcached
        
spymemcached-provider
        
3.1.0
    

这是我的数据库实体类: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

基本的配置及代码就写完了,现在写几个测试方法测试一下;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 的缓存状态,如图:

转载于:https://my.oschina.net/ohalo/blog/1619687

你可能感兴趣的文章
VertexBuffer渲染次序
查看>>
div高度自适应
查看>>
python中使用 xpath
查看>>
集中管理:领导者,不能不考虑的几件事之—— 拿什么辅助你,我的决策?(一)...
查看>>
四、物理优化(6)数据库引擎优化顾问
查看>>
我的友情链接
查看>>
关于VirtualBox虚拟机安装GhostXP出现蓝屏proce***.sys 的解决办法
查看>>
浅谈 C#委托
查看>>
Atitit.跨语言反射api 兼容性提升与增强 java c#。Net php js
查看>>
【Thread】多线程的异常处理?
查看>>
H.264 CODEC
查看>>
计算机图形学中的经常使用模型
查看>>
Android生成keystore是报错拒绝访问
查看>>
JSP如何在servlet将一个数据模型对象传递给jsp页面
查看>>
PHP 实现“贴吧神兽”验证码
查看>>
根据一个表的数据情况显示另一个表的数据
查看>>
Python中的类
查看>>
【摘】请问make -j8 和make -j4 是什么意思?什么作用?
查看>>
iOS 10 的适配问题-b
查看>>
linux设备驱动编写_tasklet机制
查看>>