使用工具:Apache an

测压命令: ab -n 100 -c 100 http://www.baidu.com -n代表模拟100个请求,-c代表模拟100个并发,相当于100个人同时访问

    ab -t 60 -c 100 http://www.baidu.com 60秒100个并发,不断发送请求

  

并发处理:

1.加synchronized锁单线程处理、缺点: 无法做到细粒度控制,处理速度也会很慢  只适合单点的情况

2.redis分布式锁:

可以支撑每秒10多万的并发,支持分布式,可以更细粒的控制代码(多台机器上多个线程对一个数据进行操作的互斥)

SETNX key value

将key设置值为value,如果key不存在,这种情况下等同于SET命令,当key存在时,什么也不做

GETSET key value

自动将key对应到value并且返回原来key和对应的value,如果key存在但是对应的value不是字符串,就返回错误

DEMO演示:

加锁处理方法:

@Component
@Slf4j
public class RedisLock {
@Autowired
private StringRedisTemplate stringRedisTemplate;
//加锁
/*
* @param key id
* @param value 当前时间+超时时间
*
* */
public boolean lock(String key,String value){
if (stringRedisTemplate.opsForValue().setIfAbsent(key,value)){
return true;//加锁成功就返回true
}
//不加下面这个可能出现死锁情况
     //代码value加了过期时间* @param value 当前时间+超时时间
    //获取上一个锁的时间,并判断是否小于当前时间,小于就下一步判断,就返回true加锁成功
//currentValue=A 这两个线程的value都是B 其中一个线程拿到锁
String currentValue=stringRedisTemplate.opsForValue().get(key);
//如果锁过期
if (!StringUtils.isEmpty(currentValue)
&& Long.parseLong(currentValue)<System.currentTimeMillis()){//存储时间要小于当前时间
    //出现死锁的另一种情况,当多个线程进来后都没有返回true,接着往下执行,执行代码有先后,而if判断里只有一个线程才能满足条件
    //oldValue=currentValue
    //多个线程进来后只有其中一个线程能拿到锁(即oldValue=currentValue),其他的返回false
//获取上一个锁的时间
String oldValue=stringRedisTemplate.opsForValue().getAndSet(key,value);
if (!StringUtils.isEmpty(oldValue)&& oldValue.equals(currentValue)){//上一个时间不为空,并且等于当前时间
return true;
} }
return false;//失败返回false
} //解锁
public void unlock(String key,String value){//执行删除可能出现异常需要捕获
try {
String currentValue = stringRedisTemplate.opsForValue().get(key);
if (!StringUtils.isEmpty(currentValue) && currentValue.equals(value)) {//如果不为空,就删除锁
stringRedisTemplate.opsForValue().getOperations().delete(key);
}
}catch (Exception e){
log.error("[redis分布式锁] 解锁",e);
}
}
}

  

  

//秒杀demo
pprivate static final int TIMEOUT=10*1000;//超时时间设置为10s
@Autowrite
private RedisLock redisLock;
public void method(String id){ //加锁-死锁出现:即在加锁后运行程序出现意外报了异常,而此时还没调用解锁方法
//那么在下一个线程调用加锁方法是就不能set,直接返回fale,然后一直停留在加锁失败状态 这就出现了死锁
long time=System.currentTimeMillis()+TIMEOUT;
//如果加锁不成功就抛出异常 if(!redisLock.lock.get(id,String.valueof(time))){
throw new WechatSellException(101,"哎哟喂,人也太多了,换个姿势再试试");
}
//加锁成功就实现业务代码处理 //1.查询该商品库存,为0表示活动结束 //2.下单 3.扣库存 //解锁
redisLock.unlock(id,String.valueof(time))); }

  

  

  

   

用压测模拟并发、并发处理(synchronized,redis分布式锁)的更多相关文章

  1. springboot项目:Redis分布式锁的使用(模拟秒杀系统)

    模拟秒杀系统: 第一步:编写Service package com.payease.service; /** * liuxiaoming * 2017-12-14 */ public interfac ...

  2. 漫谈Redis分布式锁实现

    在Redis上,可以通过对key值的独占来实现分布式锁,表面上看,Redis可以简单快捷通过set key这一独占的方式来实现分布式锁,也有许多重复性轮子,但实际情况并非如此.总得来说,Redis实现 ...

  3. 使用AB对Nginx压测和并发预估

    简介 ab命令会创建多个并发访问线程,模拟多个访问者同时对某一URL地址进行访问.它的测试目标是基于URL的. # 1.ab每次只能测试一个URL,适合做重复压力测试 # 2.参数很多,可以支持添加c ...

  4. 使用Redis分布式锁处理并发,解决超卖问题

    一.使用Apache ab模拟并发压测 1.压测工具介绍 $ ab -n 100 -c 100 http://www.baidu.com/ -n表示发出100个请求,-c模拟100个并发,相当是100 ...

  5. synchronized的不足与redis分布式锁的使用

    这里是一个简单模拟秒杀的逻辑,stock和orders为两个Map,分别模拟库存表和订单表 public void orderProductMockDiffUser(String productId) ...

  6. springboot+redis分布式锁-模拟抢单

    本篇内容主要讲解的是redis分布式锁,这个在各大厂面试几乎都是必备的,下面结合模拟抢单的场景来使用她:本篇不涉及到的redis环境搭建,快速搭建个人测试环境,这里建议使用docker:本篇内容节点如 ...

  7. java高级精讲之高并发抢红包~揭开Redis分布式集群与Lua神秘面纱

    java高级精讲之高并发抢红包~揭开Redis分布式集群与Lua神秘面纱 redis数据库 Redis企业集群高级应用精品教程[图灵学院] Redis权威指南 利用redis + lua解决抢红包高并 ...

  8. Redis 分布式锁及缓存注释的使用方法

    使用工具:Apache an 测压命令: ab -n 100 -c 100 http://www.baidu.com -n代表模拟100个请求,-c代表模拟100个并发,相当于100个人同时访问 ab ...

  9. Redis分布式锁解决抢购问题

    转:https://segmentfault.com/a/1190000011421467 废话不多说,首先分享一个业务场景-抢购.一个典型的高并发问题,所需的最关键字段就是库存,在高并发的情况下每次 ...

随机推荐

  1. python控制台输出颜色

    python_控制台输出带颜色的文字方法在开发项目过程中,为了方便调试代码,经常会向stdout中输出一些日志,默认的这些日志就直接显示在了终端中.而一般的应用服务器,第三方库,甚至服务器的一些通告也 ...

  2. input输入框type=file时accept中可以限制的文件类型(转载)

    转载自: input type=file accept中可以限制的文件类型 在上传文件的时候,需要限制指定的文件类型. <input type="file" accept=& ...

  3. ffmpeg应用笔记

    官网 http://ffmpeg.org/ 应用手册 http://ffmpeg.org/documentation.html 雷霄骅专栏 https://blog.csdn.net/leixiaoh ...

  4. rtcp多媒体控制协议应用

    rtcp package send/recv demo main.c #include <stdio.h> #include <rtp.h> #include <rtcp ...

  5. file /etc/httpd/conf.d/php.conf from install of php-5.6.37-1.el7.remi.x86_64 conflicts with file from package mod_php71w-7.1.18-1.w7.x86_64

    yum remove mod_php71w php71w-cli

  6. MySQL server has gone away With statement: INSERT INTO `students`......

    mysql出现ERROR : (2006, 'MySQL server has gone away') 的问题意思就是指client和MySQL server之间的链接断开了. 首选分析给出可能出现的 ...

  7. Qt 引用头文件 QT_BEGIN_NAMESPACE QT_END_NAMESPACE

    Qt里面引入头文件的两种方式: 1. #include <QMdiArea> #include<QSplashScreen> 2. QT_BEGIN_NAMESPACE cla ...

  8. Java实现动态规划法求解0/1背包问题

    摘要: 使用动态规划法求解0/1背包问题. 难度: 初级 0/1背包问题的动态规划法求解,前人之述备矣,这里所做的工作,不过是自己根据理解实现了一遍,主要目的还是锻炼思维和编程能力,同时,也是为了增进 ...

  9. JavaScript高级内容笔记:原型链、继承、执行上下文、作用域链、闭包

    最近在系统的学习JS深层次内容,并稍微整理了一下,作为备忘和后期复习,这里分享给大家,希望对大家有所帮助.如有错误请留言指正,tks. 了解这些问题,我先一步步来看,先从稍微浅显内容说起,然后引出这些 ...

  10. 微信小程序中公用内容

    微信小程序中各个页面调用公用的js 在util.js文件中 // 跳转哪里 function go(where) { wx.reLaunch({ url: where, }) } // 将方法暴露出去 ...