使用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 27 Redis
在K8s上部署Redis集群的方法步骤
Apr 27 Redis
Redis6.0搭建集群Redis-cluster的方法
May 08 Redis
Redis Cluster 字段模糊匹配及删除
May 27 Redis
压缩Redis里的字符串大对象操作
Jun 23 Redis
解析redis hash应用场景和常用命令
Aug 04 Redis
Redis如何实现分布式锁
Aug 23 Redis
redis调用二维码时的不断刷新排查分析
Apr 01 Redis
sentinel支持的redis高可用集群配置详解
Apr 01 Redis
一文搞懂Redis中String数据类型
Apr 03 Redis
Redis中key的过期删除策略和内存淘汰机制
Apr 12 Redis
redis lua限流算法实现示例
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
PHP mail()函数使用及配置方法
2014/01/14 PHP
PHP实现的线索二叉树及二叉树遍历方法详解
2016/04/25 PHP
微信公众平台开发教程⑥ 微信开发集成类的使用图文详解
2019/04/10 PHP
JavaScript事件列表解说
2006/12/22 Javascript
用于自动添加Digg This!按钮的JavaScript
2006/12/23 Javascript
js或者jquery判断图片是否加载完成实现代码
2013/03/20 Javascript
深入理解javascript中的立即执行函数(function(){…})()
2014/06/12 Javascript
JavaScript实现从数组中选出和等于固定值的n个数
2014/09/03 Javascript
jQuery图片轮播滚动切换代码分享
2020/04/20 Javascript
jQuery移动web开发之页面跳转和加载外部页面的实现
2015/12/04 Javascript
基于js实现的限制文本框只可以输入数字
2016/12/05 Javascript
滚动条的监听与内容随着滚动条动态加载的实现
2017/02/08 Javascript
详解Angularjs在控制器(controller.js)中使用过滤器($filter)格式化日期/时间实例
2017/02/17 Javascript
node内置调试方法总结
2018/02/22 Javascript
vue.js实现标签页切换效果
2018/06/07 Javascript
基于Vue 2.0 监听文本框内容变化及ref的使用说明介绍
2018/08/24 Javascript
vue-cli项目代理proxyTable配置exclude的方法
2018/09/20 Javascript
js隐式转换的知识实例讲解
2018/09/28 Javascript
JavaScript的级联函数用法简单示例【链式调用】
2019/03/26 Javascript
微信小程序左右滚动公告栏效果代码实例
2019/09/16 Javascript
浅谈laytpl 模板空值显示null的解决方法及简单的js表达式
2019/09/19 Javascript
layui table 列宽百分比显示的实现方法
2019/09/28 Javascript
uniapp 仿微信的右边下拉选择弹出框的实现代码
2020/07/12 Javascript
Node.js 中如何收集和解析命令行参数
2021/01/08 Javascript
利用Python的Django框架生成PDF文件的教程
2015/07/22 Python
Python检测网络延迟的代码
2018/05/15 Python
Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
2018/09/14 Python
python实现密码强度校验
2020/03/18 Python
Python + selenium + crontab实现每日定时自动打卡功能
2020/03/31 Python
Python日志处理模块logging用法解析
2020/05/19 Python
柏林通行证:Berlin Pass
2018/04/11 全球购物
澳大利亚最受欢迎的美发用品目的地:AMR
2019/08/28 全球购物
记账会计岗位职责
2014/06/16 职场文书
2014年预备党员学习新党章思想汇报
2014/09/15 职场文书
小学语文教师年度考核个人总结
2015/02/05 职场文书
开会迟到检讨书范文
2015/05/06 职场文书