使用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
redis内存空间效率问题的深入探究
May 17 Redis
redis requires ruby version2.2.2的解决方案
Jul 15 Redis
Redis源码阅读:Redis字符串SDS详解
Jul 15 Redis
关于使用Redisson订阅数问题
Jan 18 Redis
redis的list数据类型相关命令介绍及使用
Jan 18 Redis
Redis 哨兵机制及配置实现
Mar 25 Redis
redis调用二维码时的不断刷新排查分析
Apr 01 Redis
详解Redis的三种常用的缓存读写策略步骤
May 06 Redis
Redis基本数据类型哈希Hash常用操作命令
Jun 01 Redis
Redis实现订单过期删除的方法步骤
Jun 05 Redis
Redis实现主从复制方式(Master&Slave)
Jun 21 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
对google个性主页的拖拽效果的js的完整注释[转]
2007/04/10 Javascript
一实用的实现table排序的Javascript类库
2007/09/12 Javascript
ASP中进行HTML数据及JS数据编码函数
2009/11/11 Javascript
多种方法实现360浏览器下禁止自动填写用户名密码
2014/06/16 Javascript
DEDECMS如何为文章添加HOT NEW标志图片
2015/08/14 Javascript
JavaScript动态创建div等元素实例讲解
2016/01/06 Javascript
JS实现的颜色实时渐变效果完整实例
2016/03/25 Javascript
学习使用Bootstrap输入框、导航、分页等常用组件
2017/05/11 Javascript
vue2.0 datepicker使用方法
2018/02/04 Javascript
详解Vue结合后台的列表增删改案例
2018/08/21 Javascript
js实现移动端轮播图
2020/12/21 Javascript
使用nvm和nrm优化node.js工作流的方法
2019/01/17 Javascript
Vue 2.0 中依赖注入 provide/inject组合实战
2019/06/20 Javascript
使用webpack将ES6转化ES5的实现方法
2019/10/13 Javascript
vue+elementUI(el-upload)图片压缩,默认同比例压缩操作
2020/08/10 Javascript
vue中使用router全局守卫实现页面拦截的示例
2020/10/23 Javascript
node koa2 ssr项目搭建的方法步骤
2020/12/11 Javascript
[02:41]DOTA2英雄基础教程 谜团
2013/12/10 DOTA
使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤
2014/01/23 Python
python print输出延时,让其立刻输出的方法
2019/01/07 Python
Python3.6中Twisted模块安装的问题与解决
2019/04/15 Python
ubuntu 16.04下python版本切换的方法
2019/06/14 Python
Python3安装pip工具的详细步骤
2019/10/14 Python
Python3.6 + TensorFlow 安装配置图文教程(Windows 64 bit)
2020/02/24 Python
windows10环境下用anaconda和VScode配置的图文教程
2020/03/30 Python
windows下的pycharm安装及其设置中文菜单
2020/04/23 Python
浅谈Python中的继承
2020/06/19 Python
python统计mysql数据量变化并调用接口告警的示例代码
2020/09/21 Python
Jupyter安装链接aconda实现过程图解
2020/11/02 Python
Django vue前后端分离整合过程解析
2020/11/20 Python
《陋室铭》教学反思
2014/02/26 职场文书
综艺节目策划方案
2014/06/13 职场文书
企业管理制度设计时要注意的几种“常见病”!
2019/04/19 职场文书
python正则表达式re.search()的基本使用教程
2021/05/21 Python
React四级菜单的实现
2022/04/08 Javascript
尝试使用Python爬取城市租房信息
2022/04/12 Python