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

相关文章

  • Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题

    Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题

    这篇文章主要介绍了Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题,本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • Redis处理高并发之布隆过滤器详解

    Redis处理高并发之布隆过滤器详解

    这篇文章主要为大家介绍了Redis处理高并发之布隆过滤器详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 基于Redis 实现网站PV/UV数据统计

    基于Redis 实现网站PV/UV数据统计

    PV和UV是两个重要的指标,本文主要介绍了基于Redis 实现网站PV/UV数据统计,具有一定的参考价值,感兴趣的可以了解一下
    2025-04-04
  • 浅谈一下如何保证Redis缓存与数据库的一致性

    浅谈一下如何保证Redis缓存与数据库的一致性

    这篇文章主要介绍了一下如何保证Redis缓存与数据库的一致性,今天这篇文章就带你详细了解一下四种同步策略,需要的朋友可以参考下
    2023-03-03
  • redis中redis-cli使用小结

    redis中redis-cli使用小结

    redis-cli 是Redis命令行界面,一个简单的程序,允许直接从终端向Redis发送命令,并读取服务器发送的回复,本文主要介绍了redis中redis-cli使用小结,感兴趣的可以了解一下
    2023-10-10
  • 关于在Redis中使用Pipelining加速查询的问题

    关于在Redis中使用Pipelining加速查询的问题

    这篇文章主要介绍了在Redis中使用Pipelining加速查询,Redis是一个client-server模式的TCP服务,也被称为Request/Response协议的实现,本文通过一个例子给大家详细介绍,感兴趣的朋友一起看看吧
    2022-05-05
  • Redis教程(二):String数据类型

    Redis教程(二):String数据类型

    这篇文章主要介绍了Redis教程(二):String数据类型,本文讲解了String数据类型概述、相关命令列表、命令使用示例三部分内容,需要的朋友可以参考下
    2015-04-04
  • redis通过6379端口无法连接服务器(redis-server.exe闪退)

    redis通过6379端口无法连接服务器(redis-server.exe闪退)

    这篇文章主要介绍了redis通过6379端口无法连接服务器(redis-server.exe闪退),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • 浅谈Redis主从复制以及主从复制原理

    浅谈Redis主从复制以及主从复制原理

    在现有企业中80%公司大部分使用的是redis单机服务,在实际的场景当中单一节点的redis容易面临风险。本文将介绍Redis主从复制以及主从复制原理。
    2021-05-05
  • Redis的RDB持久化与AOF持久化详解

    Redis的RDB持久化与AOF持久化详解

    这篇文章主要介绍了Redis的RDB持久化与AOF持久化详解,Redis是许多公司都在使用的一款高性能、非关系型数据库,其中最为重要的一个特性就是它支持持久化,本文将深入介绍Redis持久化原理,包括RDB和AOF两种方式的实现,需要的朋友可以参考下
    2023-07-07

最新评论