Redis事务及锁的相关操作和实例

什么是事务

redis事务就是一个命令执行的队列,将一系列预定义命令包装成一个整体(一个队列)。当执行时,一次性按照顺序依次执行,中间不会被打断。

一个队列中,一次性、顺序性、排他性的执行一系列命令

  1. 事务的基本操作:
  • 开启事务(事务的开启位置) multi
  • 执行事务(事务的结束位置) exec
  • 取消事务 discard

加入事务的命令暂时进入到任务队列中,并没有立即执行,只有执行exec命令才开始执行

  1. 例子
  1. 用户1先设置num=10,然后开启事务,并重新设置num=5,此时用户1还没有提交事务
    在这里插入图片描述

  2. 此时用户2对num设置为19,此时用户1还没有提交事务
    在这里插入图片描述

  3. 此时用户1提交事务,再get num时值就变成了5,而不是19,然后在用户2中值也变成了5(这里就体现出事务的回滚)
    在这里插入图片描述
    在这里插入图片描述

基于特定条件的事务执行——分布式锁

  1. 使用setnx设置一个公共锁 setnx lock-key value

  2. 使用expire为锁key添加时间限定
    expire lock-key second | pexpire lock-key milliseconds

业务场景
京东在618活动中,客户购买热情高涨,不一会儿就将所有商品购买完毕,如何避免最后一件商品不被多人同时购买(超卖问题),并且如果最后一个商品被别人买了会提示要在30分钟内付款,否则会取消订单,这样其他抢购的人会在页面上显示你还有机会,当前还有人未付款。

1) 用户1抢购到该商品

在这里插入图片描述
2) 由于此时给该商品加锁,因此用户2无法进行购买,只有解锁才可以进行操作
在这里插入图片描述

Redis事务在Java中的实例可以通过使用Jedis来实现。Jedis是一个流行的Java Redis客户端库,它提供了许多与Redis交互的方法和功能。在使用Jedis执行Redis事务时,我们可以按照以下步骤进行操作: 1. 首先,我们需要创建Jedis实例,连接到Redis服务器。 2. 使用Jedis的multi方法开始事务,该方法用于开启一个新的事务块。 3. 在事务块中,我们可以使用Jedis的各种命令,例如set、get、incr等,来执行我们需要的Redis操作。 4. 当我们完成所有的操作后,使用Jedis的exec方法来提交事务。 5. 如果在事务执行过程中出现了错误,事务会继续执行其他命令,而不会终止。因此,我们需要在执行事务后检查错误,并根据需要进行处理。 下面是一个简单的Java代码示例,演示了如何使用Jedis执行Redis事务: ```java import redis.clients.jedis.Jedis; import redis.clients.jedis.Response; import redis.clients.jedis.Transaction; public class RedisTransactionExample { public static void main(String[] args) { // 创建Jedis实例,连接到Redis服务器 Jedis jedis = new Jedis("localhost"); // 开始事务 Transaction transaction = jedis.multi(); // 在事务中执行Redis操作 transaction.set("key1", "value1"); transaction.set("key2", "value2"); transaction.incr("counter"); // 提交事务 transaction.exec(); // 获取事务执行后的结果 System.out.println(jedis.get("key1")); System.out.println(jedis.get("key2")); System.out.println(jedis.get("counter")); // 关闭Jedis连接 jedis.close(); } } ``` 在上面的示例中,我们使用Jedis的multi方法开始事务,然后分别执行了set、incr等Redis操作,最后使用exec方法提交事务。在提交事务后,我们可以通过get方法获取事务执行后的结果。请注意,事务的执行是原子的,要么全部成功,要么全部失败。 <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【Redis缓存机制】详解Java连接Redis_Jedis_事务](https://download.csdn.net/download/weixin_38548434/12789789)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [RedisRedis事务](https://blog.csdn.net/weixin_32208021/article/details/114468607)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值