你好 老师,请教您一下 redis 缓存如何做事务
来源:4-5 Jms-session事务实例

qq_博仁_0
2019-01-21
麻烦帮帮我解答一下 谢谢
写回答
1回答
-
大漠风
2019-01-22
如果说,你问的是redis内部的多个操作之间的事务,redis提供了一个`multi exec/discard`操作,相应的sdk里面也会有相应方法。
如果说,你问的是同时操作数据库和redis的时候,也就是操作多数据源的时候的分布式事务问题,那么,遇到的问题、和解决的思路还是一样的。
如果是先写数据库的数据,再发请求写redis的数据,这两个操作在一个spring的事务管理器里。这时候,如果写redis的时候出错了,数据库的写操作肯定能够回滚。
但是,如果是先写了redis,再操作数据库,只要是写redis之后的代码出错,这时候就无法撤销。即使你仿照实例中的jms-db多数据源的实例,使用代码方式控制事务的提交,也没法完全保证事务性。
而且,我们也不能把所有redis的操作都用`multi`来控制,然后在方法结束的时候用`exec`提交,出错的时候用`discard`回滚。这样会非常影响性能。
所以,对于redis和db的分布式事务问题,我个人建议从代码结构和业务流程上避免。例如,在事务方法的最后一步去写redis,避免写redis之后,再进行可能会出错的操作。还有,能使用一个redis语句解决的问题,不要用两个,例如先读数据,再根据原先的值更新新的值(在分布式环境下,你很可能会读到脏值)。
如果只是用redis做缓存,那还比较容易,一般都是处理完处理后缓存到redis上,然后在处理请求之前取redis数据验证业务条件(如秒杀的时候检查库存等)。但是,要用redis作为业务数据库,就需要注意。
00
相似问题