使用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 相关文章推荐
Windows中Redis安装配置流程并实现远程访问功能
Jun 07 Redis
浅析Redis Sentinel 与 Redis Cluster
Jun 24 Redis
Redis主从配置和底层实现原理解析(实战记录)
Jun 30 Redis
redis使用不当导致应用卡死bug的过程解析
Jul 01 Redis
redis客户端实现高可用读写分离的方式详解
Jul 04 Redis
Redis性能监控的实现
Jul 09 Redis
基于Redis的List实现特价商品列表功能
Aug 30 Redis
聊聊redis-dump工具安装问题
Jan 18 Redis
分布式Redis Cluster集群搭建与Redis基本用法
Feb 24 Redis
redis sentinel监控高可用集群实现的配置步骤
Apr 01 Redis
解决 Redis 秒杀超卖场景的高并发
Apr 12 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生成指定范围内的N个不重复的随机数
2019/03/18 PHP
php反射学习之不用new方法实例化类操作示例
2019/06/14 PHP
跨浏览器的设置innerHTML方法
2006/09/18 Javascript
Jquery在IE7下无法使用 $.ajax解决方法
2009/11/11 Javascript
js中匿名函数的创建与调用方法分析
2014/12/19 Javascript
js实现完全自定义可带多级目录的网页鼠标右键菜单方法
2015/02/28 Javascript
分享两款带遮罩的jQuery弹出框
2015/12/30 Javascript
javascript显示上周、上个月日期的处理方法
2016/02/03 Javascript
jQuery+CSS实现一个侧滑导航菜单代码
2016/05/09 Javascript
Ionic实现页面下拉刷新(ion-refresher)功能代码
2016/06/03 Javascript
jqPlot jQuery绘图插件的使用
2016/06/18 Javascript
js用类封装pop弹窗组件
2017/10/08 Javascript
JS写XSS cookie stealer来窃取密码的步骤详解
2017/11/20 Javascript
vue实现动态显示与隐藏底部导航的方法分析
2019/02/11 Javascript
nodejs中request库使用HTTPS代理的方法
2019/04/30 NodeJs
layui实现checkbox的目录树tree的例子
2019/09/12 Javascript
Python中的CURL PycURL使用例子
2014/06/01 Python
Python创建系统目录的方法
2015/03/11 Python
Python之数据序列化(json、pickle、shelve)详解
2019/08/30 Python
python中字典增加和删除使用方法
2020/09/30 Python
用sleep间隔进行python反爬虫的实例讲解
2020/11/30 Python
python 将Excel转Word的示例
2021/03/02 Python
英国家电直销:Appliances Direct
2016/09/22 全球购物
匡威比利时官网:Converse Belgium
2017/04/13 全球购物
美国按摩椅批发网站:Titan Chair
2018/12/27 全球购物
英国网上自行车商店:Tredz Bikes
2019/10/29 全球购物
校园自助餐厅的创业计划书
2013/12/26 职场文书
小学三年级学生评语
2014/04/22 职场文书
十岁生日答谢词
2015/01/05 职场文书
幼儿园中班个人总结
2015/02/28 职场文书
前台岗位职责范本
2015/04/16 职场文书
中秋节主题班会
2015/08/14 职场文书
2019年入党思想汇报格式与要求
2019/06/25 职场文书
详解Laravel框架的依赖注入功能
2021/05/27 PHP
SpringDataJPA实体类关系映射配置方式
2021/12/06 Java/Android
Python 图片添加美颜效果
2022/04/28 Python