012 - Redis 的事务

本文详细介绍了Redis的事务机制,包括multi、exec、discard、watch和unwatch等关键命令的使用。Redis事务提供了一种序列化执行命令的方式,保证了命令的原子性,但不支持回滚。通过watch命令,还能实现条件执行事务,确保数据的一致性。然而,当监控的键在事务执行前被修改,事务会被中止。了解这些概念对于正确使用Redis事务至关重要。
摘要由CSDN通过智能技术生成

一、Redis 的事务


  Redis 的事务允许在一次单独的步骤中执行一组命令,并且能够保证将一个事务中的所有命令序列化,然后按顺序执行;
  在一个 Redis 事务中,Redis 要么执行其中的所有命令,要么什么都不执行。即 Redis 的事务要能够保证序列化和原子性。



二、Redis 事务的常用命令


1.multi

功能:用于标记事务块的开始。Redis 会将执行 multi 命令之后的命令逐个放入队列中,然后才能使用EXEC 命令原子化地执行这个命令序列。
返回值:开启成功返回OK

127.0.0.1:6379> multi   //开启事务
OK
127.0.0.1:6379> set k1 v1  //在事务内执行的 redis 命令都会压栈不执行,只有遇到 exec 是才会全部执行
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED

2.exec

功能:在一个事务中执行所有先前放入队列的命令,然后恢复正常的连接状态;
   如果在把命令压入队列的过程中报错,则整个队列中的命令都不会执行,执行结果报错;
   如果在压队列的过程中正常,在执行队列中某一个命令报错,则只会影响本条命令的执行结果,其它命令正常运行;
   当使用 WATCH 命令时,只有当受监控的键没有被修改时,EXEC 命令才会执行事务中的命令;而一旦执行了 exec 命令,之前加的所有watch监控全部取消。

返回值:这个命令的返回值是一个数组,其中的每个元素分别是原子化事务中的每个命令的返回值
    当使用 WATCH 命令时,如果事务执行中止,那么 EXEC 命令就会返回一个 Null 值。

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> incr k1
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) (error) ERR value is not an integer or out of range

3.discard

功能:清除所有先前在一个事务中放入队列的命令,并且结束事务;
   如果使用了WATCH命令,那么DISCARD命令就会将当前连接监控的所有键取消监控。

返回值:清除成功,返回OK。

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> exec
(error) ERR EXEC without MULTI

4.watch key [key …]

功能:当某个事务需要按条件执行时,就要使用这个命令将给定的键设置为受监控的;
   如果被监控的key值在本事务外有修改时,则本事务所有指令都不会被执行。Watch命令相当于关系型数据库中的乐观锁。

返回值:监控成功,返回OK。

//开启事务1  监控 balance 并且开启一个事务对其值进行修改,
127.0.0.1:6379> set balance 1000
OK
127.0.0.1:6379> watch balance
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incrby balance
QUEUED
// 此时该事务1还没执行,事务2执行了,并且对balance的值进行修改
//开启事务2  对 balance 值进行修改,
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby balance 500
QUEUED
127.0.0.1:6379> exec
1) (integer) 500
// 此时该事务2执行成功,balance 被改为500
//继续执行事务1  对 balance 值进行修改,
127.0.0.1:6379> exec
(nil)
// 此时由于balance被其他事务修改,所以无法修改balance的值

5.unwatch

功能:清除所有先前为一个事务监控的键;
   如果在watch命令之后你调用了EXEC或DISCARD命令,那么就不需要手动调用UNWATCH命令。
返回值:监控成功,返回OK。

127.0.0.1:6379> set balance 1000
OK
127.0.0.1:6379> watch balance
OK
127.0.0.1:6379> unwatch balance
OK
127.0.0.1:6379> incrby balance
QUEUED
127.0.0.1:6379> exec
1) (integer) 1500



三、小结


  1. 单独的隔离操作:事务中的所有命令都会序列化、顺序地执行。事务在执行过程中,不会被其它客户端发来的命令请求所打断,除非使用 watch 命令监控某些键。

  2. 不保证事务的原子性:redis 同一个事务中如果一条命令执行失败,其后的命令仍然可能会被执行,redis 的事务没有回滚。Redis 已经在系统内部进行功能简化,这样可以确保更快的运行速度,因为 Redis 不需要事务回滚的能力。



写在最后

以上关于 Redis 中事务的内容,后续如果有时间的话我也将持续更新,如果有错误或者是哪里不足的地方,欢迎各位大大提出宝贵的意见呀~

此外,想了解关于 Redis 的一些其他使用方法可以关注下方公众号,后台回复 “redis ”即可获取,期待着您的光临~

在这里插入图片描述


相关链接:

链接: 011 - Redis 的持久化.
链接: 010 - Redis的配置文件.
链接: 009- Redis 数据结构 - zset类型.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
spring-data-redis 1.6.0 是一个用于与 Redis 数据库进行交互的开源框架。它是 Spring Data 项目的一部分,提供了方便的 API 以简化对 Redis 数据库的访问。 spring-data-redis 1.6.0 提供了与 Redis 的完整集成,包括连接管理、数据存储和检索、事务管理、缓存支持等功能。 在连接管理方面,spring-data-redis 1.6.0 支持连接池和 Redis Sentinel 的自动探测和故障转移。它使用 Jedis 或 Lettuce 作为 Redis 客户端,并提供了一致的、可靠的连接管理机制。 在数据存储和检索方面,spring-data-redis 1.6.0 提供了多种方式来操作 Redis 数据库。它支持存储和检索各种数据结构,例如字符串、哈希、列表、集合和有序集合。它还支持基于时间的键过期和发布-订阅模式。 在事务管理方面,spring-data-redis 1.6.0 支持 Redis事务。它通过与 Spring 的事务管理器集成,实现了对 Redis事务操作的支持。这样,我们可以在 Spring 事务的管理下执行 Redis 的多个操作,保证它们的原子性。 在缓存支持方面,spring-data-redis 1.6.0 提供了对 Redis 缓存的支持。我们可以使用注解方式将方法的返回值缓存到 Redis 数据库中,以提高系统的性能和响应速度。 总之,spring-data-redis 1.6.0 是一个功能强大、易于使用的框架,为我们提供了与 Redis 数据库进行交互的便捷方式。它可以极大地简化我们对 Redis 数据的存储和检索,提供了灵活而高效的数据操作方式。同时,它与 Spring 框架的无缝集成,使我们能够更好地利用 Redis 在我们的应用程序中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值