redis实现秒杀demo

代码

package com.prosay.redis;

import java.util.List;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;

public class SaleRunable implements Runnable{
    String productKey="iphone8";//监视的key 当前秒杀商品的数量
    Jedis jedis = new Jedis("localhost");
    String userName;
    public SaleRunable(String userName){
        this.userName = userName;
    }

    @Override
    public void run(){
        //商品的key  , 秒杀有个数量
        //watch 监视一个key,当事务执行之前这个key发生了改变,事务会被打断
        jedis.watch(productKey);
        String value = jedis.get(productKey);
        int num = Integer.valueOf(value);
        //这次秒杀的商品是100个iphone8
        if(num<=100&&num>=1){
            //开启事务
            Transaction tx = jedis.multi();
            //减少一个商品数量
            tx.incrBy(productKey, -1);
            //提交事务,如果商品数量发生了改动 则会返回null
            List<Object> list = tx.exec();
            if(list==null || list.size()==0){
                System.out.println(userName+"商品抢购失败!");
            }else{
                for(Object success : list){
                    System.out.println(userName+"("+success.toString()+")商品抢购成功,当前抢购成功的人数是:"+(1-(num-100)));
                }
            }
        }else{
            System.out.println(userName+"商品已经被抢完了");
        }
        jedis.close();
    }

}

测试

package com.prosay.redis;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import redis.clients.jedis.Jedis;

public class TestMs {

    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost");
        jedis.set("iphone8","100");
        jedis.close();
        //玩多线程
        ExecutorService executor = Executors.newFixedThreadPool(20);

        for(int i = 0 ; i < 1000; i++){
            executor.execute(new SaleRunable("user"+i));
        }
        executor.shutdown();

    }

}

转自:https://blog.csdn.net/lzh657083979/article/details/77917088

原文地址:https://www.cnblogs.com/azhqiang/p/9145830.html

时间: 2024-08-30 09:52:06

redis实现秒杀demo的相关文章

.NetCore+Jexus代理+Redis模拟秒杀商品活动

开篇叙 本篇将和大家分享一下秒杀商品活动架构,采用的架构方案正如标题名称.NetCore+Jexus代理+Redis,由于精力有限所以这里只设计到商品添加,抢购,订单查询,处理队列抢购订单的功能:有不足或者不够详细的还请见谅,顺手点个推荐也不错: a. 秒杀流程 b. 封装StackExchange.Redis的使用类 c. Ubuntu16.04上使用Jexus搭建代理完成分布式部署 d. NetCore写实时监控队列服务 秒杀架构设计图︿( ̄︶ ̄)︿三幅 1. 一般业务性架构 2. 后端分布

thinkphp+redis实现秒杀功能

1,安装redis,根据自己的php版本安装对应的redis扩展(此步骤简单的描述一下) 1.1,安装 php_igbinary.dll,php_redis.dll扩展此处需要注意你的php版本如图: 1.2,php.ini文件新增 extension=php_igbinary.dll;extension=php_redis.dll两处扩展 ok此处已经完成第一步redis环境搭建完成看看phpinfo 2,项目中实际使用redis 2.1,第一步配置redis参数如下,redis安装的默认端口

Redis的入门Demo(java)

java代码部分参考了:http://www.runoob.com/redis/redis-java.html 在java中使用Redis,需要引入Redis驱动,就是jedis-2.1.0.jar,而这个jar包又依赖于commons-pool-1.6.jar以及tomcat-redis-session-manager-1.2-tomcat-7.jar,所以我们至少需要这个三个jar包. 第一步:启动本地的Redis服务; 第二步:连接本地的Redis服务,并且设置值,以便于在java代码中获

redis优化秒杀系统

用redis提高基于mss的秒杀系统 使用背景: 普通的基于mss框架的系统在并发量不是很高的情况下,对redis的需求不是很高.redis在系统中的角色相当于一个对象缓存器,在高并发的系统中(比如秒杀系统),在某一刻对数据库中的一条数据可能是成千上万的用户同时去访问,系统的用户体验度直接受到数据库的性能的影响.为了保证数据的完整性,用户只能串行访问数据库中的某一条记录.redis则是把记录对应的对象序列化存储在自身的容器中,减少数据库的压力.废话不多说,接下来简单介绍redis的使用. red

借助Redis做秒杀和限流的思考

最近群里聊起秒杀和限流,我自己没有做过类似应用,但是工作中遇到过更大的数据和并发. 于是提出了一个简单的模型: var count = rds.inc(key); if(count > 1000) throw "已抢光!" 借助Redis单线程模型,它的inc是安全的,确保每次加一,然后返回加一后的结果.如果原来是234,加一了就是235,返回的一定是235,在此中间,不会有别的请求来打断从而导致返回236或者其它. 其实我们可以理解为inc的业务就是占坑排队,每人占一个坑,拿到

秒杀思路: yii2加Redis实现秒杀

整理一些思路 PHP7, yii2加Redis怎么实现秒杀 一个list列表存放秒杀的商品 一个list列表存放秒杀的客户信息 首先读取秒杀商品到商品列表, 然后等待客户秒杀. 每次客户请求, 检查用户列表与商品数量是否大于等于. 如果是就提示已经抢完.下次再来. (这里可以选择方案 是用户下单就减少还是付款再减少) 检查商品的剩余数量是否大于0, 是就减一,并加入客户到列表里面. 否就提示已经抢完.下次再来. (这里可以选择方案 是用户下单就减少还是付款再减少) 每次客户请求, 加入客户到列表

Redis+PHP秒杀设计

讲师介绍: 稳定性建设: 如何做到服务9999的稳定性即每年不可用时间不到1min 高性能系统: 滴滴运营广告系统即并发量很大 社招面试: 秒杀系统的设计与实现,其本质高并发高可用,这两方面的技术可直接决定公司技术水平,提现个人技术实力 概要: 基本知识和原理 减而治之 cdn原理: 减少读的压力,如订单详情页下发到不同地方的cdn节点,访问加速,回源减少 Nginx限流: 请求到达服务端(即接入层)如何做过载保护 异步队列概念: 如通过异步方式创建订单 分而治之 Nginx负载均衡: 流量到达

Spring和redis简单测试demo

1.首先创建一个Maven工程 File --> New --> Other,然后选择Maven目录下的Maven Project,如下图: 然后在弹出的面板中选择配置后,下一步即可,如图: Create a simple project (skip archetype selection) :此选项表示跳过后续的配置选项框. Use default Workspace location:表示将项目放置到默认的工作区域下. 配置好后,Next下一步,再进行如下图的配置: 点击Finish后,便

【NoSql】Redis实践篇-简单demo实现(一)

Redis是一个key-value存储系统. Redis的出现,非常大程度补偿了memcached这类key/value存储的不足,在部分场合能够对关系数据库起到非常好的补充作用 Redis是一个key-value存储系统.和Memcached相似.它支持存储的value类型相对很多其它,包含string(字符串).list(链表).set(集合).zset(sortedset--有序集合)和hash(哈希类型).这些数据类型支持push/pop.add/remove及取交集并集和差集及更丰富的