一、事务
1. 基本介绍
Redsi事务的主要作用就是串联多个命令防止别的命令插队。
2. Multi、Exec、discard
- 从输入Multi命令开始,输入的命令都会依次进入命令队列中,但不会执行,直到输入Exec后,Redis会将之前的命令队列中的命令依次执行。
- 组队过程中可以通过discard来放弃组队。
- 演示事务操作
- 演示事务
3. 事务的错误处理
-
组队中某个命令出现了报告错误,执行时整个的所有队列都会取消。
-
如果执行阶段某个命令报出了错误,则只有报错的命令不会被执行,而其他命令都可以正常执行。
二、事务冲突
1. 悲观锁
每次在拿数据的时候都会上锁
2. 乐观锁
乐观锁适用于多图类型的数据
- 乐观锁演示
3. Redis事务三特性
三、Redis事务秒杀案例
public class SecKill {
public boolean doSecKill(String uid,String prodid) {
// 1. 非空判断
if (uid == null || prodid == null) {
return false;
}
// 2. 连接redis
Jedis jedis = new Jedis("192.168.227.131",6379);
// 3. 拼接key
// 3.1 库存key
String kcKey = "sk:" + prodid + ":qt";
// 3.2 秒杀成功用户key
String userKey = "sk:" + uid + ":user";
// 4. 获取库存,如果为null,秒杀还未开始
String kc = jedis.get(kcKey);
if (kc == null) {
System.out.println("秒杀还未开始");
jedis.close();
return false;
}
// 5. 判断用户是否重复秒杀操作
if (jedis.sismember(userKey, uid)) {
System.out.println("不能重复购买");
jedis.close();
return false;
}
// 6. 判断商品数量,如果小于1秒杀结束
if (Integer.parseInt(kc) < 1) {
System.out.println("秒杀结束");
jedis.close();
return false;
}
// 7. 秒杀过程
// 7.1 库存 - 1
jedis.decr(kcKey);
// 7.2 把秒杀成功用户添加列表
jedis.sadd(userKey,uid);
System.out.println("秒杀成功");
jedis.close();
return true;
}
}