使用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 相关文章推荐
Redis实现订单自动过期功能的示例代码
May 08 Redis
基于Redis位图实现用户签到功能
May 08 Redis
为Java项目添加Redis缓存的方法
May 18 Redis
Java Socket实现Redis客户端的详细说明
May 26 Redis
Redis主从配置和底层实现原理解析(实战记录)
Jun 30 Redis
redis不能访问本机真实ip地址的解决方案
Jul 07 Redis
Redis性能监控的实现
Jul 09 Redis
Redis Cluster集群动态扩容的实现
Jul 15 Redis
浅谈Redis的keys命令到底有多慢
Oct 05 Redis
关于SpringBoot 使用 Redis 分布式锁解决并发问题
Nov 17 Redis
解决linux下redis数据库overcommit_memory问题
Feb 24 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
使用数据库保存session的方法
2006/10/09 PHP
如何优雅的使用 laravel 的 validator验证方法
2018/11/11 PHP
javascript showModalDialog 多层模态窗口实现页面提交及刷新的代码
2009/11/28 Javascript
JAVASCRIPT style 中visibility和display之间的区别
2010/01/22 Javascript
JavaScript 数组运用实现代码
2010/04/13 Javascript
jquery特效 幻灯片效果示例代码
2013/07/16 Javascript
在JS方法中返回多个值的方法汇总
2015/05/20 Javascript
基于HTML+CSS,jQuery编写的简易计算器后续(添加了键盘监听)
2016/01/05 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(一)
2017/01/21 Javascript
js+html5生成自动排列对话框实例
2017/10/09 Javascript
cordova入门基础教程及使用中遇到的一些问题总结
2017/11/14 Javascript
利用jquery如何从json中读取数据追加到html中
2017/12/01 jQuery
node.js通过axios实现网络请求的方法
2018/03/05 Javascript
浅谈在vue中使用mint-ui swipe遇到的问题
2018/09/27 Javascript
js操作table中tr的顺序实现上移下移一行的效果
2018/11/22 Javascript
jQuery事件多次绑定与解绑问题实例分析
2019/02/19 jQuery
新手快速入门微信小程序组件库 iView Weapp
2019/06/24 Javascript
Angular之jwt令牌身份验证的实现
2020/02/14 Javascript
Vue router传递参数并解决刷新页面参数丢失问题
2020/12/02 Vue.js
Python实现将DOC文档转换为PDF的方法
2015/07/25 Python
对Python之gzip文件读写的方法详解
2019/02/08 Python
python 哈希表实现简单python字典代码实例
2019/09/27 Python
Python+Opencv身份证号码区域提取及识别实现
2020/08/25 Python
详解python中的lambda与sorted函数
2020/09/04 Python
详解基于python的全局与局部序列比对的实现(DNA)
2020/10/07 Python
如何让PyQt5中QWebEngineView与JavaScript交互
2020/10/21 Python
详解Django中的FBV和CBV对比分析
2021/03/01 Python
表单button的outline在firefox浏览器下的问题
2012/12/24 HTML / CSS
CSS3改变浏览器滚动条样式
2019/01/04 HTML / CSS
Europcar葡萄牙:葡萄牙汽车和货车租赁
2017/10/13 全球购物
.NET方向面试题
2014/11/20 面试题
北京麒麟网信息技术有限公司网络游戏测试面试题
2013/09/28 面试题
运输企业安全生产责任书
2014/07/28 职场文书
四风问题个人自查剖析材料思想汇报
2014/09/21 职场文书
2015年个人招商工作总结
2015/04/25 职场文书
《战锤40K:暗潮》跳票至9月 公布新宣传片
2022/04/03 其他游戏