使用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 相关文章推荐
在K8s上部署Redis集群的方法步骤
Apr 27 Redis
redis哨兵常用命令和监控示例详解
May 27 Redis
详解Redis复制原理
Jun 04 Redis
redis客户端实现高可用读写分离的方式详解
Jul 04 Redis
Redis入门教程详解
Aug 30 Redis
redis的list数据类型相关命令介绍及使用
Jan 18 Redis
一文搞懂Redis中String数据类型
Apr 03 Redis
Redis数据同步之redis shake的实现方法
Apr 21 Redis
Redis高并发缓存架构性能优化
May 15 Redis
Redis 限流器
May 15 Redis
浅谈Redis缓冲区机制
Jun 05 Redis
redis protocol通信协议及使用详解
Jul 15 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
咖啡常见的种类
2021/03/03 新手入门
模仿OSO的论坛(五)
2006/10/09 PHP
php实现扫描二维码根据浏览器类型访问不同下载地址
2014/10/15 PHP
ThinkPHP 3.2 版本升级了哪些内容
2015/03/05 PHP
PHP之多条件混合筛选功能的实现方法
2019/10/09 PHP
Yii 框架使用Forms操作详解
2020/05/18 PHP
关于Anemometer图形化显示MySQL慢日志的工具搭建及使用的详细介绍
2020/07/13 PHP
PHP底层运行机制与工作原理详解
2020/07/31 PHP
JavaScript 全角转半角部分
2009/10/28 Javascript
在网页中使用document.write时遭遇的奇怪问题
2010/08/24 Javascript
jQuery ul标签下拉菜单演示代码
2010/12/11 Javascript
js和jquery使按钮失效为不可用状态的方法
2014/01/26 Javascript
详解jquery中$.ajax方法提交表单
2014/11/03 Javascript
JavaScript里实用的原生API汇总
2015/05/14 Javascript
JS实现仿雅虎首页快捷登录入口及导航模块效果
2015/09/19 Javascript
js检测iframe是否加载完成的方法
2015/11/26 Javascript
jQuery动态添加及删除表单上传元素的方法(附demo源码下载)
2016/01/15 Javascript
Node.js中的http请求客户端示例(request client)
2017/05/04 Javascript
微信小程序表单验证错误提示效果
2017/05/19 Javascript
vue 实现 tomato timer(蕃茄钟)实例讲解
2017/07/24 Javascript
基于jQuery实现图片推拉门动画效果的两种方法
2017/08/26 jQuery
js 两个日期比较相差多少天的实例
2017/10/19 Javascript
Webpack打包字体font-awesome的方法示例
2018/04/26 Javascript
es6新特性之 class 基本用法解析
2018/05/05 Javascript
JS sort排序详细使用方法示例解析
2020/09/27 Javascript
简洁的十分钟Python入门教程
2015/04/03 Python
Python tkinter布局与按钮间距设置方式
2020/03/04 Python
Django路由层URLconf作用及原理解析
2020/09/24 Python
欧缇丽英国官方网站:Caudalie英国
2016/08/17 全球购物
英国二手物品交易网站:Preloved
2017/10/06 全球购物
Stührling手表官方网站:男女高品质时尚手表的领先零售商
2021/01/07 全球购物
自我鉴定范文200字
2013/10/02 职场文书
实习生自我评价
2014/01/18 职场文书
大学生的创业计划书就该这么写
2014/01/30 职场文书
优秀党员自我评价范文
2014/09/15 职场文书
毕业生银行实习自我鉴定
2014/10/14 职场文书