redis和spring集成(注解实现,方便,快捷)

前言:

         spring和redis集成有很多方式,看到网上很多都是使用redistemplate自己去做redis 的一些操作,但是对于我们开发来说,肯定是使用越方便越好,于是乎就有了spring的对redis或者memcahe这些换成框架的封装,只需要引入spring的spring-data-redis的jar。 

         好了,废话不多说,我们开始上代码。


工程目录结构

        我们先预览一下这个项目的工程目录结构先:

redis和spring集成(注解实现,方便,快捷)_第1张图片

启动redis

        还没安装的redis 的同学可以自己去安装redis,我自己是在window上安装的,其实也不是安装,解压一下就可以使用了,不过需要注意的是它的启动方式,直接点击redis-server启动会直接闪退的,正确的启动方式使用命令【redis-server.exe  redis.windows.conf】,详细请参考:Windows 64位下安装Redis详细教程

redis和spring集成(注解实现,方便,快捷)_第2张图片


创建数据库

redis和spring集成(注解实现,方便,快捷)_第3张图片


配置pom文件

pom文件就没什么好说的了,直接贴配置给大家吧


	4.0.0
	ylink.com
	spring-redis-test
	0.0.1-SNAPSHOT
	war
	

	
		4.2.6.RELEASE
		1.6.4
		1.0.0
		4.9
		UTF-8
	

	
		
		
			org.springframework
			spring-core
			${spring.version}
			
				
					commons-logging
					commons-logging
				
			
		
		
			org.springframework
			spring-beans
			${spring.version}
		
		
			org.springframework
			spring-webmvc
			${spring.version}
		
		
			org.springframework
			spring-context
			${spring.version}
		
		
			org.springframework
			spring-context-support
			${spring.version}
		
		
			org.springframework
			spring-expression
			${spring.version}
		
		
			org.springframework
			spring-orm
			${spring.version}
		
		
			org.springframework
			spring-aop
			${spring.version}
		
		
			org.springframework
			spring-test
			${spring.version}
			test
		
		
			org.mybatis
			mybatis-spring
			1.1.1
		
		
		
			junit
			junit
			${junit.version}
			test
		

		
		
			commons-lang
			commons-lang
			2.6
		
		
			org.mybatis
			mybatis
			3.2.2
		
		
		
			org.slf4j
			slf4j-api
			${slf4j.version}
		
		
			ch.qos.logback
			logback-classic
			${logback.version}
			test
		
		
			commons-logging
			commons-logging
			1.1.1
		
		
			redis.clients
			jedis
			2.8.1
		
		
			org.springframework.data
			spring-data-redis
			1.7.2.RELEASE
		
		
			mysql
			mysql-connector-java
			5.1.31
		
		
			com.jolbox
			bonecp
			0.7.1.RELEASE
		
	



配置spring文件


下面是spring-mvc.xml的配置


      
      
    
    
    
    
    
    
    
		  
	 
    
  


下面是spring-redis.xml的配置

 
    
      

      
      
    
       
       
            
           
           
       

       
  
       
           
       
    
       
       
           
              
                
                  
                  
                       
                       
                     
                
              
           
       
    
  

下面是spring-datasource-bonecp.xml配置



	
	
          
          
          
          
          
          
          
        
        
        
        
		
	
 
	
	
		
		
		
		
		
	  
 
	
		
		
	


编写java类

直接上service,其他的大家可以自己去我上传的源码去下载查看,至于对spring的缓存的注解不太了解怎么使用的,可以参考下这边博客园博主写的博文:Spring Cache使用详解


package com.cn.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import com.cn.bean.User;
import com.cn.dao.UserDao;

/**
 * @类名称: UserServiceImpl
 * @类描述: 
 * @创建人: 1603254
 * @创建时间: 2016-12-2 上午11:10:33
 *
 * @修改人: 1603254
 * @操作时间: 2016-12-2 上午11:10:33
 * @操作原因: 
 * 
 */
@Service
public class UserServiceImpl implements UserService{

	@Autowired
	private UserDao userDao;

	@Cacheable(value="common",key="'id_'+#id")
	public User selectByPrimaryKey(Integer id) {
		System.out.println("======================");
		System.out.println("======================");
		System.out.println("======================");
		return userDao.selectByPrimaryKey(id);
	}
	
	@CachePut(value="common",key="#user.getUserName()")
	public void insertSelective(User user) {
//		userDao.insertSelective(user);
		System.out.println("########################");
		System.out.println("########################");
		System.out.println("########################");
	}

	@CacheEvict(value="common",key="'id_'+#id")
	public void deleteByPrimaryKey(Integer id) {
//		userDao.deleteByPrimaryKey(id);
		System.out.println("******************************");
		System.out.println("******************************");
		System.out.println("******************************");
	}
}


编写mybatis配置文件

下面是cfg.xml配置文件

  
  
  
	   
	   
          
      
     


下面是UserMapper.xml配置




  
  
	    
	    
  
 
 
 insert into user(id,name) values(#{id,jdbcType=CHAR},#{name,jdbcType=VARCHAR})
 

 

 



配置web.xml




	spring-redis-test
	
		index.html
		index.htm
		index.jsp
		default.html
		default.htm
		default.jsp
	


	
		SpringMVC
		org.springframework.web.servlet.DispatcherServlet
		
			contextConfigLocation
			classpath:spring-mvc.xml
		
		1
		true
	



编写测试用例

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;

import com.cn.bean.User;
import com.cn.service.UserService;


@ContextConfiguration(locations="classpath:spring-mvc.xml")
public class Test extends AbstractJUnit4SpringContextTests {

	@Autowired
	private UserService userService;
	
	
	
	@org.junit.Test
	public void  add(){
		User user=new User();
		user.setName("wen");
		user.setId("1");
		userService.insertSelective(user);
	}
	
	
	@org.junit.Test
	public void  query(){
		User user=userService.selectByPrimaryKey(1);
		System.out.println(user.toString());
	}
}

上面我是这样执行校验的: 
1)先把数据库的操作打开,插入一条数据,插入的时候,数据库会插入一条数据,redis里面也会有一条数据。
2)然后执行查询的测试用例,第一次查询会将数据库的数据查到redis,然后第二次直接从redis里面去查询,你可以把数据库的数据删掉,结果显示是可以从redis里面查询出来

上面代码我都测试过,无措执行,部分缺少的java类,可以直接下载demo查看,有问题大家可以提出来讨论一下,谢谢~

源代码下载

下载地址是:spring集成redis源码+表结构



其实说实话,用起来还是蛮简单的,而且方便,快捷,真正想要了解深入一点的话,还是建议有时间去看看源代码。



后面大家评论说RedisCache类没写给出来,下面给一下(链接里面的demo 有Override 注解删除就可以使用了):

package com.cn.util;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import org.springframework.cache.Cache;
import org.springframework.cache.support.SimpleValueWrapper;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;

public class RedisCache implements Cache{

	private RedisTemplate redisTemplate;  
    private String name;  
    public RedisTemplate getRedisTemplate() {
	    return redisTemplate;  
	}
	 
	public void setRedisTemplate(RedisTemplate redisTemplate) {
	    this.redisTemplate = redisTemplate;  
	}
	 
	public void setName(String name) {
	    this.name = name;  
    }
	 
    public String getName() {
       // TODO Auto-generated method stub  
        return this.name;  
    }

    public Object getNativeCache() {
      // TODO Auto-generated method stub  
        return this.redisTemplate;  
    }
 
    public ValueWrapper get(Object key) {
      // TODO Auto-generated method stub
      System.out.println("get key");
      final String keyf =  key.toString();
      Object object = null;
      object = redisTemplate.execute(new RedisCallback() {
      public Object doInRedis(RedisConnection connection)  
                  throws DataAccessException {
          byte[] key = keyf.getBytes();
          byte[] value = connection.get(key);
          if (value == null) {
             return null;
            }
          return toObject(value);
          }
       });
        return (object != null ? new SimpleValueWrapper(object) : null);
      }
  
     public void put(Object key, Object value) {
       // TODO Auto-generated method stub
       System.out.println("put key");
       final String keyf = key.toString();  
       final Object valuef = value;  
       final long liveTime = 86400;  
       redisTemplate.execute(new RedisCallback() {  
           public Long doInRedis(RedisConnection connection)  
                   throws DataAccessException {  
                byte[] keyb = keyf.getBytes();  
	            byte[] valueb = toByteArray(valuef);  
	            connection.set(keyb, valueb);  
	            if (liveTime > 0) {  
	                connection.expire(keyb, liveTime);  
                 }  
                return 1L;  
             }  
         });  
      }

      private byte[] toByteArray(Object obj) {  
         byte[] bytes = null;  
         ByteArrayOutputStream bos = new ByteArrayOutputStream();  
         try {  
           ObjectOutputStream oos = new ObjectOutputStream(bos);  
           oos.writeObject(obj);  
           oos.flush();  
           bytes = bos.toByteArray();  
           oos.close();  
           bos.close();  
	      }catch (IOException ex) {  
	           ex.printStackTrace();  
	      }  
	      return bytes;  
	    }  

	   private Object toObject(byte[] bytes) {
         Object obj = null;  
	       try {
	           ByteArrayInputStream bis = new ByteArrayInputStream(bytes);  
	           ObjectInputStream ois = new ObjectInputStream(bis);  
	           obj = ois.readObject();  
	           ois.close();  
	           bis.close();  
	       } catch (IOException ex) {  
	           ex.printStackTrace();  
	        } catch (ClassNotFoundException ex) {  
	           ex.printStackTrace();  
	        }  
	        return obj;  
        }
  
       public void evict(Object key) {  
         // TODO Auto-generated method stub  
    	 System.out.println("del key");
         final String keyf = key.toString();  
         redisTemplate.execute(new RedisCallback() {  
         public Long doInRedis(RedisConnection connection)  
                   throws DataAccessException {  
             return connection.del(keyf.getBytes());  
            }  
          });  
        }
 
	    public void clear() {  
	       // TODO Auto-generated method stub  
	    	System.out.println("clear key");
	       redisTemplate.execute(new RedisCallback() {  
	            public String doInRedis(RedisConnection connection)  
	                    throws DataAccessException {  
	              connection.flushDb();  
	                return "ok";  
	           }  
	       });  
	    }

		public  T get(Object key, Class type) {
			// TODO Auto-generated method stub
			return null;
		}
	
		public ValueWrapper putIfAbsent(Object key, Object value) {
			// TODO Auto-generated method stub
			return null;
		}

} 
  


你可能感兴趣的:(缓存,redis)