`

利用 Redis 队列操作的原子性实现秒杀

阅读更多


1.添加一个队列模拟商品列表 启动redis 输入 rpush str 1 2 3 4 5 6 7 8 9 10

2.利用多线程模拟 20 个人抢购这 10 件商品:

import java.util.concurrent.ExecutorService;  
import java.util.concurrent.Executors;  
  
import redis.clients.jedis.Jedis;  
import redis.clients.jedis.JedisPool;  
import redis.clients.jedis.JedisPoolConfig;  
  
/** 
 *  通过Redis队列的原子操作实现秒杀 
 */  
public class RedisSpike {  
  
    public static void main(String[] args) {  
        // redis的队列操作是原子操作  
        // eg: 20个人抢10个商品  
        // lpush productlist 1 2 3 4 5 6 7 8 9 10 商品ID号  
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();  
        jedisPoolConfig.setMaxIdle(10);  
        jedisPoolConfig.setMaxWaitMillis(10000);  
        jedisPoolConfig.setMaxTotal(1024);  
  
        JedisPool jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379);  
        //或者java代码lpush进去  
        //String str[]= {"1","2","3","4","5","6","7","8","9","10"};  
        //Jedis client = jedisPool.getResource();  
        //client.lpush("str",str );  
        ExecutorService executor = Executors.newFixedThreadPool(30);  
  
        for (int i = 0; i < 20; i++) {  
            executor.execute(new SpikeTask(i, jedisPool));  
        }  
  
        executor.shutdown();  
    }  
  
}  
  
class SpikeTask implements Runnable {  
  
    private int customerId;  
  
    private JedisPool jedisPool;  
  
    public SpikeTask (int customerId, JedisPool jedisPool) {  
        this.customerId = customerId;  
        this.jedisPool = jedisPool;  
    }  
  
    @Override  
    public void run() {  
  
        // 执行秒杀  
        Jedis client = jedisPool.getResource();  
  
        String productId = client.lpop("str");  
  
        if (productId != null && productId.length() != 0) {  
            System.out.println("顾客" + customerId + "抢到了" + productId + "号商品");  
        } else {  
            System.out.println("顾客" + customerId + "没有抢到商品");  
        }  
  
    }  
}  

 
3.秒杀结果:



 



 

  • 大小: 34.8 KB
分享到:
评论

相关推荐

    基于mq和redis实现的秒杀系统

    3. **事务处理**:在Redis中,可以利用`WATCH`命令实现分布式事务,保证数据操作的完整性。 4. **回滚策略**:当秒杀过程中出现问题,应有回滚机制恢复系统状态。 5. **监控与报警**:设置完善的监控体系,及时发现...

    Redis从入门到精通(九)Redis实战(六)基于Redis队列实现异步秒杀下单 测试项目代码

    **Redis入门到精通系列之九:Redis实战(六)——基于Redis队列实现异步秒杀下单测试项目代码** 在本教程中,我们将探讨如何利用Redis的队列特性来实现一个高效的异步秒杀下单系统。秒杀活动是电商、营销活动中常见的...

    redis分布式锁实现抢单秒杀

    在IT行业中,尤其是在高并发的电子商务系统中,"redis分布式锁实现抢单秒杀"是一个常见的挑战。这个场景模拟了多个用户同时参与秒杀活动,系统需要确保库存的准确性和抢单的公平性,避免超卖和数据不一致的问题。...

    配置redis的秒杀系统(ssm)

    可以使用Redis的`WATCH`命令进行事务操作,或者使用`lua`脚本实现原子性操作。 7. **异常处理与回滚**: - 需要设计完善的异常处理机制,如Redis连接丢失、网络延迟等情况,确保系统能够稳定运行。 - 在出现异常...

    精选_基于Springboot+Redis+RabbitMQ消息队列实现的秒杀方案_源码打包

    在秒杀系统中,我们可以利用Redis的原子操作(如INCR)来实现库存的减扣,确保在高并发下库存的准确性。此外,通过发布/订阅模式,可以实时通知各个服务库存的变化,避免出现超卖情况。 RabbitMQ是基于AMQP协议的...

    商城秒杀项目,基于springboot开发,使用redis和rocketmq技术增加高并发能力

    - 事务一致性:提供分布式事务功能,确保秒杀操作的原子性和一致性。 4. 环境搭建与启动 "项目环境搭建总结.md"文件详细记录了项目的搭建过程,包括JDK、Maven、SpringBoot、Redis和RocketMQ的安装配置。启动脚本...

    php(TP5)+redis实现秒杀抢购(不限制用户购买次数和限制用户购买次数)

    2. **使用Redis队列**:将用户的请求放入Redis队列,按照FIFO(先进先出)原则处理,防止超卖并保证公平性。 3. **限流机制**:通过Redis的`INCR`命令实现计数器,限制同一用户或IP的请求次数,避免恶意刷单。 ### ...

    springmvc+spring+mybatis+redis是实现秒杀

    其次,Redis的原子操作(如INCR)可以用来实现分布式锁,防止同一商品在同一时间被多个用户秒杀。此外,Redis还可以用作消息队列,当用户请求过多时,可以先将请求放入队列,然后按顺序处理,避免服务器因瞬间高流量...

    Redis的类库及Redis解决订单秒杀超卖问题,极光推送代码

    在本文中,我们将重点讨论Redis的类库、String类型的应用,以及如何利用Redis来解决订单秒杀超卖的问题。同时,还会涉及C# .Net Core下极光推送的代码实现。 首先,让我们来看看C# .Net Core下如何使用Redis的类库...

    redis 队列操作的例子(php)

    在PHP中操作Redis队列,首先需要确保已经安装了PHP Redis客户端扩展,并且配置好Redis服务。实例化Redis对象后,通过连接到Redis服务器,可以执行各种队列操作。 入队操作主要是将数据添加到列表的头部,这在PHP中...

    C# Redis秒杀活动系统源码

    1. **库存管理**:利用Redis的原子操作(如INCR命令)实现库存的精确扣减,确保并发情况下不会出现超卖问题。秒杀开始时,系统会将商品库存预先加载到Redis中,每次成功下单都会通过INCR操作减少库存。 2. **限流与...

    基于PHP+redis的秒杀系统

    它可以存储待秒杀商品的信息,如库存,通过原子操作(如INCR命令)实现库存的扣减,确保在高并发下的数据一致性。此外,Redis还可以用于队列管理,比如将用户请求放入消息队列,避免直接操作数据库,实现流量削峰。 ...

    redis秒杀

    综上所述,"redis秒杀"涉及到Redis的安装、数据导入、用户请求处理、队列管理以及并发控制等多个方面,构建这样的系统需要对Redis的数据结构和操作有深入理解,同时也需要考虑系统的稳定性和可扩展性。

    基于redis实现高并发异步秒杀点评项目

    本项目利用Redis的缓存特性、队列功能以及原子操作来确保系统在面对大量用户请求时能够稳定且高效地运行。 1. **Redis简介** Redis是Remote Dictionary Server的缩写,它是一种开源的、支持网络的、键值存储系统。...

    springboot+redis实现秒杀系统.zip

    3. **请求处理**:当用户点击秒杀按钮,系统需要能快速接收和处理请求,这里就是Redis发挥作用的地方,先将请求放入Redis队列,然后后台服务按顺序处理,确保公平性。 4. **库存扣减**:在Redis中减库存,若库存充足...

    基于redis分布式锁实现“秒杀”

    为了保证系统的稳定性和公平性,在高并发环境下实现秒杀功能时,合理地利用分布式锁变得尤为重要。本文将深入探讨如何使用Redis实现分布式锁,进而完成简单的秒杀功能。 #### 二、业务场景与挑战 ##### 1. 业务...

    基于redis的秒杀系统模拟

    4. **Redis数据结构选择**:在秒杀系统中,可以使用`String`类型存储商品库存,通过`INCRBY`进行原子操作。另外,为了记录每个用户是否已抢购成功,可以使用`Set`存储成功用户的ID,确保每个用户只能购买一次。 5. ...

    mvn+redis实现商城秒杀项目

    总的来说,`mvn+Redis`的商城秒杀系统充分利用了`Maven`的项目管理和`Redis`的高性能特性,实现了高效、可靠的秒杀流程。通过深入理解和实践这样的系统,开发者可以提升在高并发场景下的解决方案设计能力。

    net实现秒杀活动

    3. 使用Redis存储秒杀商品的库存,当库存减少时,通过Redis的原子操作更新库存,防止竞态条件。 4. 对于大量并发请求,可以利用Redis的发布/订阅机制,将请求放入消息队列,后台服务按顺序处理,确保系统稳定运行。 ...

Global site tag (gtag.js) - Google Analytics