使用Redis事务
基本事务
开启事务
PIPELINE获取一个管道
使用管道MULTI命令开启事务
执行命令
设置多条需要执行的命令
command01
command02
...
提交事务
使用管道EXEC命令提交上面所有命令
基本事务存在的问题
上面的简单事务的执行流程是,在调用EXEC命令时才将所有命令提交到redis服务器执行。但是仍然无法保证在事务中读取的数据是否已被其他客户端修改。具体见下面示例
watch命令解决基本事务的问题
可以通过Redis的watch命令完善基本事务功能
redis是通过乐观锁的方式实现事务的,所以watch命令不会为数据D加锁,并不影响其他客户端读写D,所以D如果被他客户端更改,则事务失败,通过重试即可。
为什么redis使用乐观锁实现事务,mysql等关系型数据库是使用悲观锁的方式实现?
加锁是一种很有效的方式,但是如果持有锁的客户端运行很慢,其他客户端就会等待很长时间。乐观锁的方式不会让程序阻塞,程序只需要在自定义逻辑中增加重试,redis本身执行速度就很快如果使用锁的方式可能会降低效率。