使用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 sentinel 频繁主备切换的问题
Apr 12 Redis
Redis5之后版本的高可用集群搭建的实现
Apr 27 Redis
redis 查看所有的key方式
May 07 Redis
Windows下redis下载、redis安装及使用教程
Jun 02 Redis
聊一聊Redis与MySQL双写一致性如何保证
Jun 26 Redis
redis不能访问本机真实ip地址的解决方案
Jul 07 Redis
嵌入式Redis服务器在Spring Boot测试中的使用教程
Jul 21 Redis
详解redis在微服务领域的贡献
Oct 16 Redis
redis的list数据类型相关命令介绍及使用
Jan 18 Redis
在Centos 8.0中安装Redis服务器的教程详解
Mar 21 Redis
Redis分布式锁的7种实现
Apr 01 Redis
redis复制有可能碰到的问题汇总
Apr 03 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.ini-dist 和 php.ini-recommended 的区别介绍(方便开发与安全的朋友)
2012/07/01 PHP
一个经典的PHP文件上传类分享
2014/11/18 PHP
php函数实现判断是否移动端访问
2015/03/03 PHP
php实现的简单美国商品税计算函数
2015/07/13 PHP
PHP递归实现层级树状展开
2016/04/01 PHP
PHP SFTP实现上传下载功能
2017/07/26 PHP
Thinkphp 框架基础之源码获取、环境要求与目录结构分析
2020/04/27 PHP
js点击页面其它地方将某个显示的DIV隐藏
2012/07/12 Javascript
jQuery实现用户注册的表单验证示例
2013/08/28 Javascript
js图片预加载示例
2014/04/30 Javascript
jQuery循环滚动新闻列表示例代码
2014/06/17 Javascript
JavaScript模拟实现继承的方法
2015/03/30 Javascript
简单理解JavaScript中的封装与继承特性
2016/03/19 Javascript
vue component组件使用方法详解
2017/07/14 Javascript
老生常谈javascript的面向对象思想
2017/08/22 Javascript
BootStrap模态框和select2合用时input无法获取焦点的解决方法
2017/09/01 Javascript
如何使用JavaScript实现栈与队列
2019/06/24 Javascript
微信小程序连续签到7天积分获得功能的示例代码
2020/08/20 Javascript
用python实现的去除win下文本文件头部BOM的代码
2013/02/10 Python
在Python下利用OpenCV来旋转图像的教程
2015/04/16 Python
浅谈python为什么不需要三目运算符和switch
2016/06/17 Python
Python面向对象之类的内置attr属性示例
2018/12/14 Python
Django对models里的objects的使用详解
2019/08/17 Python
python中自带的三个装饰器的实现
2019/11/08 Python
python实现在线翻译功能
2020/03/03 Python
戴森香港官方网站:Dyson香港
2021/02/11 全球购物
求职简历的自我评价怎样写好
2013/10/07 职场文书
市政施工员自我鉴定
2014/01/15 职场文书
驾驶员岗位职责
2014/01/29 职场文书
机械设计毕业生自荐信
2014/02/02 职场文书
拉拉队口号
2014/06/16 职场文书
上党课的心得体会
2014/09/02 职场文书
办公室务虚会发言材料
2014/10/20 职场文书
2015年银行个人工作总结
2015/05/14 职场文书
Oracle数据库中通用的函数实例详解
2022/03/25 Oracle
JavaScript实现一键复制内容剪贴板
2022/07/23 Javascript