SpringBoot进阶教程(五十六)整合Redis事物
Redis默认情况下,事务支持被禁用,必须通过设置setEnableTransactionSupport(true)为使用中的每个redistplate显式启用。这样做会强制将当前重新连接绑定到触发multi的当前线程。如果事务完成时没有出错,则调用exec。否则将调用Discard。一旦进入多个重新连接队列,则写入操作。所有只读操作(如键)都通过管道连接到新的(非线程绑定的)重新连接。
以上内容来自官网内容的机器翻译。
v准备工作
学习本章节之前,建议依次阅读以下文章,更好的串联全文内容,如已掌握以下列出知识点,请跳过:
v事物配置
package com.demo.Redis; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.transaction.annotation.EnableTransactionManagement; /** * Created by toutou on 2019/2/16. */ @Configuration @EnableTransactionManagement public class RedisTranConfig { @Bean public StringRedisTemplate customStringRedisTemplate(RedisConnectionFactory redisConnectionFactory) { StringRedisTemplate template = new StringRedisTemplate(); template.setConnectionFactory(redisConnectionFactory); template.setEnableTransactionSupport(true); return template; } }
v接口测试
@Autowired StringRedisTemplate template; @Transactional @RequestMapping(value = "/testredistran1") public String testRedisTran1() { template.opsForValue().set("test1a", "test1a"); template.opsForValue().set("test1b", "test1b"); template.opsForValue().set("test1c", "test1c"); return "1"; } @Transactional @RequestMapping(value = "/testredistran2") public String testRedisTran2() { template.opsForValue().set("test2a", "test2a"); template.opsForValue().set(null, "test2b"); template.opsForValue().set("test2c", "test2c"); return "2"; }
分别请求http://localhost:8081/testredistran1和http://localhost:8081/testredistran2,可以发现test2a并没有被写入到Redis中。
v其它方法
@RequestMapping(value = "/testredistran3") public String testRedisTran3() { //开启事务 template.multi(); template.opsForValue().set("test3a", "test3a"); template.opsForValue().set(null, "test3b"); template.opsForValue().set("test3c", "test3c"); //关闭事务 template.exec(); return "3"; }
Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,Redis对事物支持不会很复杂,当一个客服端连接Redis服务时,发出了MULTI命令时,这个连接会进入事物,在执行MULTI命令之后,执行所有的命令都不会执行,会先放到一个队列中,会提示正在Query,当最后执行EXEC命令之后,Redis会按照之前的进入队列的顺序,执行命令。
v源码地址
https://github.com/toutouge/javademosecond/tree/master/hellospringboot
作 者:请叫我头头哥
出 处:http://www.cnblogs.com/toutou/
关于作者:专注于基础平台的项目开发。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!