redis源码之回调函数分析

springboot在集成redis时,在配置文件application.yml中定义好redis的各个配置属性,springboot会将对应的属性注入到redisproperties中,然后在RedisAutoConfiguration类中,通过@EnableConfigurationProperties注解,绑定redisproperties中的属性,生成对应的JedisConnectionFactory、RedisTemplate和StringRedisTemplate;在项目中通过@Autowired注解注入后,就可以直接使用。

1:rawValue函数,通过序列话,将value值转为字节数组,因为redis底层都是用字节数组存储的。

2:execute函数通过传递一个回调函数,在execute函数执行内部,会调用ValueDeserializingRedisCallback的inRedis的方法,该方法即会执行下面红框的代码(回调函数作用可以让调用者自己实现想要的业务逻辑):

3:execute方法分析:

(1):getConnectionFactory这个方法获取redis连接容器,里面有设置好的属性。这些值在spring boot启动时候,通过将application.yml配置文件里的值注入到里里面

(2):如果enableTransactionSupport设置为true,会以事物方式获取redis连接容器,否则会每次都建一个新的容器();二者最后都会执行doGetConnection(RedisConnectionFactory factory,boolean a,boolean b,boolean c)这个方法,获取容器,不同的是,前者三个boolean参数都为true,后者为true,false,false

(3):如果是以事物的方式调用,则在同一个线程中,会始终采用同一个容器。

 (4):在execute这个方法内有个finally模块,在里面会执行容器的释放,当满足以下情况的时候,最将容器释放:

①、设置enableTransactionSupport为true,并且connHolder.isTransactionSyncronisationActive()为true时,当事务结束时,会自动释放。在doGetConnection方法中,有下面一段代码:

其中isActualNonReadonlyTransactionActive的判断如下:

即当启用@Transactional注解,并且当前线程事务不是只读线程,将返回true,connHolder.isTransactionSyncronisationActive()将会设为true,执行了事务的muti操作(没看到watch操作)

②、第二个if表示,如果当前线程是事务执行,并且为只读线程,将释放容器连接

③、最后面那个else if 表明没有开始事务,将直接关闭容器连接。

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值