对于最新的稳定版本,请使用 Spring Data Redis 3.3.1Spring中文文档

对于最新的稳定版本,请使用 Spring Data Redis 3.3.1Spring中文文档

Redis 通过 、 和 命令为事务提供支持。 这些操作可在 上使用。 但是,不能保证使用相同的连接运行事务中的所有操作。multiexecdiscardRedisTemplateRedisTemplateSpring中文文档

Spring Data Redis 提供了在需要执行多个操作时使用的接口,例如在使用 Redis 事务时。下面的示例使用以下方法:SessionCallbackconnectionmultiSpring中文文档

//execute a transaction
List<Object> txResults = redisOperations.execute(new SessionCallback<List<Object>>() {
  public List<Object> execute(RedisOperations operations) throws DataAccessException {
    operations.multi();
    operations.opsForSet().add("key", "value1");

    // This will contain the results of all operations in the transaction
    return operations.exec();
  }
});
System.out.println("Number of items added to set: " + txResults.get(0));

RedisTemplate使用其值、哈希键和哈希值序列化程序来反序列化 Before 返回的所有结果。 还有一种附加方法允许您为事务结果传递自定义序列化程序。execexecSpring中文文档

值得一提的是,如果发生异常(例如,如果 Redis 在超时内没有响应,则出现超时异常),则连接可能会卡在事务状态。 为了防止这种情况,需要放弃事务状态以清除连接:multi()exec()Spring中文文档

List<Object> txResults = redisOperations.execute(new SessionCallback<List<Object>>() {
  public List<Object> execute(RedisOperations operations) throws DataAccessException {
    boolean transactionStateIsActive = true;
	try {
      operations.multi();
      operations.opsForSet().add("key", "value1");

      // This will contain the results of all operations in the transaction
      return operations.exec();
    } catch (RuntimeException e) {
	    operations.discard();
		throw e;
    }
  }
});

@Transactional支持

默认情况下,不参与托管的 Spring 事务。 如果要在使用 或 时使用 Redis 事务,则需要通过设置 显式启用对每个事务的支持。 启用事务支持将绑定到由 . 如果事务完成且没有错误,则 Redis 事务将提交 ,否则将回滚 。 Redis 事务是面向批处理的。 在正在进行的事务期间发出的命令将排队,并且仅在提交事务时应用。RedisTemplateRedisTemplate@TransactionalTransactionTemplateRedisTemplatesetEnableTransactionSupport(true)RedisConnectionThreadLocalEXECDISCARDSpring中文文档

Spring Data Redis 区分正在进行的事务中的只读命令和写入命令。 只读命令(如 )通过管道传递到新的(非线程绑定)以允许读取。 写入命令在提交时排队并应用。KEYSRedisConnectionRedisTemplateSpring中文文档

以下示例演示如何配置事务管理:Spring中文文档

例 1.启用事务管理的配置
@Configuration
@EnableTransactionManagement                                 (1)
public class RedisTxContextConfiguration {

  @Bean
  public StringRedisTemplate redisTemplate() {
    StringRedisTemplate template = new StringRedisTemplate(redisConnectionFactory());
    // explicitly enable transaction support
    template.setEnableTransactionSupport(true);              (2)
    return template;
  }

  @Bean
  public RedisConnectionFactory redisConnectionFactory() {
    // jedis || Lettuce
  }

  @Bean
  public PlatformTransactionManager transactionManager() throws SQLException {
    return new DataSourceTransactionManager(dataSource());   (3)
  }

  @Bean
  public DataSource dataSource() throws SQLException {
    // ...
  }
}
1 配置 Spring Context 以启用声明性事务管理
2 配置为通过绑定连接到当前线程来参与事务。RedisTemplate
3 事务管理需要 . Spring Data Redis 不附带实现。 假设您的应用程序使用 JDBC,Spring Data Redis 可以使用现有的事务管理器参与事务。PlatformTransactionManagerPlatformTransactionManager

以下示例分别演示了使用约束:Spring中文文档

例 2.使用限制
// must be performed on thread-bound connection
template.opsForValue().set("thing1", "thing2");

// read operation must be run on a free (not transaction-aware) connection
template.keys("*");

// returns null as values set within a transaction are not visible
template.opsForValue().get("thing1");
1 配置 Spring Context 以启用声明性事务管理
2 配置为通过绑定连接到当前线程来参与事务。RedisTemplate
3 事务管理需要 . Spring Data Redis 不附带实现。 假设您的应用程序使用 JDBC,Spring Data Redis 可以使用现有的事务管理器参与事务。PlatformTransactionManagerPlatformTransactionManager