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>

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
  }
  
  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());
    }

  }
}
posted @ 2016-07-14 01:41  princessd8251  阅读(411)  评论(0)    收藏  举报