使用Redis实现秒杀功能的简单方法


Posted in Redis onMay 08, 2021

1. 怎样预防数据库超售现象

设置数据库事务的隔离级别为Serializable(不可用)

Serializable就是让数据库去串行化的去执行事务,一个事务执行完才能去执行下一个事务,效率太慢

在数据表上设置乐观锁字段,例如设置版本号(version)

不同事务在执行更新操作时,需要先判断一下版本号是否已被修改

代码实现乐观锁流程

使用Redis实现秒杀功能的简单方法

1.1. 什么表需要设置乐观锁

出现同时修改同一条记录的业务,相应的数据表要设置乐观锁

不会出现同时修改同一记录的数据库,就不需要设置乐观锁

2. 利用Redis防止超售

为了保证事务的一致性,在开启事务之前必须要用WATCH命令监视要操作的记录

redis > WATCH kill_num kill_user

使用MULTI命令开启一个事务

redis > MULTI

开启事务后的所有操作都不会立即执行,只有执行EXEC命令的时候才会批处理执行

redis > DECR kill_num
redis > RPUSH kill_user 10086
redis > EXEC

spring-boot 引入 redis 依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

实现代码

@Autowired
private StringRedisTemplate redisTemplate;

public void kill() {
    // 获取库存
    int killNum = Integer.parseInt(Objects.requireNonNull(redisTemplate.opsForValue().get("kill_num")));
    if (killNum > 0) {
        redisTemplate.watch(Arrays.asList("kill_num", "kill_user"));
        // 开启事务
        redisTemplate.multi();
        // 库存-1
        redisTemplate.opsForValue().decrement("kill_num");
        // 记录秒杀用户id(10086)
        redisTemplate.opsForList().rightPush("kill_user", "10086");
        // 提交事务
        redisTemplate.exec();
    }
}

总结

到此这篇关于使用Redis实现秒杀功能的文章就介绍到这了,更多相关Redis秒杀功能内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Redis 相关文章推荐
Redis6.0搭建集群Redis-cluster的方法
May 08 Redis
详解Redis主从复制实践
May 19 Redis
浅谈redis缓存在项目中的使用
May 20 Redis
redis哨兵常用命令和监控示例详解
May 27 Redis
比较几种Redis集群方案
Jun 21 Redis
你真的了解redis为什么要提供pipeline功能
Jun 22 Redis
Redis主从配置和底层实现原理解析(实战记录)
Jun 30 Redis
为什么RedisCluster设计成16384个槽
Sep 25 Redis
redis击穿 雪崩 穿透超详细解决方案梳理
Mar 17 Redis
Redis高可用集群redis-cluster详解
Mar 20 Redis
关于Redis的主从复制及哨兵问题
Jun 16 Redis
如何使用注解方式实现 Redis 分布式锁
Jul 23 Redis
Redis6.0搭建集群Redis-cluster的方法
May 08 #Redis
浅谈Redis存储数据类型及存取值方法
Redis IP地址的绑定的实现
May 08 #Redis
redis通过6379端口无法连接服务器(redis-server.exe闪退)
redis 查看所有的key方式
Redis5之后版本的高可用集群搭建的实现
详解RedisTemplate下Redis分布式锁引发的系列问题
You might like
fleaphp crud操作之find函数的使用方法
2011/04/23 PHP
非常全面的php日期时间运算汇总
2015/11/04 PHP
PHP 将dataurl转成图片image方法总结
2016/10/14 PHP
PHP基于SMTP协议实现邮件发送实例代码
2017/04/27 PHP
PHP有序表查找之二分查找(折半查找)算法示例
2018/02/09 PHP
Jquery图形报表插件 jqplot简介及参数详解
2012/10/10 Javascript
JS控制日期显示的小例子
2013/11/23 Javascript
css3元素简单的闪烁效果实现(html5 jquery)
2013/12/28 Javascript
js函数内变量的作用域分析
2015/01/12 Javascript
jquery实现平滑的二级下拉菜单效果
2015/08/26 Javascript
常常会用到的截取字符串substr()、substring()、slice()方法详解
2015/12/16 Javascript
JavaScript修改作用域外变量的方法
2016/03/25 Javascript
使用jQuery制作Web页面遮罩层插件的实例教程
2016/05/26 Javascript
js字符串引用的两种方式(必看)
2016/09/18 Javascript
详解利用exif.js解决ios手机上传竖拍照片旋转90度问题
2016/11/04 Javascript
设置jquery UI 控件的大小方法
2016/12/12 Javascript
Bootstrap table使用方法总结
2017/05/10 Javascript
require.js中的define函数详解
2017/07/10 Javascript
详解vue-cli+element-ui树形表格(多级表格折腾小计)
2019/04/17 Javascript
VUE 自定义组件模板的方法详解
2019/08/30 Javascript
微信小程序实现左侧滑动导航栏
2020/04/08 Javascript
JavaScript实现拖动对话框效果的实现代码
2020/10/12 Javascript
python去除所有html标签的方法
2015/05/05 Python
关于pip的安装,更新,卸载模块以及使用方法(详解)
2017/05/19 Python
使用Python的turtle模块画国旗
2019/09/24 Python
Python脚本如何在bilibili中查找弹幕发送者
2020/06/04 Python
浅谈Python 函数式编程
2020/06/20 Python
Python绘图之二维图与三维图详解
2020/08/04 Python
宠物店的创业计划书范文
2014/01/11 职场文书
村委会主任先进事迹
2014/01/15 职场文书
护士辞职信范文
2014/01/19 职场文书
小学毕业感言150字
2014/02/05 职场文书
反邪教宣传工作方案
2014/05/07 职场文书
2015年七一建党节活动总结
2015/03/20 职场文书
2015年安全生产工作总结范文
2015/04/02 职场文书
2016七夕情人节感言
2015/12/09 职场文书