Spring-data-redis: 事务与pipeline

  1. 
    

    本文主要展示如何使用spring-data-redis编写事务和pipeline:

    1.配置文件:

    <beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" default-autowire="byName">
      <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxActive" value="32"></property>
        <property name="maxIdle" value="6"></property>
        <property name="maxWait" value="15000"></property>
        <property name="minEvictableIdleTimeMillis" value="300000"></property>
        <property name="numTestsPerEvictionRun" value="3"></property>
        <property name="timeBetweenEvictionRunsMillis" value="60000"></property>
        <property name="whenExhaustedAction" value="1"></property>
      </bean>
      <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" destroy-method="destroy">
        <property name="poolConfig" ref="jedisPoolConfig"></property>
        <property name="hostName" value="127.0.0.1"></property>
        <property name="port" value="6379"></property>
        <property name="password" value="0123456"></property>
        <property name="timeout" value="15000"></property>
        <property name="usePool" value="true"></property>
      </bean>
      <bean id="jedisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="jedisConnectionFactory"></property>
        <property name="keySerializer">
          <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
        </property>
      </bean>
    </beans>
      <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxActive" value="32"></property>
        <property name="maxIdle" value="6"></property>
        <property name="maxWait" value="15000"></property>
        <property name="minEvictableIdleTimeMillis" value="300000"></property>
        <property name="numTestsPerEvictionRun" value="3"></property>
        <property name="timeBetweenEvictionRunsMillis" value="60000"></property>
        <property name="whenExhaustedAction" value="1"></property>
      </bean>
      <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" destroy-method="destroy">
        <property name="poolConfig" ref="jedisPoolConfig"></property>
        <property name="hostName" value="127.0.0.1"></property>
        <property name="port" value="6379"></property>
        <property name="password" value="0123456"></property>
        <property name="timeout" value="15000"></property>
        <property name="usePool" value="true"></property>
      </bean>
      <bean id="jedisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="jedisConnectionFactory"></property>
        <property name="keySerializer">
          <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
        </property>
      </bean>
    </beans>

    2. 程序实例:

    package com.sample.redis.sdr;
    public class RedisClientTest {
    
      //private JsonRedisSeriaziler seriaziler;
      
      private RedisTemplate redisTemplate;
    
      public void setRedisTemplate(RedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
      }
      
      public void valueOperationSample(){
        ValueOperations<String, User> valueOper = redisTemplate.opsForValue();
        User suser = new User(1,"zhangsan",12);
        valueOper.set("user:" + suser.getId(),suser);
        System.out.println(valueOper.get("user:" + suser.getId()).getName());
      }
      
      public void listOperationSample(){
        User suser = new User(1,"zhangsan",12);
        ListOperations<String, User> listOper = redisTemplate.opsForList();
        listOper.leftPush("user:list", suser);//lpush,head
        listOper.rightPush("user:list", suser);//rpush,tail
      } com.sample.redis.sdr;
    public class RedisClientTest {
    
      //private JsonRedisSeriaziler seriaziler;
      
      private RedisTemplate redisTemplate;
    
      public void setRedisTemplate(RedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
      }
      
      public void valueOperationSample(){
        ValueOperations<String, User> valueOper = redisTemplate.opsForValue();
        User suser = new User(1,"zhangsan",12);
        valueOper.set("user:" + suser.getId(),suser);
        System.out.println(valueOper.get("user:" + suser.getId()).getName());
      }
      
      public void listOperationSample(){
        User suser = new User(1,"zhangsan",12);
        ListOperations<String, User> listOper = redisTemplate.opsForList();
        listOper.leftPush("user:list", suser);//lpush,head
        listOper.rightPush("user:list", suser);//rpush,tail
      }
     
      
      public void boundValueOperationSample(){
        User suser = new User(1,"zhangsan",12);
        BoundValueOperations<String, User> bvo = redisTemplate.boundValueOps("user:" + suser.getId());
        bvo.set(suser);
        bvo.expire(60, TimeUnit.MINUTES);
      }
      
      /**
       * 非连接池环境下,事务操作;对于sdr而言,每次操作(例如,get,set)都有会从pool中获取connection;
       * 因此在连接池环境下,使用事务需要注意。
       */
      public void txUnusedPoolSample(){
        User suser = new User(1,"zhangsan",12);
        redisTemplate.watch("user:" + suser.getId());
        redisTemplate.multi();
        ValueOperations<String, User> tvo = redisTemplate.opsForValue();
        tvo.set("user:" + suser.getId(), suser);
        redisTemplate.exec();
      }
      
      /**
       * 在连接池环境中,需要借助sessionCallback来绑定connection
       */
      public void txUsedPoolSample(){
        SessionCallback<User> sessionCallback = new SessionCallback<User>() {
          @Override
          public User execute(RedisOperations operations) throws DataAccessException {
            operations.multi();
            User user = new User(2,"lisi",32);
            String key = "user:" + user.getId();
            BoundValueOperations<String, User> oper = operations.boundValueOps(key);
            oper.set(user);
            oper.expire(60, TimeUnit.MINUTES);
            operations.exec();
            return user;
          }
        };
        redisTemplate.execute(sessionCallback);
      }
      
      /**
       * pipeline : 1,正确使用方式
       */
      public void pipelineSample(){
        final byte[] rawKey = redisTemplate.getKeySerializer().serialize("user_total");
        //pipeline
        RedisCallback<List<Object>> pipelineCallback = new RedisCallback<List<Object>>() {
          @Override
          public List<Object> doInRedis(RedisConnection connection) throws DataAccessException {
            connection.openPipeline();
            connection.incr(rawKey);
            connection.incr(rawKey);
            return connection.closePipeline();
          }
          
        };
        
        List<Object> results = (List<Object>)redisTemplate.execute(pipelineCallback);
        for(Object item : results){
          System.out.println(item.toString());
        }
      }
      //pipeline:备用方式
      public void pipelineSampleX(){
        byte[] rawKey = redisTemplate.getKeySerializer().serialize("user_total");
        RedisConnectionFactory factory = redisTemplate.getConnectionFactory();
        RedisConnection redisConnection = factory.getConnection();
        List<Object> results;
        try{
          redisConnection.openPipeline();
          redisConnection.incr(rawKey);
          results = redisConnection.closePipeline();
        }finally{
          RedisConnectionUtils.releaseConnection(redisConnection, factory);
        }
        if(results == null){
          return;
        }
        for(Object item : results){
          System.out.println(item.toString());
        }
    
      }
    }
      public void boundValueOperationSample(){
        User suser = new User(1,"zhangsan",12);
        BoundValueOperations<String, User> bvo = redisTemplate.boundValueOps("user:" + suser.getId());
        bvo.set(suser);
        bvo.expire(60, TimeUnit.MINUTES);
      }
      
      /**
       * 非连接池环境下,事务操作;对于sdr而言,每次操作(例如,get,set)都有会从pool中获取connection;
       * 因此在连接池环境下,使用事务需要注意。
       */
      public void txUnusedPoolSample(){
        User suser = new User(1,"zhangsan",12);
        redisTemplate.watch("user:" + suser.getId());
        redisTemplate.multi();
        ValueOperations<String, User> tvo = redisTemplate.opsForValue();
        tvo.set("user:" + suser.getId(), suser);
        redisTemplate.exec();
      }
      
      /**
       * 在连接池环境中,需要借助sessionCallback来绑定connection
       */
      public void txUsedPoolSample(){
        SessionCallback<User> sessionCallback = new SessionCallback<User>() {
          @Override
          public User execute(RedisOperations operations) throws DataAccessException {
            operations.multi();
            User user = new User(2,"lisi",32);
            String key = "user:" + user.getId();
            BoundValueOperations<String, User> oper = operations.boundValueOps(key);
            oper.set(user);
            oper.expire(60, TimeUnit.MINUTES);
            operations.exec();
            return user;
          }
        };
        redisTemplate.execute(sessionCallback);
      }
      
      /**
       * pipeline : 1,正确使用方式
       */
      public void pipelineSample(){
        final byte[] rawKey = redisTemplate.getKeySerializer().serialize("user_total");
        //pipeline
        RedisCallback<List<Object>> pipelineCallback = new RedisCallback<List<Object>>() {
          @Override
          public List<Object> doInRedis(RedisConnection connection) throws DataAccessException {
            connection.openPipeline();
            connection.incr(rawKey);
            connection.incr(rawKey);
            return connection.closePipeline();
          }
          
        };
        
        List<Object> results = (List<Object>)redisTemplate.execute(pipelineCallback);
        for(Object item : results){
          System.out.println(item.toString());
        }
      }
      //pipeline:备用方式
      public void pipelineSampleX(){
        byte[] rawKey = redisTemplate.getKeySerializer().serialize("user_total");
        RedisConnectionFactory factory = redisTemplate.getConnectionFactory();
        RedisConnection redisConnection = factory.getConnection();
        List<Object> results;
        try{
          redisConnection.openPipeline();
          redisConnection.incr(rawKey);
          results = redisConnection.closePipeline();
        }finally{
          RedisConnectionUtils.releaseConnection(redisConnection, factory);
        }
        if(results == null){
          return;
        }
        for(Object item : results){
          System.out.println(item.toString());
        }
    
      }
    }
  2.  
  
  public void boundValueOperationSample(){
    User suser = new User(1,"zhangsan",12);
    BoundValueOperations<String, User> bvo = redisTemplate.boundValueOps("user:" + suser.getId());
    bvo.set(suser);
    bvo.expire(60, TimeUnit.MINUTES);
  }
  
  /**
   * 非连接池环境下,事务操作;对于sdr而言,每次操作(例如,get,set)都有会从pool中获取connection;
   * 因此在连接池环境下,使用事务需要注意。
   */
  public void txUnusedPoolSample(){
    User suser = new User(1,"zhangsan",12);
    redisTemplate.watch("user:" + suser.getId());
    redisTemplate.multi();
    ValueOperations<String, User> tvo = redisTemplate.opsForValue();
    tvo.set("user:" + suser.getId(), suser);
    redisTemplate.exec();
  }
  
  /**
   * 在连接池环境中,需要借助sessionCallback来绑定connection
   */
  public void txUsedPoolSample(){
    SessionCallback<User> sessionCallback = new SessionCallback<User>() {
      @Override
      public User execute(RedisOperations operations) throws DataAccessException {
        operations.multi();
        User user = new User(2,"lisi",32);
        String key = "user:" + user.getId();
        BoundValueOperations<String, User> oper = operations.boundValueOps(key);
        oper.set(user);
        oper.expire(60, TimeUnit.MINUTES);
        operations.exec();
        return user;
      }
    };
    redisTemplate.execute(sessionCallback);
  }
  
  /**
   * pipeline : 1,正确使用方式
   */
  public void pipelineSample(){
    final byte[] rawKey = redisTemplate.getKeySerializer().serialize("user_total");
    //pipeline
    RedisCallback<List<Object>> pipelineCallback = new RedisCallback<List<Object>>() {
      @Override
      public List<Object> doInRedis(RedisConnection connection) throws DataAccessException {
        connection.openPipeline();
        connection.incr(rawKey);
        connection.incr(rawKey);
        return connection.closePipeline();
      }
      
    };
    
    List<Object> results = (List<Object>)redisTemplate.execute(pipelineCallback);
    for(Object item : results){
      System.out.println(item.toString());
    }
  }
  //pipeline:备用方式
  public void pipelineSampleX(){
    byte[] rawKey = redisTemplate.getKeySerializer().serialize("user_total");
    RedisConnectionFactory factory = redisTemplate.getConnectionFactory();
    RedisConnection redisConnection = factory.getConnection();
    List<Object> results;
    try{
      redisConnection.openPipeline();
      redisConnection.incr(rawKey);
      results = redisConnection.closePipeline();
    }finally{
      RedisConnectionUtils.releaseConnection(redisConnection, factory);
    }
    if(results == null){
      return;
    }
    for(Object item : results){
      System.out.println(item.toString());
    }

  }
}
  public void boundValueOperationSample(){
    User suser = new User(1,"zhangsan",12);
    BoundValueOperations<String, User> bvo = redisTemplate.boundValueOps("user:" + suser.getId());
    bvo.set(suser);
    bvo.expire(60, TimeUnit.MINUTES);
  }
  
  /**
   * 非连接池环境下,事务操作;对于sdr而言,每次操作(例如,get,set)都有会从pool中获取connection;
   * 因此在连接池环境下,使用事务需要注意。
   */
  public void txUnusedPoolSample(){
    User suser = new User(1,"zhangsan",12);
    redisTemplate.watch("user:" + suser.getId());
    redisTemplate.multi();
    ValueOperations<String, User> tvo = redisTemplate.opsForValue();
    tvo.set("user:" + suser.getId(), suser);
    redisTemplate.exec();
  }
  
  /**
   * 在连接池环境中,需要借助sessionCallback来绑定connection
   */
  public void txUsedPoolSample(){
    SessionCallback<User> sessionCallback = new SessionCallback<User>() {
      @Override
      public User execute(RedisOperations operations) throws DataAccessException {
        operations.multi();
        User user = new User(2,"lisi",32);
        String key = "user:" + user.getId();
        BoundValueOperations<String, User> oper = operations.boundValueOps(key);
        oper.set(user);
        oper.expire(60, TimeUnit.MINUTES);
        operations.exec();
        return user;
      }
    };
    redisTemplate.execute(sessionCallback);
  }
  
  /**
   * pipeline : 1,正确使用方式
   */
  public void pipelineSample(){
    final byte[] rawKey = redisTemplate.getKeySerializer().serialize("user_total");
    //pipeline
    RedisCallback<List<Object>> pipelineCallback = new RedisCallback<List<Object>>() {
      @Override
      public List<Object> doInRedis(RedisConnection connection) throws DataAccessException {
        connection.openPipeline();
        connection.incr(rawKey);
        connection.incr(rawKey);
        return connection.closePipeline();
      }
      
    };
    
    List<Object> results = (List<Object>)redisTemplate.execute(pipelineCallback);
    for(Object item : results){
      System.out.println(item.toString());
    }
  }
  //pipeline:备用方式
  public void pipelineSampleX(){
    byte[] rawKey = redisTemplate.getKeySerializer().serialize("user_total");
    RedisConnectionFactory factory = redisTemplate.getConnectionFactory();
    RedisConnection redisConnection = factory.getConnection();
    List<Object> results;
    try{
      redisConnection.openPipeline();
      redisConnection.incr(rawKey);
      results = redisConnection.closePipeline();
    }finally{
      RedisConnectionUtils.releaseConnection(redisConnection, factory);
    }
    if(results == null){
      return;
    }
    for(Object item : results){
      System.out.println(item.toString());
    }

  }
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值