Spring-data-redis: 事务与pipeline

来源:互联网 发布:java 幂等性实现原理 编辑:程序博客网 时间:2024/05/16 13:01
  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>

    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());    }  }}
    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());    }  }}
0 0
原创粉丝点击