您的位置:首页 > 数据库 > Redis

跟我学Redis(17)—Redis事务详解及实例

2016-08-16 23:07 260 查看
前面有篇文章,简单介绍了Redis事务。

Redis事务主要命令包括 MULTI、EXEC、WATCH 命令。本篇文章将详细介绍事务以及Redis事务实例应用!

一、事务、悲观锁、乐观锁概述

简单的说,事务就是为了存取数据库中同一数据时不破坏操作的隔离性和原子性,从而保证数据的一致性。

一般数据库,比如MySql是如何保证数据一致性的呢,主要是加锁,悲观锁。比如在访问数据库某条数据的时候,会用SELECT FOR UPDATE ,这MySql就会对这条数据进行加锁,直到事务被提交(COMMIT),或者回滚(ROLLBACK)。如果此时,有其他事务对被加锁的数据进行写入,那么该事务将会被阻塞,直到第一个事务完成为止。它的缺点在于:持有锁的事务运行越慢,等待解锁的事务阻塞时间就越长。并且容易产生死锁(前面有篇文章有讲解死锁)!

Redis为了尽可能的减少客户端的等待时间,并不会使用悲观锁。而是使用乐观锁,主要通过WATCH命令进行监控,这样客户端就永远都不会等待第一个取得锁的客户端,它们只需要在自己的事务执行失败时进行重试就可以了。



监控什么呢?我们暂且理解为监控版本号是否一致。

比如,对一条数据开启事务操作时,先获取一个版本号,当事务提交的时候用此版本号与最新的版本号进行比对,如果版本号不一致,那么就返回给客户端,由客户端决定如何操作。(通过版本号实现乐观锁的原理)

二、Redis事务实例

通过MULTI开启一个事务,通过EXEC提交此事务,比如:



一次性提交的好处是,客户端与服务端不必要每条命令都交互(耗费传输时间);一次性提交可以节省资源,提高效率!

所以客户端,比如python通过 conn.pipline() 开启一个通道,操作命令就像流水线一样,最后一次性完成提交,从而提高执行效率,节约资源,减少服务器压力。称之为流水线操作!

三、WATCH命令实现乐观锁

当有一个事务在操作一条数据(资源)的时候,为了避免其他事务也来操作此数据,导致脏数据。在第一个事务中对此数据执行WATCH(监控),这样通过乐观锁来保证数据的一致性。

暂且理解Redis的WATCH是通过监控版本号实现乐观锁的!



对照上图,在实例中展示如下:

客户端1



客户端2



四、客户端对于事务失败的处理

一般可以选择再次执行此事务,从而保证业务的正常流转。

当然,也可以不执行WATCH,这样就是非事务型流水线操作。

五、关于性能的注意事项

redis自带性能测试程序 redis-benchmark 命令。在不给定任何参数的情况下,redis-benchmark将使用50个客户端进行性能测试。

我们可以让程序在只使用一个客户端进行测试

redis-benchmark -c 1 -q  



在一般情况下,对于只使用单个客户端的redis-benchmark来说,根据被调用命令的复杂度,一个不使用流水线的客户端的性能大概只有redis-benchmark所示性能的50%~60%;



所以,为了提高redis性能,客户端尽量通过连接池分配连接,并使用流水线事务进行操作;



扫一扫,通过微信也能学习
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息