Redis深度历险(5)-事务

本文深入探讨Redis事务的基本用法,包括multi、exec和discard命令的使用,解释了watch命令如何提供CAS机制确保数据一致性,以及为何Redis事务不支持原子操作的原因。

Redis作为一款非关系型数据库,自然也拥有事务的支持,关系型数据库例如MySQL的事务具有ACID这四大基本特征,即Atomicity原子性,Consistency一致性,Isolation隔离性,Durability持久性。

1.0 事务队列

Redis指令在multi创建事务之后,会被放入事务队列中,在exec之时会将指令依次从事务队列中提取出来执行,在discard之时会将事务队列抛弃。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YZhcYlLv-1572500173064)(http://note.youdao.com/yws/res/543/4B0F8FC9000A46839DC393E27E58C175)]

1.1 Redis事务基本用法

1.开启事务:

multi命令用于开启事务,在开启事务之后,事务将不会被自动提交

127.0.0.1:6371> set arong test
OK
127.0.0.1:6371> multi
OK
127.0.0.1:6371> set arong test1
QUEUED
127.0.0.1:6371> set arong test2
QUEUED
127.0.0.1:6371> exec
1) OK
2) OK
127.0.0.1:6371> get arong
"test2"

2.提交事务

exec命令用于提交事务,提交的事务中若有失败也不会将全部指令都回滚掉,而是继续执行其他语句,所以Redis的事务不具备原子性,而只是提供了隔离性机制。

127.0.0.1:6371> set arong test
OK
127.0.0.1:6371> multi
OK
127.0.0.1:6371> rpush arong test1
QUEUED
127.0.0.1:6371> set arong test2
QUEUED
127.0.0.1:6371> exec
1) (error) WRONGTYPE Operation against a key holding the wrong kind of value
2) OK
127.0.0.1:6371> get arong
"test2"

3.回滚事务

discard命令用于回滚事务,回滚事务会将所有的指令抛弃。

127.0.0.1:6371> set arong test
OK
127.0.0.1:6371> multi
OK
127.0.0.1:6371> set arong test1
QUEUED
127.0.0.1:6371> set arong test2
QUEUED
127.0.0.1:6371> discard
OK
127.0.0.1:6371> get arong
"test"

1.2 watch命令

watch命令用于监控某个key,需要在开启事务前使用,它的作用是当事务开启后,若在提交事务时发现该key已经被更改过,那么所提交的指令全部回滚失效,否则正常提交。其实watch命令的实质是CAS算法,即比较后再决定是否是正确的预期。用一个给银行存款加倍的程序来演示一下:

 public static int doubleAccount(Jedis jedis, String accountId) {
    while (true) {
    //监听该accountId的值
    jedis.watch(accountId);
    int money = Integer.parseInt(jedis.get(accountId));
    //开启事务
    Transaction tx = jedis.multi();
    //将钱款*2
    tx.set(accountId, String.valueOf(money * 2));
    //提交事务
    List<Object> res = tx.exec();
    if (res != null) {
        //提交事务成功
        break;  
    }
    }
    //返回当前余额
    return Integer.parseInt(jedis.get(accountId));
}

1.3 为什么Redis事务不支持原子操作?

1.出于对性能的考虑

2.作者认为Redis事务应该在开发业务层面考虑

### 回答1: Redis是一款内存数据库,性能高、支持多种数据结构、提供丰富的功能,得到了广泛的应用。但其维护操作却需要一定的技巧,开源社区中也有大量的文档、文章来讲解。其中,Redis深度历险一书介绍了Redis的基础知识、高级特性、应用场景和实战案例。该书深入剖析了Redis内部的实现原理,让读者更好地理解其运行机制、调优方法和错误排查。主要内容包括Redis线程模型、内存优化、IO模型、事务、持久化、集群、性能调优、应用场景等。其中,集群方面包括Redis Cluster和Redis Sentinel两类架构的详细介绍和使用方法。性能调优方面,介绍了一些常见的性能问题和解决方案,以及使用Redis的最佳实践。对于有一定Redis使用经验的开发人员或系统工程师,这本书可以帮助他们更好地优化和管理Redis实例,也可以让他们更深入地掌握Redis相关知识。对于想学习Redis的初学者,建议还需要通过其他资料了解Redis基本概念和用法。总的来说,Redis深度历险是一本值得阅读的Redis专业书籍,它为读者提供了许多经验和实践经验,也为企业中使用Redis的团队提供了宝贵的参考资料。 ### 回答2: Redis是一款开源的高性能NoSQL数据库,近年来在企业级应用中广受欢迎。《Redis深度历险》是一本深入介绍Redis的技术书籍,由黄健宏等人撰写。 这本书详细介绍了Redis的架构、原理、数据结构、使用场景、性能优化、集群部署等方面的知识,通过系统化的学习可以在Redis的使用和优化方面获得很大的收获。 《Redis深度历险》中包含大量的实际代码示例和生产环境中的案例分析,可以帮助读者深入理解Redis的实现细节和应用场景,并快速应用到自己的实战项目中。同时,这本书也适合那些想深入了解分布式系统的架构师、程序员、运维工程师等 IT 技术人员。 此外,书中还介绍了很多Redis的新特性和应用场景,如Redis的流式计算、Redis与gRPC的结合使用等,让人们对Redis的使用和应用场景有了更深刻的认识。 总之,《Redis深度历险》是一本非常实用的Redis技术指南,对于想深入学习Redis的技术人员来说是非常必备的一本读物。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoringRong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值