使用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
redis哨兵常用命令和监控示例详解
May 27 Redis
使用Redis实现实时排行榜功能
Jul 02 Redis
Redis性能监控的实现
Jul 09 Redis
浅谈Redis位图(Bitmap)及Redis二进制中的问题
Jul 15 Redis
详解Redis在SpringBoot工程中的综合应用
Oct 16 Redis
详解redis在微服务领域的贡献
Oct 16 Redis
关于SpringBoot 使用 Redis 分布式锁解决并发问题
Nov 17 Redis
Redis+Lua脚本实现计数器接口防刷功能(升级版)
Feb 12 Redis
Redis 报错 error:NOAUTH Authentication required
May 15 Redis
Redis主从复制操作和配置详情
Sep 23 Redis
Redis实战之Lettuce的使用技巧详解
Dec 24 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
全国FM电台频率大全 - 25 云南省
2020/03/11 无线电
极典R601SW收音机
2021/03/02 无线电
PHP生成excel时单元格内换行问题的解决方法
2010/08/26 PHP
IIS下PHP的三种配置方式对比
2014/11/20 PHP
CodeIgniter常用知识点小结
2016/05/26 PHP
centos下file_put_contents()无法写入文件的原因及解决方法
2017/04/01 PHP
javascript showModalDialog,open取得父窗口的方法
2010/03/10 Javascript
基于jquery的15款幻灯片插件
2011/04/10 Javascript
JavaScript Array对象扩展indexOf()方法
2014/05/09 Javascript
Javascript中的五种数据类型详解
2014/12/26 Javascript
JavaScript去除数组里重复值的方法
2015/07/13 Javascript
Zero Clipboard实现浏览器复制到剪贴板的方法(多个复制按钮)
2016/03/24 Javascript
jQuery中each()、find()和filter()等节点操作方法详解(推荐)
2016/05/25 Javascript
jQuery封装的屏幕居中提示信息代码
2016/06/08 Javascript
自定义vue全局组件use使用、vuex的使用详解
2017/06/14 Javascript
JS 组件系列之Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案
2017/06/30 Javascript
jQuery实现的淡入淡出图片轮播效果示例
2018/08/29 jQuery
记一次vue去除#问题处理经过小结
2019/01/24 Javascript
Python面向对象编程基础解析(一)
2017/10/26 Python
python3爬虫之设计签名小程序
2018/06/19 Python
Python3.4 splinter(模拟填写表单)使用方法
2018/10/13 Python
python 字典 setdefault()和get()方法比较详解
2019/08/07 Python
python获得命令行输入的参数的两种方式
2020/11/02 Python
CSS3 新增选择器的实例
2019/11/13 HTML / CSS
写一个用矩形法求定积分的通用函数
2012/11/08 面试题
大学毕业感言50字
2014/02/07 职场文书
初中生考试作弊检讨书
2014/12/14 职场文书
小学教师师德师风自我评价
2015/03/04 职场文书
2015年关爱留守儿童工作总结
2015/05/22 职场文书
在职证明格式样本
2015/06/15 职场文书
幼儿园老师新年寄语
2015/08/17 职场文书
2016新年问候语大全
2015/11/11 职场文书
PyQt5 QThread倒计时功能的实现代码
2021/04/02 Python
python 如何用map()函数创建多线程任务
2021/04/07 Python
Redis中缓存穿透/击穿/雪崩问题和解决方法
2021/12/04 Redis
vue实现列表拖拽排序的示例代码
2022/04/08 Vue.js