使用Redis实现秒杀功能的简单方法

 更新时间:2021年05月08日 11:13:46   作者:_灯火阑珊处  
这篇文章主要给大家介绍了关于使用Redis实现秒杀功能的简单方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1. 怎样预防数据库超售现象

设置数据库事务的隔离级别为Serializable(不可用)

Serializable就是让数据库去串行化的去执行事务,一个事务执行完才能去执行下一个事务,效率太慢

在数据表上设置乐观锁字段,例如设置版本号(version)

不同事务在执行更新操作时,需要先判断一下版本号是否已被修改

代码实现乐观锁流程

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秒杀功能内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一起raid数据恢复及回迁成功的案例

    一起raid数据恢复及回迁成功的案例

    这篇文章主要介绍了一起raid数据恢复及回迁成功的案例,需要的朋友可以参考下
    2017-04-04
  • redis的bigkey扫描脚本深入介绍

    redis的bigkey扫描脚本深入介绍

    这篇文章主要给大家介绍了关于redis的bigkey扫描脚本的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • Redis的Cluster集群搭建的实现步骤

    Redis的Cluster集群搭建的实现步骤

    本文档只对Redis的Cluster集群做简单的介绍,并没有对分布式系统的所涉及到的概念做深入的探讨。感兴趣的小伙伴们可以参考一下
    2021-07-07
  • 详解如何利用Redis实现生成唯一ID

    详解如何利用Redis实现生成唯一ID

    随着下单流量逐渐上升,为了降低数据库的访问压力,需要通过请求唯一ID+redis分布式锁来防止接口重复提交。今天我们就一起来看探讨一下,如何通过服务端来完成请求唯一 ID 的生成
    2022-11-11
  • Redis Sentinel实现高可用配置的详细步骤

    Redis Sentinel实现高可用配置的详细步骤

    这篇文章主要介绍了Redis Sentinel实现高可用配置的详细步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • 详解redis缓存与数据库一致性问题解决

    详解redis缓存与数据库一致性问题解决

    这篇文章主要介绍了详解redis缓存与数据库一致性问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Redis+PHP实现用户消息推送每天最多通知2次的功能

    Redis+PHP实现用户消息推送每天最多通知2次的功能

    在开发应用程序中,经常需要向用户推送消息通知,但是为了避免过多的打扰用户,我们希望限制每天最多通知2次,本篇博文将介绍如何使用PHP和Redis实现这一功能,文中有详细的代码示例,需要的朋友可以参考下
    2023-10-10
  • Redis缓存-序列化对象存储乱码问题的解决

    Redis缓存-序列化对象存储乱码问题的解决

    这篇文章主要介绍了Redis缓存-序列化对象存储乱码问题的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • 基于redis实现的点赞功能设计思路详解

    基于redis实现的点赞功能设计思路详解

    点赞是我们现在经常见到的一个效果,如朋友圈、微博都有点赞的效果,下面这篇文章主要跟大家分享了基于redis实现的点赞功能设计思路的相关资料,文中介绍的非常详细,对大家实现点赞功能具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-05-05
  • Redis如何批量删除指定模糊的key举例

    Redis如何批量删除指定模糊的key举例

    在实际项目中,我们可能需要根据一定的条件来删除部分key,这时候就需要用到模糊删除操作这,下面篇文章主要给大家介绍了关于Redis如何批量删除指定模糊的key的相关资料,需要的朋友可以参考下
    2024-08-08

最新评论