zoukankan      html  css  js  c++  java
  • redis+spring 整合

    最近在研究redis也结合了许多网上的资料分享给大家,有些不足的还望大家多补充提点,下面直接进入主题。

    结构图:

    几个redis的核心jar,spring的一些jar自行导入

    接下来开始配置项目:

    1、配置文件

    redis.properties

    redis.host = 192.168.76.76
    redis.port = 6379
    redis.pass = admin
    redis.maxIdle = 200
    redis.maxActive = 1024
    redis.maxWait = 10000
    redis.testOnBorrow = true

    spring-redis.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" 
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:jee="http://www.springframework.org/schema/jee" 
        xmlns:jdbc="http://www.springframework.org/schema/jdbc"
        xmlns:cache="http://www.springframework.org/schema/cache"
        xmlns:jaxws="http://cxf.apache.org/jaxws"
        xmlns:jaxrs="http://cxf.apache.org/jaxrs"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
                         http://www.springframework.org/schema/beans/spring-beans.xsd
                         http://www.springframework.org/schema/tx
                         http://www.springframework.org/schema/tx/spring-tx.xsd
                         http://www.springframework.org/schema/context 
                         http://www.springframework.org/schema/context/spring-context.xsd
                         http://www.springframework.org/schema/aop
                         http://www.springframework.org/schema/aop/spring-aop.xsd
                         http://www.springframework.org/schema/jee
                         http://www.springframework.org/schema/jee/spring-jee-3.1.xsd
                         http://www.springframework.org/schema/jdbc
                         http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd
                         http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.2.xsd 
                         http://cxf.apache.org/jaxws
                         http://cxf.apache.org/schemas/jaxws.xsd
                         http://cxf.apache.org/jaxrs
                         http://cxf.apache.org/schemas/jaxrs.xsd"  default-autowire="byName" >
    
        <!-- 引入配置文件 -->
        <context:property-placeholder location="classpath:/resource/redis.properties"/>
        
        <!-- 连接池基本参数配置,类似数据库连接池 -->
        <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
            <property name="maxIdle" value="${redis.maxIdle}" />
            <property name="testOnBorrow" value="${redis.testOnBorrow}"/>
        </bean>
        
        <!-- 连接池配置,类似数据库连接池 -->
        <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" >
            <property name="hostName" value="${redis.host}"></property>
            <property name="port" value="${redis.port}"></property>
            <property name="password" value="${redis.pass}"></property>
            <property name="poolConfig"  ref="poolConfig"></property> 
        </bean>
        
        <!-- 调用连接池工厂配置 -->
        <bean id="redisTemplate" class=" org.springframework.data.redis.core.RedisTemplate">
            <property name="connectionFactory" ref="connectionFactory"></property>
            <!-- 自定义json序列化存储 -->
            <!--  <property name="defaultSerializer">  
                <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>  
            </property>   -->
            
            <!-- 如果不配置Serializer,那么存储的时候智能使用String,如果用User类型存储,那么会提示错误User can't cast   
            to String!!! -->  
             <property name="keySerializer">  
                <bean  
                class="org.springframework.data.redis.serializer.StringRedisSerializer" />  
            </property>  
            <property name="valueSerializer">  
                <bean  
                    class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />  
            </property> 
        </bean>
    </beans>

    spring-source.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" 
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:jee="http://www.springframework.org/schema/jee" 
        xmlns:jdbc="http://www.springframework.org/schema/jdbc"
        xmlns:cache="http://www.springframework.org/schema/cache"
        xmlns:jaxws="http://cxf.apache.org/jaxws"
        xmlns:jaxrs="http://cxf.apache.org/jaxrs"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
                         http://www.springframework.org/schema/beans/spring-beans.xsd
                         http://www.springframework.org/schema/tx
                         http://www.springframework.org/schema/tx/spring-tx.xsd
                         http://www.springframework.org/schema/context 
                         http://www.springframework.org/schema/context/spring-context.xsd
                         http://www.springframework.org/schema/aop
                         http://www.springframework.org/schema/aop/spring-aop.xsd
                         http://www.springframework.org/schema/jee
                         http://www.springframework.org/schema/jee/spring-jee-3.1.xsd
                         http://www.springframework.org/schema/jdbc
                         http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd
                         http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.2.xsd 
                         http://cxf.apache.org/jaxws
                         http://cxf.apache.org/schemas/jaxws.xsd
                         http://cxf.apache.org/jaxrs
                         http://cxf.apache.org/schemas/jaxrs.xsd"  default-autowire="byName" >
    
        <context:annotation-config />
        <!-- 扫描注解web整合时用 -->
        <context:component-scan base-package="com.tp.soft.*" />
        
        <bean id="jsonSerializer" class="com.tp.soft.base.redis.JsonRedisSeriaziler"/>  
        <bean id="userDao" class="com.tp.soft.dao.impl.UserDaoImpl" />
    </beans>

    2、配置公用Dao

    AbstractBaseRedisDao.java

    package com.tp.soft.base.dao;
    
    import java.io.Serializable;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.serializer.RedisSerializer;
    
    import com.tp.soft.base.redis.JsonRedisSeriaziler;
    
    /**
     * @author taop
     *
     * @param <K>
     * @param <V>
     */
    
    public abstract class AbstractBaseRedisDao<K extends Serializable, V extends Serializable> {
        
        @Autowired
        protected RedisTemplate<K, V> redisTemplate;
        
        //json转换时用 若用系统自带序列对象可不写
        @Autowired
        private JsonRedisSeriaziler jsonSerializer;
        
        /**
         * 注入
         * 设置redisTemplate
         * @param redisTemplate
         */
        public void setRedisTemplate(RedisTemplate<K, V> redisTemplate){
            this.redisTemplate = redisTemplate;
        }
        
    
        //json转换时用 若用系统自带序列对象可不写
        public void setJsonRedisSeriaziler(JsonRedisSeriaziler jsonSerializer) {
            this.jsonSerializer = jsonSerializer;
        }
    
    
        //json转换时用 若用系统自带序列对象可不写
        protected String getRedisSerializer(Object obj){
            return jsonSerializer.seriazileAsString(obj);
        }
        
        //json转换时用 若用系统自带序列对象可不写
        protected <T> T deserRedisSerializer(String str, Class<T> clazz){
            return jsonSerializer.deserializeAsObject(str, clazz);
        }
        
         /**
          * 方法一
           * 获取 RedisSerializer
           * <br>------------------------------<br>
           */ 
          protected RedisSerializer<String> getRedisSerializer() { 
            return redisTemplate.getStringSerializer(); 
          }
    }

    3、若调用jackson 序列化对象 则新建, 若默认序列化对象可不创建

    JsonRedisSeriaziler.java

    package com.tp.soft.base.redis;
    
    import java.nio.charset.Charset;
    
    import org.apache.commons.lang.SerializationException;
    import org.codehaus.jackson.map.ObjectMapper;
    
    public class JsonRedisSeriaziler {
        public static final String EMPTY_JSON = "{}";  
        
        public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");  
          
        protected ObjectMapper objectMapper = new ObjectMapper();  
        public JsonRedisSeriaziler(){}  
          
        /** 
         * java-object as json-string 
         * @param object 
         * @return 
         */  
        public String seriazileAsString(Object object){  
            if (object== null) {  
                return EMPTY_JSON;  
            }  
            try {  
                return this.objectMapper.writeValueAsString(object);  
            } catch (Exception ex) {  
                throw new SerializationException("Could not write JSON: " + ex.getMessage(), ex);  
            }  
        }  
          
        /** 
         * json-string to java-object 
         * @param str 
         * @return 
         */  
        public <T> T deserializeAsObject(String str,Class<T> clazz){  
            if(str == null || clazz == null){  
                return null;  
            }  
            try{  
                return this.objectMapper.readValue(str, clazz);  
            }catch (Exception ex) {  
                throw new SerializationException("Could not write JSON: " + ex.getMessage(), ex);  
            }  
        }  
    }

    4、实体类

    AuUser.java

    package com.tp.soft.entity;
    
    import java.io.Serializable;
    
    public class AuUser implements Serializable{
    
        /**
         * 
         */
        private static final long serialVersionUID = -1695973853274402680L;
        
        private String id;
        
        private String username;
        
        private String password;
    
        
        public AuUser() {
            
        }
    
        public AuUser(String id, String username, String password) {
            super();
            this.id = id;
            this.username = username;
            this.password = password;
        }
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        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;
        }
        
        
    }

    5、接口

    UserDao.java

    package com.tp.soft.dao;
    
    import java.util.List;
    
    import com.tp.soft.entity.AuUser;
    
    public interface UserDao {
        boolean add(AuUser auUser) ;
        boolean add(List<AuUser> list);
        void delete(String key);
        void delete(List<String> keys);
        boolean update(AuUser auUser);
        AuUser get(String keyId);
    }

    6、接口实现类

    UserDaoImpl.java

    package com.tp.soft.dao.impl;
    
    import java.io.Serializable;
    import java.util.List;
    
    import org.springframework.dao.DataAccessException;
    import org.springframework.data.redis.connection.RedisConnection;
    import org.springframework.data.redis.core.BoundValueOperations;
    import org.springframework.data.redis.core.RedisCallback;
    import org.springframework.data.redis.core.ValueOperations;
    import org.springframework.data.redis.serializer.RedisSerializer;
    
    import com.tp.soft.base.dao.AbstractBaseRedisDao;
    import com.tp.soft.dao.UserDao;
    import com.tp.soft.entity.AuUser;
    
    public class UserDaoImpl extends AbstractBaseRedisDao<String, AuUser> implements UserDao{
    
        @Override
        public boolean add(final AuUser auUser) {
    //         this.redisTemplate.opsForValue().set("pwd", "123456");
    //         ValueOperations<String, String> operations = redisTemplate
    //                .opsForValue();
    //         String redisSerializer = getRedisSerializer(auUser);
    //         operations.set("user:"+auUser.getId(), redisSerializer);
    //         return true;
             
            //方法一
    //        redisTemplate.execute(new RedisCallback<Object>() { 
    //            public Object doInRedis(RedisConnection connection) 
    //                    throws DataAccessException {
    //                RedisSerializer<String> serializer = getRedisSerializer(); 
    //                byte[] key  = serializer.serialize(auUser.getId()); 
    //                byte[] name = serializer.serialize(auUser.getUsername()); 
    //                connection.set(key, name);
    //                return null;
    //              } 
    //        }); 
             
            //方法二
             ValueOperations<String, AuUser> valueOps = redisTemplate.opsForValue();  
             valueOps.set(auUser.getId(), auUser);
            
             return true;
        }
    
    
        @Override
        public AuUser get(final String keyId) {
            //System.out.println(this.redisTemplate.opsForValue().get("pwd"));
    //        ValueOperations<String, String> operations = redisTemplate
    //                .opsForValue();
    //        String json = operations.get("user:"+keyId);
    //        return deserRedisSerializer(json, AuUser.class);
            //return null;
            
            //方法一
            /*AuUser result = redisTemplate.execute(new RedisCallback<AuUser>() { 
                  public AuUser doInRedis(RedisConnection connection) 
                      throws DataAccessException { 
                    RedisSerializer<String> serializer = getRedisSerializer(); 
                    byte[] key = serializer.serialize(keyId); 
                    byte[] value = connection.get(key); 
                    if (value == null) { 
                      return null; 
                    } 
                    String nickname = serializer.deserialize(value); 
                    return new AuUser(keyId, nickname, "1234"); 
                  } 
                }); 
                return result; */
        
            
            //方式2:不在redistemplate中配置Serializer,而是在Service的实现类中单独指定Serializer。  
            BoundValueOperations<String, AuUser> boundValueOps = redisTemplate.boundValueOps(keyId);  
            AuUser user = (AuUser) boundValueOps.get();  
            return user;  
        }
        
        @Override
        public boolean add(List<AuUser> list) {
            // TODO Auto-generated method stub
            return false;
        }
    
        @Override
        public void delete(String key) {
            // TODO Auto-generated method stub
            
        }
    
        @Override
        public void delete(List<String> keys) {
            // TODO Auto-generated method stub
            
        }
    
        @Override
        public boolean update(AuUser auUser) {
            // TODO Auto-generated method stub
            return false;
        }
    }

     6、junit测试类

    RedisZhTest.java

    package junit;
    
    import junit.framework.Assert;
    
    import org.junit.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
    
    import com.tp.soft.dao.UserDao;
    import com.tp.soft.entity.AuUser;
    
    @ContextConfiguration(locations = {"classpath:/resource/spring-*.xml"})
    public class RedisZhTest extends AbstractJUnit4SpringContextTests{
        @Autowired
        private UserDao userDao;
        
        @Test
        public void testAddUser(){
            AuUser user = new AuUser();
            user.setId("1");
            user.setUsername("taop");
            user.setPassword("12345");
            boolean result = userDao.add(user);
            //Assert.assertTrue(result);
            AuUser auUser = userDao.get("1");
            System.out.println(auUser.getUsername());
            System.out.println(auUser.getPassword());
        }
    }

    结果打印:

  • 相关阅读:
    elasticsearch 相关命令
    Ubuntu server 修改系统时区
    js-eval运算符
    js-带操作的赋值表达式
    MVC模型绑定
    MVC部分视图的使用
    C#面试题-递归
    C#校验手机端或客户端
    AngularJs 中使用OpenLayer例子,手机端地图加载不显示问题
    C#后端调用WebApi地址
  • 原文地址:https://www.cnblogs.com/tplovejava/p/7130787.html
Copyright © 2011-2022 走看看