zoukankan      html  css  js  c++  java
  • 【原】Spring整合Redis(第二篇)—SDR环境搭建具体步骤

    【环境参数】

    Spring版本:4.2.6.RELEASE
    Spring-Data-Redis版本:1.7.2.RELEASE

    Redis版本:redis-2.4.5-win32-win64

    【简要说明】

    搭建Spring与Reids的环境时,重点在于在Spring容器中配置RedisTemplate和ConnectionFactory,以及封装RedisTemplate组件。

    【具体步骤】

    0、配置pom.xml文件

     1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     2     <modelVersion>4.0.0</modelVersion>
     3     <groupId>com.zjrodger</groupId>
     4     <artifactId>Spring-Redis</artifactId>
     5     <version>0.0.1-SNAPSHOT</version>
     6     <packaging>war</packaging>
     7   
     8     <!-- 定义依赖的版本 -->
     9     <properties>
    10         <spring.version>4.2.6.RELEASE</spring.version>
    11     </properties>
    12   
    13     <dependencies>
    14         <!-- Spring Core -->
    15         <dependency>
    16             <groupId>org.springframework</groupId>
    17             <artifactId>spring-core</artifactId>
    18             <version>${spring.version}</version>
    19         </dependency>    
    20         <dependency>
    21             <groupId>org.springframework</groupId>
    22             <artifactId>spring-beans</artifactId>
    23             <version>${spring.version}</version>
    24         </dependency>
    25         <dependency>
    26             <groupId>org.springframework</groupId>
    27             <artifactId>spring-context</artifactId>
    28             <version>${spring.version}</version>
    29         </dependency>    
    30         <dependency>
    31             <groupId>org.springframework</groupId>
    32             <artifactId>spring-context-support</artifactId>
    33             <version>${spring.version}</version>
    34         </dependency>            
    35         <dependency>
    36             <groupId>org.springframework</groupId>
    37             <artifactId>spring-expression</artifactId>
    38             <version>${spring.version}</version>
    39         </dependency>
    40         
    41         <!-- Spring Transaction -->
    42         <dependency>
    43             <groupId>org.springframework</groupId>
    44             <artifactId>spring-tx</artifactId>
    45             <version>${spring.version}</version>
    46         </dependency>
    47 
    48         <!-- Spring AOP -->
    49         <dependency>
    50             <groupId>org.springframework</groupId>
    51             <artifactId>spring-aop</artifactId>
    52             <version>${spring.version}</version>
    53         </dependency>
    54         <dependency>
    55             <groupId>org.springframework</groupId>
    56             <artifactId>spring-aspects</artifactId>
    57             <version>${spring.version}</version>
    58         </dependency>
    59         <dependency>
    60             <groupId>aopalliance</groupId>
    61             <artifactId>aopalliance</artifactId>
    62             <version>1.0</version>
    63         </dependency>                        
    64                 
    65         <!-- JUnit相关jar包 -->        
    66         <dependency>
    67             <groupId>org.springframework</groupId>
    68             <artifactId>spring-test</artifactId>
    69             <version>${spring.version}</version>
    70         </dependency>
    71 
    72         <!-- Spring-Date-Redis相关 -->
    73         <dependency>
    74             <groupId>org.springframework.data</groupId>
    75             <artifactId>spring-data-redis</artifactId>
    76             <version>1.7.2.RELEASE</version>
    77         </dependency>                
    78          <dependency>
    79             <groupId>redis.clients</groupId>
    80             <artifactId>jedis</artifactId>
    81             <version>2.7.3</version>
    82         </dependency>
    83                               
    84     </dependencies>
    85   
    86 </project>
    pom.xml

    1、配置redis.properties属性文件

    # 连接redis服务的ip
    redis.host=127.0.0.1
    # 连接redis服务的端口
    redis.port=6379
    # 连接redis服务的超时时间(单位:秒)
    redis.timeout=10
    # 连接redis服务的密码
    #redis.password=zjrodger
    # 连接redis服务的数据库
    redis.database=2
    
    # 最大连接数
    redis.maxTotal=5000
    # 最大空闲连接数
    redis.maxIdle=100
    # 最大等待时间:单位(毫秒)
    redis.maxWait=10000
    # 最小空闲连接数
    redis.minIdle=10
    # 在borrow一个jedis实例时,是否提前进行alidate操作;如果为true,则得到的jedis实例均是可用的。
    redis.testOnBorrow=true
    # 在return给pool时,是否提前进行validate操作。
    redis.testOnReturn=true
    # 如果为true,表示有一个idle object evitor线程对idle object进行扫描,如果validate失败,此object会被从pool中drop掉;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义。
    redis.testWhileIdle=false
    redis.properties

    2、在Spring容器中配置RedisTemplate和ConnectionFactory

    在Spring容器中配置RedisTemplate和RedisConnectionFactory的实现类,即JedisConnectionFactory

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
     4     xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
     5     xmlns:p="http://www.springframework.org/schema/p" xmlns:mvc="http://www.springframework.org/schema/mvc"
     6     xmlns:task="http://www.springframework.org/schema/task"
     7     xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
     8         http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd
     9         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    10         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
    11         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
    12         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
    13 
    14     <!-- Spring 扫包 -->
    15     <context:component-scan base-package="com.zjrodger"/>
    16 
    17     <!-- 读取配置文件 -->    
    18     <context:property-placeholder location="classpath:properties/*.properties"/>
    19         
    20     <!-- jedis 配置 -->
    21     <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig" >
    22           <property name="maxIdle" value="${redis.maxIdle}" />
    23           <property name="maxWaitMillis" value="${redis.maxWait}" />
    24           <property name="testOnBorrow" value="${redis.testOnBorrow}" />
    25     </bean >
    26     
    27     <!-- redis服务器中心 -->
    28     <bean id="jedisConnectionFactory"  class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" >
    29           <property name="poolConfig" ref="poolConfig" />
    30           <property name="port" value="${redis.port}" />
    31           <property name="hostName" value="${redis.host}" />
    32           <property name="timeout" value="${redis.timeout}" />
    33           <property name="database" value="${redis.database}" />
    34           <!-- <property name="password" value="${redis.password}"></property> -->
    35     </bean >
    36     
    37     <!-- redisTemplate配置 -->
    38      <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" >
    39           <property name="connectionFactory" ref="jedisConnectionFactory" />
    40     </bean>     
    41 </beans>
    applicationContext-redis.xml

    3、封装RedisTemplate组件。

     1 @Component( value ="redisTemplateFactory" )
     2 public class RedisTemplateFactory {
     3     
     4     @Autowired
     5     private RedisTemplate<String, Object> redisTemplate;
     6     
     7     @SuppressWarnings("rawtypes")
     8     public RedisTemplate getLocalRedisTemplate(){
     9         redisTemplate.setKeySerializer(redisTemplate.getStringSerializer());
    10         return this.redisTemplate;
    11     }
    12 }
    RedisTemplateFactory

    4、准备测试数据:实体类、Dao接口和其实现类。

    (1)封装User实体类

    1 public class User implements Serializable {    
    2     private String userId;    
    3     private String username;    
    4     private String password;
    5     ... 省略 setter()和getter()方法..
    6 }
    User.java

    (2)封装IUserDao接口

     1 public interface IUserDao {
     2     /** 新增 */  
     3     boolean add(User user);  
     4       
     5     /** 批量新增 使用pipeline方式 */  
     6     boolean add(List<User> list);     
     7       
     8     /**删除*/  
     9     void delete(String key);  
    10       
    11     /**删除多个*/  
    12     void delete(List<String> keys);  
    13       
    14     /**修改*/  
    15     boolean update(User user) throws Exception;  
    16   
    17     /**通过key获取*/  
    18     User get(String keyId);
    19 
    20     boolean opsForList(String key, User user);
    21 
    22     boolean getListValueByIndex(String key, int index);
    23 }
    IUserDao.java

    (3)实现IUserDao接口

     1 @Component( value = "userDao")
     2 public class UserDaoImpl implements IUserDao {
     3     
     4     @Autowired
     5     public RedisTemplateFactory redisTemplateFactory;
     6 
     7     @SuppressWarnings("unchecked")
     8     @Override
     9     public boolean add(User user) {        
    10         RedisTemplate<String, Object> localRedisTemplate = redisTemplateFactory.getLocalRedisTemplate();        
    11         ValueOperations<String, Object> opsForValue = localRedisTemplate.opsForValue();        
    12         opsForValue.set(user.getUserId(), user);        
    13         return true;
    14     }
    15 
    16     @SuppressWarnings("unchecked")
    17     @Override
    18     public boolean add(List<User> list) {        
    19         RedisTemplate<String, Object> localRedisTemplate = redisTemplateFactory.getLocalRedisTemplate();
    20         ValueOperations<String, Object> opsForValue = localRedisTemplate.opsForValue();
    21         for(User user: list){
    22             opsForValue.set(user.getUserId(), user);
    23         }                
    24         return true;
    25     }
    26 
    27     @SuppressWarnings("unchecked")
    28     @Override
    29     public void delete(String key) {
    30         RedisTemplate<String, Object> localRedisTemplate = redisTemplateFactory.getLocalRedisTemplate();
    31         ValueOperations<String, Object> opsForValue = localRedisTemplate.opsForValue();
    32         opsForValue.getOperations().delete(key);
    33     }
    34 
    35     @SuppressWarnings("unused")
    36     @Override
    37     public void delete(List<String> keys) {
    38         RedisTemplate<String, Object> localRedisTemplate = redisTemplateFactory.getLocalRedisTemplate();
    39         ValueOperations<String, Object> opsForValue = localRedisTemplate.opsForValue();
    40         RedisOperations<String, Object> operations = opsForValue.getOperations();
    41         for(String key : keys){
    42             operations.delete(key);
    43         }
    44     }
    45 
    46     @Override
    47     public boolean update(User user) throws Exception {        
    48         if( null == user.getUserId()){
    49             throw new Exception("该用户的Key不存在");
    50         }
    51         RedisTemplate<String, Object> localRedisTemplate = redisTemplateFactory.getLocalRedisTemplate();
    52         ValueOperations<String, Object> opsForValue = localRedisTemplate.opsForValue();
    53         opsForValue.set(user.getUserId(), user);                
    54         return true;
    55     }
    56 
    57     @Override
    58     public User get(String keyId) {
    59         RedisTemplate<String, Object> localRedisTemplate = redisTemplateFactory.getLocalRedisTemplate();
    60         ValueOperations<String, Object> opsForValue = localRedisTemplate.opsForValue();
    61         return (User)opsForValue.get(keyId);
    62     }
    63 
    64     @Override
    65     public boolean opsForList(String key, User user) {        
    66         RedisTemplate<String, Object> localRedisTemplate = redisTemplateFactory.getLocalRedisTemplate();
    67         ListOperations<String, Object> opsForList = localRedisTemplate.opsForList();
    68         opsForList.rightPush(key, user);                
    69         return true;
    70     }
    71 
    72     @Override
    73     public boolean getListValueByIndex(String key, int index) {                
    74         RedisTemplate<String, Object> localRedisTemplate = redisTemplateFactory.getLocalRedisTemplate();
    75         ListOperations<String, Object> opsForList = localRedisTemplate.opsForList();
    76         User user = (User) opsForList.index(key, index);
    77         System.out.println(user);
    78         return true;
    79     }    
    80 }
    UserDaoImpl

    5、测试:以OpsForXX()方式,对User的增删改查操作(推荐)。

    此种方式是推荐的操作Redis的方式。

     1 @RunWith(SpringJUnit4ClassRunner.class)
     2 @ContextConfiguration(locations = { "classpath:applicationContext.xml" })
     3 public class SpringTestCase {
     4     
     5     @Autowired
     6     private IUserDao userDao;
     7     
     8     private static final Integer COUNTER = 10;
     9     
    10     // 测试添加单个User
    11     @Test
    12     public void testAddUser(){
    13         for(int i=1; i<=COUNTER; i++){
    14             User user = new User("mykey000"+i, "zjroger000"+i, "password000"+i);
    15             if( userDao.add(user) ){
    16                 System.out.println("用户zjrodger"+i+"添加成功。");
    17             }else{
    18                 System.out.println("用户zjrodger"+i+"添加失败。");                
    19             }            
    20         }
    21     }
    22         
    23     // 测试按照Key-Value方式添加User
    24     @Test
    25     public void testAddUserList(){        
    26         List<User> userList = new ArrayList<>();        
    27         for(int i=1; i<=COUNTER; i++){
    28             User user = new User("mykey000"+i, "zjroger000"+i, "password000"+i);
    29             userList.add(user);
    30         }
    31         if( userDao.add(userList) ){
    32             System.out.println("用户列表添加成功。");
    33         }else{
    34             System.out.println("用户列表添加成功。");
    35         }        
    36     }
    37     
    38     // 通过OpsForList方式添加User
    39     @Test
    40     public void testOpsForList(){
    41         String myListKey = "key:myListKey01";
    42         List<User> userList = new ArrayList<>();        
    43         for(int i=1; i<=COUNTER; i++){
    44             User user = new User("myUserList0"+i, "myUserList0"+i, "myUserList0"+i);
    45             userDao.opsForList(myListKey, user);
    46         }                    
    47     }
    48     
    49     @Test
    50     public void testgetListValueByIndex(){
    51         String myListKey = "key:myListKey01";
    52         int index = 0;
    53         userDao.getListValueByIndex(myListKey, index);
    54     }    
    55     
    56     // 测试删除User
    57     @Test
    58     public void testDelete(){
    59         // 单个删除
    60 //        String key = "mykey0002";
    61 //        userDao.delete(key);
    62         
    63         // 多个删除
    64         List<String> keys = new ArrayList<>();
    65         keys.add("mykey0001");
    66         keys.add("mykey0002");
    67         keys.add("mykey0003");
    68         userDao.delete(keys);
    69         
    70     }
    71 
    72     // 测试获取User
    73     @Test
    74     public void testGetUser(){        
    75         User user = userDao.get("mykey0001");
    76         System.out.println(user.toString());                        
    77         // 多条查询
    78 //        for(int i=1; i<=COUNTER; i++){
    79 //            User user = userDao.get("mykey0"+i);
    80 //            System.out.println(user.toString());
    81 //        }                        
    82     }
    83     
    84     // 测试更新User
    85     @Test
    86     public void testUpdateUser(){
    87         String mykey01 = "mykey0001";
    88         User user = userDao.get(mykey01);
    89         System.out.println("原来的用户:"+user.toString());                
    90         user.setUsername("ttttt");
    91         
    92         try {
    93             boolean result = userDao.update(user);
    94             System.out.println("数据更新完毕。");
    95             System.out.println(user.toString());
    96         } catch (Exception e) {
    97             e.printStackTrace();
    98         }        
    99     }
    SpringRedisTestCase

    6、测试:以RedisCallback()方式,对User的增删改查操作。

     1 public class UserDaoImpl implements IUserDao {
     2     
     3     @Autowired
     4     private RedisTemplateFactory redisTemplateFactory;    
     5 
     6     /**
     7      * 添加一个User对象
     8      */
     9     @SuppressWarnings("unchecked")
    10     @Override
    11     public boolean add(User user) {
    12         
    13         final RedisTemplate redisTemplate = redisTemplateFactory.getLocalRedisTemplate();
    14         
    15         boolean result = (boolean) redisTemplate.execute(new RedisCallback(){
    16 
    17             @SuppressWarnings("rawtypes")
    18             @Override
    19             public Boolean doInRedis(RedisConnection connection)
    20                     throws DataAccessException {
    21                 
    22                 RedisSerializer stringSerializer = redisTemplate.getStringSerializer();
    23                 RedisSerializer<User> valueSerializer = redisTemplate.getValueSerializer();                
    24                 byte[] key = stringSerializer.serialize(user.getUserId());
    25                 byte[] value = valueSerializer.serialize(user);                
    26                 return connection.setNX(key, value);
    27             }            
    28         });        
    29         return result;
    30     }
    31 
    32     /** 添加一个User的List对象*/
    33     @SuppressWarnings("unchecked")
    34     @Override
    35     public boolean add(List<User> list) {
    36         
    37         final RedisTemplate redisTemplate = redisTemplateFactory.getLocalRedisTemplate();
    38         
    39         return (boolean) redisTemplate.execute(new RedisCallback(){
    40 
    41             @SuppressWarnings("rawtypes")
    42             @Override
    43             public Boolean doInRedis(RedisConnection connection)
    44                     throws DataAccessException {
    45             
    46                 RedisSerializer keySerializer = redisTemplate.getKeySerializer();
    47                 RedisSerializer<User> valueSerializer = redisTemplate.getValueSerializer();
    48                 for(User user : list){
    49                     byte[] key = keySerializer.serialize(user.getUserId());
    50                     byte[] value = valueSerializer.serialize(user);
    51                     connection.setNX(key, value);
    52                 }
    53                 return true;
    54             }
    55         }, 
    56         false,  
    57         true);        
    58     }
    59 }
    UserDaoImpl
  • 相关阅读:
    NetBeans Visual Library Tutorial
    Introduction to the PeertoPeer Sockets Project
    p2psockets代码
    摄像头说明
    Best practice to use ConcurrentMap's putIfAbsent
    转:jxmultisplitpane: how to use?
    格式化文本支持:JTextPane
    中国维护的对象标识符定义
    对称加密DES和TripleDES
    Kerberos的原理 MIT
  • 原文地址:https://www.cnblogs.com/zjrodger/p/5800607.html
Copyright © 2011-2022 走看看