• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    使用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秒杀功能内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • php结合redis实现高并发下的抢购、秒杀功能的实例
    • Redis瞬时高并发秒杀方案总结
    • php+redis实现商城秒杀功能
    • redis使用watch秒杀抢购实现思路
    • 基于redis分布式锁实现秒杀功能
    • php和redis实现秒杀活动的流程
    • Redis使用watch完成秒杀抢购功能的代码
    • Java使用Redis实现秒杀功能
    上一篇:Redis6.0搭建集群Redis-cluster的方法
    下一篇:redis 限制内存使用大小的实现
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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