使用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
基于Redis过期事件实现订单超时取消
May 08 Redis
Redis集群的关闭与重启操作
Jul 07 Redis
在redisCluster中模糊获取key方式
Jul 09 Redis
缓存替换策略及应用(以Redis、InnoDB为例)
Jul 25 Redis
Redis Cluster 集群搭建你会吗
Aug 04 Redis
Redis高并发防止秒杀超卖实战源码解决方案
Nov 01 Redis
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
Mar 16 Redis
sentinel支持的redis高可用集群配置详解
Apr 01 Redis
解决 Redis 秒杀超卖场景的高并发
Apr 12 Redis
Redis基本数据类型String常用操作命令
Jun 01 Redis
利用Redis实现点赞功能的示例代码
Jun 28 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 模拟POST提交的2种方法详解
2013/06/17 PHP
php实现ip白名单黑名单功能
2015/03/12 PHP
thinkPHP使用post方式查询时分页失效的解决方法
2015/12/09 PHP
详谈PHP程序Laravel 5框架的优化技巧
2016/07/18 PHP
谈谈PHP连接Access数据库的注意事项
2016/08/12 PHP
JavaScript 轻松搞定快捷留言功能 只需一行代码
2010/04/01 Javascript
jQuery 学习第六课 实现一个Ajax的TreeView
2010/05/17 Javascript
nodeType属性返回被选节点的节点类型介绍
2013/11/22 Javascript
Javascript 正则表达式实现为数字添加千位分隔符
2015/03/10 Javascript
Bootstrap每天必学之按钮(一)
2015/11/24 Javascript
Bootstrap按钮组件详解
2016/04/26 Javascript
详解Vue.js 2.0 如何使用axios
2017/04/21 Javascript
AngularJS实现单一页面内设置跳转路由的方法
2017/06/28 Javascript
基于Bootstrap下拉框插件bootstrap-select使用方法详解
2018/08/07 Javascript
vue-router 手势滑动触发返回功能
2018/09/30 Javascript
[36:20]KG vs SECRET 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
Python实现的Google IP 可用性检测脚本
2015/04/23 Python
Python使用内置json模块解析json格式数据的方法
2017/07/20 Python
numpy中索引和切片详解
2017/12/15 Python
python fuzzywuzzy模块模糊字符串匹配详细用法
2019/08/29 Python
TensorFlow实现保存训练模型为pd文件并恢复
2020/02/06 Python
Python参数传递实现过程及原理详解
2020/05/14 Python
Pandas缺失值2种处理方式代码实例
2020/06/13 Python
Python word文本自动化操作实现方法解析
2020/11/05 Python
主题婚礼策划方案
2014/02/10 职场文书
节约用水演讲稿
2014/05/21 职场文书
先进单位申报材料
2014/12/25 职场文书
工作检讨书大全
2015/01/26 职场文书
裁员通知
2015/04/25 职场文书
2015年护士节活动策划方案
2015/05/04 职场文书
酒店开业主持词
2015/07/02 职场文书
Python包argparse模块常用方法
2021/06/04 Python
Python排序算法之插入排序及其优化方案详解
2021/06/11 Python
SpringCloud的JPA连接PostgreSql的教程
2021/06/26 Java/Android
vue实现Toast组件轻提示
2022/04/10 Vue.js
如何使用python包中的sched事件调度器
2022/04/30 Python