使用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高级数据类型Hyperloglog、Bitmap的使用
May 24 Redis
redis实现的四种常见限流策略
Jun 18 Redis
redis客户端实现高可用读写分离的方式详解
Jul 04 Redis
在redisCluster中模糊获取key方式
Jul 09 Redis
Redis性能监控的实现
Jul 09 Redis
Redis源码阅读:Redis字符串SDS详解
Jul 15 Redis
springboot使用Redis作缓存使用入门教程
Jul 25 Redis
Redis实现主从复制方式(Master&Slave)
Jun 21 Redis
Redis+AOP+自定义注解实现限流
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管理nginx虚拟主机shell脚本实例
2014/11/19 PHP
PHP程序员不应该忽略的3点
2015/10/09 PHP
php基于jquery的ajax技术传递json数据简单实例
2016/04/15 PHP
php实现的一段简单概率相关代码
2016/05/30 PHP
thinkphp框架实现删除和批量删除
2016/06/29 PHP
javascript重复绑定事件造成的后果说明
2013/03/02 Javascript
jquery动态加载select下拉框示例代码
2013/12/10 Javascript
node.js开发中使用Node Supervisor实现监测文件修改并自动重启应用
2014/11/04 Javascript
如何用javascript计算文本框还能输入多少个字符
2015/07/29 Javascript
js编写当天简单日历效果【实现代码】
2016/05/03 Javascript
jQuery Raty 一款不错的星级评分插件
2016/08/24 Javascript
200行代码实现blockchain 区块链实例详解
2018/03/14 Javascript
element-ui 限制日期选择的方法(datepicker)
2018/05/16 Javascript
解决mui框架中switch开关通过js控制开或者关状态时小圆点不动的问题
2019/09/03 Javascript
video.js添加自定义组件的方法
2020/12/09 Javascript
Python无损音乐搜索引擎实现代码
2018/02/02 Python
tensorflow训练中出现nan问题的解决
2018/02/10 Python
浅谈Python批处理文件夹中的txt文件
2019/03/11 Python
Python数据类型之Tuple元组实例详解
2019/05/08 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
2019/11/11 Python
PyTorch使用cpu加载模型运算方式
2020/01/13 Python
python实现字符串和数字拼接
2020/03/02 Python
Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow
2020/04/20 Python
20行Python代码实现一款永久免费PDF编辑工具的实现
2020/08/27 Python
HTML5去掉输入框type为number时的上下箭头的实现方法
2020/01/03 HTML / CSS
英国音乐设备和乐器商店:Gear4music
2017/10/16 全球购物
微软马来西亚官方网站:Microsoft马来西亚
2019/11/22 全球购物
有机婴儿毛毯和衣服:Monica + Andy
2020/03/01 全球购物
short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
2014/09/26 面试题
党员违纪检讨书
2014/02/18 职场文书
初中班主任评语大全
2014/04/24 职场文书
委托书如何写
2014/08/30 职场文书
校园广播站开场白
2015/06/01 职场文书
付款证明格式范文
2015/06/19 职场文书
CAD实训总结范文
2015/08/03 职场文书
PHP中国际化的字符串排序和比较对象详解
2021/08/23 PHP