使用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五大数据结构和使用场景
Apr 12 Redis
分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了
May 21 Redis
Django使用redis配置缓存的方法
Jun 01 Redis
详解Redis复制原理
Jun 04 Redis
linux下安装redis图文详细步骤
Dec 04 Redis
Redis中缓存穿透/击穿/雪崩问题和解决方法
Dec 04 Redis
redis的list数据类型相关命令介绍及使用
Jan 18 Redis
面试分析分布式架构Redis热点key大Value解决方案
Mar 13 Redis
解决redis批量删除key值的问题
Mar 23 Redis
Redis中key的过期删除策略和内存淘汰机制
Apr 12 Redis
Redis如何实现验证码发送 以及限制每日发送次数
Apr 18 Redis
Redis 报错 error:NOAUTH Authentication required
May 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
php小技巧之过滤ascii控制字符
2014/05/14 PHP
PHP基于CURL进行POST数据上传实例
2014/11/10 PHP
codeigniter中view通过循环显示数组数据的方法
2015/03/20 PHP
js实现最短的XML格式化工具实例
2015/03/12 Javascript
JS阻止事件冒泡行为和闭包的方法
2016/06/16 Javascript
js计算系统当前日期是星期几的方法
2016/07/14 Javascript
JavaScript数组迭代方法
2017/03/03 Javascript
vue系列之动态路由详解【原创】
2017/09/10 Javascript
从setTimeout看js函数执行过程
2017/12/19 Javascript
详解Vue依赖收集引发的问题
2019/04/22 Javascript
简单了解JavaScript中常见的反模式
2019/06/21 Javascript
vue实现顶部菜单栏
2020/11/08 Javascript
[49:31]TFT vs Mski Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
python爬虫headers设置后无效的解决方法
2017/10/21 Python
python在ubuntu中的几种安装方法(小结)
2017/12/08 Python
python爬虫之模拟登陆csdn的实例代码
2018/05/18 Python
解决pip install的时候报错timed out的问题
2018/06/12 Python
python模拟菜刀反弹shell绕过限制【推荐】
2019/06/25 Python
flask框架jinja2模板与模板继承实例分析
2019/08/01 Python
浅谈cv2.imread()和keras.preprocessing中的image.load_img()区别
2020/06/12 Python
如何让python的运行速度得到提升
2020/07/08 Python
requests在python中发送请求的实例讲解
2021/02/17 Python
html5 video标签屏蔽右键视频另存为的js代码
2013/11/12 HTML / CSS
推荐10个HTML5响应式框架
2016/02/25 HTML / CSS
爱岗敬业演讲稿范文
2014/01/14 职场文书
化学教师教学反思
2014/01/17 职场文书
触摸春天教学反思
2014/02/03 职场文书
党的群众路线教育实践活动心得体会
2014/03/03 职场文书
2014年保险公司工作总结
2014/11/22 职场文书
大学生毕业评语
2014/12/31 职场文书
会计主管岗位职责
2015/04/02 职场文书
演讲稿:态度决定一切
2019/04/02 职场文书
这样写python注释让代码更加的优雅
2021/06/02 Python
Springboot如何同时装配两个相同类型数据库
2021/11/17 Java/Android
漫画「处刑少女的生存之道」第3卷封面公开
2022/03/21 日漫