10. Redis-事务和锁机制

一、事务

1. 基本介绍

Redsi事务的主要作用就是串联多个命令防止别的命令插队。

2. Multi、Exec、discard

  1. 从输入Multi命令开始,输入的命令都会依次进入命令队列中,但不会执行,直到输入Exec后,Redis会将之前的命令队列中的命令依次执行。
  2. 组队过程中可以通过discard来放弃组队。
    在这里插入图片描述
  3. 演示事务操作
    在这里插入图片描述
  4. 演示事务
    在这里插入图片描述

3. 事务的错误处理

  1. 组队中某个命令出现了报告错误,执行时整个的所有队列都会取消。
    在这里插入图片描述

  2. 如果执行阶段某个命令报出了错误,则只有报错的命令不会被执行,而其他命令都可以正常执行。
    在这里插入图片描述

二、事务冲突

1. 悲观锁

每次在拿数据的时候都会上锁
在这里插入图片描述

2. 乐观锁

乐观锁适用于多图类型的数据
在这里插入图片描述

  1. 乐观锁演示
    在这里插入图片描述
    在这里插入图片描述

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CAFEBABE 34

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

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

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

打赏作者

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

抵扣说明:

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

余额充值