spring+redis 实现缓存 解决序列化和反序列化的问题

1.config.properties

# Redis settings
redis.host=127.0.0.1
redis.port=6379  
#redis.pass=password
redis.dbIndex=0  
redis.expiration=3000  
redis.maxIdle=300  
redis.maxActive=600  
redis.maxWait=1000  
redis.testOnBorrow=true


2.spring-context.xml


 
            
              
     



      
      
         
          classpath:config.properties  
          classpath:pgsql-config.properties  
          
      
  
    
    
    
    
    

    
   
    
    
    
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
    
    
    
        
    

    
    
    
    
        
        
        
            
                classpath:mapper/*.xml
            
        
    

    
    
        
        
    
    
    
    
  

3.spring-redis.xml



    
    
     
        
        
        
        
    

    
    
        
        
        
        
        
    
 
    
        
        
        
       
        
        
        
        
        
    
 
 
 
   
    
    
    
    
    
    
    
        
        
    

    
    
        
        
        
    



4.FastJsonRedisSerializer

package com.bigname.common.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;
import org.springframework.util.Assert;

import java.io.ByteArrayOutputStream;
import java.nio.charset.Charset;

public class FastJsonRedisSerializer implements RedisSerializer{

      private final Charset charset;

        private final String target = "\"";

        private final String replacement = "";

        public FastJsonRedisSerializer() {
            this(Charset.forName("UTF8"));
        }

        public FastJsonRedisSerializer(Charset charset) {
            Assert.notNull(charset, "Charset must not be null!");
            this.charset = charset;
        }

        @Override
        public String deserialize(byte[] bytes) {
            return (bytes == null ? null : new String(bytes, charset));
        }

        @Override
        public byte[] serialize(Object object) {
            String string = JSON.toJSONString(object);
            if (string == null) {
                return null;
            }
            string = string.replace(target, replacement);
            return string.getBytes(charset);
        }


}
5.RedisCacheConfig

package com.bigname.common.utils;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import com.fasterxml.jackson.databind.ObjectMapper;

@Configuration  
@EnableCaching
public class RedisCacheConfig extends CachingConfigurerSupport{

    private volatile JedisConnectionFactory jedisConnectionFactory;
    private volatile RedisTemplate redisTemplate;
    private volatile RedisCacheManager redisCacheManager;

    public RedisCacheConfig() {
        super();
    }

    /**
     * 带参数的构造方法 初始化所有的成员变量
     * 
     * @param jedisConnectionFactory
     * @param redisTemplate
     * @param redisCacheManager
     */
    public RedisCacheConfig(JedisConnectionFactory jedisConnectionFactory, RedisTemplate redisTemplate,
            RedisCacheManager redisCacheManager) {
        this.jedisConnectionFactory = jedisConnectionFactory;
        this.redisTemplate = redisTemplate;
        this.redisCacheManager = redisCacheManager;
    }

    public JedisConnectionFactory getJedisConnecionFactory() {
        return jedisConnectionFactory;
    }

    public RedisTemplate getRedisTemplate() {
        return redisTemplate;
    }

    public RedisCacheManager getRedisCacheManager() {
        return redisCacheManager;
    }

    @Bean
    public KeyGenerator customKeyGenerator() {
        return new KeyGenerator() {
            public Object generate(Object target, Method method, Object... objects) {
                StringBuilder sb = new StringBuilder();
                sb.append(target.getClass().getName());
                sb.append(method.getName());
                for (Object obj : objects) {
                    sb.append(obj.toString());
                }
                return sb.toString();
            }
        };
    }
    
    
}


6.实体类

package com.bigname.demo.entity;

import java.io.Serializable;

import com.bigname.common.BaseModel;

public class User extends BaseModel implements Serializable{

    
    /**
     * 
     */
    private static final long serialVersionUID = -9187083138474340478L;

    private String userName;
    
    private String password;

    private Integer age;
    

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    
    

}


7.dao

package com.bigname.demo.dao;

import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.bigname.demo.entity.User;

public interface UserDao {

    User selectUser(@Param("userName")String name,@Param("passWord")String password);
    
    int register(User user);
    
    String selectByUserName(String name);
    
    List queryAll();
    
    String selectUserqw();
}


8.UserServiceImpl

package com.bigname.demo.service.impl;

import java.util.List;

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.bigname.demo.dao.UserDao;
import com.bigname.demo.entity.User;
import com.bigname.demo.service.UserService;
@Service
public class UserServiceImpl implements UserService {

     @Autowired
     private UserDao userdao;

     
    public User selectUser(String userName,String password) {
        // TODO Auto-generated method stub
        return userdao.selectUser(userName,password);
    }

    //@Cacheable("getUserById")
    //标注该方法查询的结果进入缓存,再次访问时直接读取缓存中的数据
    @CacheEvict(value="getUserById",allEntries=true) 
    public int insertUser(User user) {
        // TODO Auto-generated method stub
        return userdao.register(user);
    }

    public String selectByUserName(String name) {
        // TODO Auto-generated method stub
        return userdao.selectByUserName(name);
    }

//标注该方法查询的结果进入缓存,再次访问时直接读取缓存中的数据   

 @Cacheable("queryUserAlls")
    public List queryUserAll() {
        // TODO Auto-generated method stub
        return userdao.queryAll();
    }
    
    
    
    public String selectUserqw() {
        // TODO Auto-generated method stub
        return userdao.selectUserqw();
    }

}


9.controller

@RequestMapping(value = "/sys/ls")
        @ResponseBody
        public Object demo1(User users,HttpSession session,HttpServletRequest request){
            String list = userservice.selectUserqw();
            return list;
        }



心得:研究了两天左右,网上又得说法都太离谱了。我这个目前解决了序列化和反序列化的问题,但是还有一个问题就是当一个service出现两个@Cacheable 就可能会失效 也就是说 另外一个@Cacheable也会进入之前的缓存 或者不起作用,这个还在研究,个人能力有限,还望大牛指导,欢迎评论 
  

加群讨论:687942640

你可能感兴趣的:(java,Redis)