使用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基本命令与使用场景
Jun 01 Redis
了解Redis常见应用场景
Jun 23 Redis
浅析Redis Sentinel 与 Redis Cluster
Jun 24 Redis
Redis字典实现、Hash键冲突及渐进式rehash详解
Sep 04 Redis
详解Redis在SpringBoot工程中的综合应用
Oct 16 Redis
Redis高可用集群redis-cluster详解
Mar 20 Redis
 Redis 串行生成顺序编码的方法实现
Apr 03 Redis
Redis数据同步之redis shake的实现方法
Apr 21 Redis
使用Redis实现分布式锁的方法
Jun 16 Redis
Redis实战之Lettuce的使用技巧详解
Dec 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
php disk_free_space 返回目录可用空间
2010/05/10 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
2020/04/04 PHP
js中top、clientTop、scrollTop、offsetTop的区别 文字详细说明版
2011/01/08 Javascript
JavaScript高级程序设计阅读笔记(六) ECMAScript中的运算符(二)
2012/02/27 Javascript
jQuery下实现等待指定元素加载完毕(可改成纯js版)
2013/07/11 Javascript
文本框水印提示效果的简单实现代码
2014/02/22 Javascript
原生js实现fadein 和 fadeout淡入淡出效果
2014/06/05 Javascript
自编jQuery插件实现模拟alert和confirm
2014/09/01 Javascript
DOM 事件流详解
2015/01/20 Javascript
js实现双击图片放大单击缩小的方法
2015/02/17 Javascript
基于zepto的移动端轻量级日期插件--date_picker
2016/03/04 Javascript
slideToggle+slideup实现手机端折叠菜单效果
2017/05/25 Javascript
Vue结合Video.js播放m3u8视频流的方法示例
2018/05/04 Javascript
select2 ajax 设置默认值,初始值的方法
2018/08/09 Javascript
详解如何在vue项目中使用eslint+prettier格式化代码
2018/11/10 Javascript
移动端滑动切换组件封装 vue-swiper-router实例详解
2018/11/25 Javascript
Vue中keep-alive的两种应用方式
2020/07/15 Javascript
VSCode Vue开发推荐插件和VSCode快捷键(小结)
2020/08/08 Javascript
[01:32]2014DOTA2西雅图邀请赛 CIS我们有信心进入正赛
2014/07/08 DOTA
[01:11:11]Alliance vs RNG 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
python中的一些类型转换函数小结
2013/02/10 Python
Django中的“惰性翻译”方法的相关使用
2015/07/27 Python
动态规划之矩阵连乘问题Python实现方法
2017/11/27 Python
Python实现备份MySQL数据库的方法示例
2018/01/11 Python
Python tkinter的grid布局及Text动态显示方法
2018/10/11 Python
对python中矩阵相加函数sum()的使用详解
2019/01/28 Python
不到40行代码用Python实现一个简单的推荐系统
2019/05/10 Python
Python从list类型、range()序列简单认识类(class)【可迭代】
2019/05/31 Python
Django rest framework jwt的使用方法详解
2019/08/08 Python
TensorFlow使用Graph的基本操作的实现
2020/04/22 Python
HTML5有哪些新特征
2015/12/01 HTML / CSS
大学生应聘自荐信
2013/10/11 职场文书
日语翻译个人求职的自我评价
2013/10/14 职场文书
省级四好少年事迹材料
2014/01/25 职场文书
公务员群众路线心得体会
2014/11/03 职场文书
2015年幼儿园大班工作总结
2015/04/25 职场文书