/**

* Created by PhpStorm.

* redis 销量超卖秒杀解决方案

* redis 文档:http://doc.redisfans.com/

* ab -n 10000 -c 3000 http://localhost/demo.php 模拟并发

*/

$redis = new Redis();

$redis->connect('127.0.0.1',6379);

//1. 对某一个键加锁,这个键是我们自己设置,起到监视作业

$redis->watch('sales');

//获取销量,清空sales 为0

$sales = $redis->get('sales');

//总库存

$store = 4;

if($sales>=$store){

exit('已经被抢光了'); //跳转活动结束页面

}

//redis事务不会回滚, 开启事务

$redis->multi();

$redis->set('sales',$sales+1); //销量加1

$res = $redis->exec();

if($res){

//减库存

include db.php; //数据库连接

//执行sql ,减库存

}

exit;

=====================redis接口限流============================

非脚本实现

private boolean accessLimit(String ip, int limit, int time, Jedis jedis) {

boolean result = true;

String key = "rate.limit:" + ip;

if (jedis.exists(key)) {

long afterValue = jedis.incr(key);

if (afterValue > limit) {

result = false;

}

} else {

Transaction transaction = jedis.multi();

transaction.incr(key);

transaction.expire(key, time);

transaction.exec();

}

return result;

}

以上代码有两点缺陷

可能会出现竞态条件: 解决方法是用 WATCH 监控 rate.limit:$IP 的变动, 但较为麻烦;

以上代码在不使用 pipeline 的情况下最多需要向Redis请求5条指令, 传输过多.

Lua脚本实现

Redis 允许将 Lua 脚本传到 Redis 服务器中执行, 脚本内可以调用大部分 Redis 命令, 且 Redis 保证脚本的原子性:

首先需要准备Lua代码: script.lua

--

-- Created by IntelliJ IDEA.

-- User: jifang

-- Date: 16/8/24

-- Time: 下午6:11

--

local key = "rate.limit:" .. KEYS[]

local limit = tonumber(ARGV[])

local expire_time = ARGV[]

local is_exists = redis.call("EXISTS", key)

if is_exists == then

if redis.call("INCR", key) > limit then

return

else

return

end

else

redis.call("SET", key, )

redis.call("EXPIRE", key, expire_time)

return

end

private boolean accessLimit(String ip, int limit, int timeout, Jedis connection) throws IOException {

List keys = Collections.singletonList(ip);

List argv = Arrays.asList(String.valueOf(limit), String.valueOf(timeout));

return 1 == (long) connection.eval(loadScriptString("script.lua"), keys, argv);

}

// 加载Lua代码

private String loadScriptString(String fileName) throws IOException {

Reader reader = new InputStreamReader(Client.class.getClassLoader().getResourceAsStream(fileName));

return CharStreams.toString(reader);

}

Lua 嵌入 Redis 优势:

减少网络开销: 不使用 Lua 的代码需要向 Redis 发送多次请求, 而脚本只需一次即可, 减少网络传输;

原子操作: Redis 将整个脚本作为一个原子执行, 无需担心并发, 也就无需事务;

复用: 脚本会永久保存 Redis 中, 其他客户端可继续使用.

Redis除了做缓存--Redis做消息队列/Redis做分布式锁/Redis做接口限流

1.用Redis实现消息队列 用命令lpush入队,rpop出队 Long size = jedis.lpush("QueueName", message);//返回存放的数据条数 ...

基于注解的接口限流+统一session认证

代码心得: 一个基本的做法:对于用户身份认证做到拦截器里,针对HandlerMethod进行统一拦截认证,根据方法上的注解标识,判别是否需要身份验证,并将查找出来的User实体存入ThreadLoca ...

【Dnc.Api.Throttle】适用于.Net Core WebApi接口限流框架

Dnc.Api.Throttle    适用于Dot Net Core的WebApi接口限流框架 使用Dnc.Api.Throttle可以使您轻松实现WebApi接口的限流管理.Dnc.Api.Thr ...

限流(三)Redis + lua分布式限流

一.简介 1)分布式限流 如果是单实例项目,我们使用Guava这样的轻便又高性能的堆缓存来处理限流.但是当项目发展为多实例了以后呢?这时候我们就需要采用分布式限流的方式,分布式限流可以以redis + ...

【高并发】亿级流量场景下如何为HTTP接口限流?看完我懂了!!

写在前面 在互联网应用中,高并发系统会面临一个重大的挑战,那就是大量流高并发访问,比如:天猫的双十一.京东618.秒杀.抢购促销等,这些都是典型的大流量高并发场景.关于秒杀,小伙伴们可以参见我的另一篇 ...

Spring Cloud Alibaba基础教程:使用Sentinel实现接口限流

最近管点闲事浪费了不少时间,感谢网友libinwalan的留言提醒.及时纠正路线,继续跟大家一起学习Spring Cloud Alibaba. Nacos作为注册中心和配置中心的基础教程,到这里先告一 ...

SpringCloud(8)---zuul权限校验、接口限流

zuul权限校验.接口限流 一.权限校验搭建 正常项目开发时,权限校验可以考虑JWT和springSecurity结合进行权限校验,这个后期会总结,这里做个基于ZuulFilter过滤器进行一个简单的 ...

Spring Cloud(7):Zuul自定义过滤器和接口限流

上文讲到了Zuul的基本使用: https://www.cnblogs.com/xuyiqing/p/10884860.html 自定义Zuul过滤器: package org.dreamtech.a ...

Guava的RateLimiter实现接口限流

最近开发需求中有需要对后台接口进行限流处理,整理了一下基本使用方法. 首先添加guava依赖: com.google.guava&l ...

随机推荐

linux kernel 0.11 bootsect

bootsect作用 ①将自己移动到0x90000处 ②将setup从磁盘读到0x90200处 ③将system从磁盘读到0x10000处 寄存器 汇编代码中存在:数据段data seg 栈段 sta ...

Qt实现应用程序单实例运行--LocalServer方式

使Qt应用程序能够单实例运行的典型实现方法是使用共享内存实现.该方法实现简单,代码简洁. 但有一个致命缺陷:共享内存(QSharedMemory)实现的单程序运行,当运行环境是UNIX时,并且程序不幸 ...

C#各版本特性

C# 2.0 泛型,可空类型,匿名方法,更方便的委托,迭代器,分布类型,静态类,包含不同访问修饰符的属性的取值和赋值方法,命名空间别名,pragma指令,固定大小的缓冲器. C# 3.0 LINQ,自 ...

php+jquery+ajax+json的一个最简单实例

html页面:

redis rua解决库存问题_库存秒杀问题-redis解决方案- 接口限流相关推荐

  1. B2C电商项目(第十五天、秒杀后端、异步下单、防止恶意刷单、防止重复秒杀、下单接口隐藏、下单接口限流 )

    秒杀后端 学习内容 : 1)实现秒杀异步下单,掌握如何保证生产者&消费者消息不丢失 2)实现防止恶意刷单 3)实现防止相同商品重复秒杀 4)实现秒杀下单接口隐藏 5)实现下单接口限流 一.秒杀 ...

  2. 使用令牌桶算法解决调用第三方接口限流问题

    我们在调用第三方接口时常常会碰到接口限流问题,为了解决这一问题,大家想出了许多方法.我这里介绍一下我的方法,第三方接口限流一般是基于令牌桶算法的,那么我们可以以彼之道还治彼身,使用令牌桶算法实现我方调 ...

  3. Spring自定义注解+redis实现接口限流

    在实际开发中,有时候我们需要对某些接口进行限流,防止有人恶意攻击或者是因为某些接口自身的原因,比如发短信接口,IO处理的接口. 这里我们通过自定义一个注解,并利用Spring的AOP拦截器功能来实现限 ...

  4. Redis 做接口限流

    Redis 除了做缓存,还能干很多很多事情:分布式锁.限流.处理请求接口幂等性...太多太多了- 今天想和小伙伴们聊聊用 Redis 处理接口限流,这也是最近的 TienChin 项目涉及到这个知识点 ...

  5. Redis做接口限流

    Redis 除了做缓存,还能干很多很多事情:分布式锁.限流.处理请求接口幂等性...太多太多了-,今天想和小伙伴们聊聊用 Redis 处理接口限流. 1. 准备工作 首先我们创建一个 Spring B ...

  6. 儒猿秒杀季!微服务限流熔断技术源码剖析与架构设计

    疯狂秒杀季:49元秒杀 原价 299元 的 <微服务限流熔断技术源码剖析与架构设计课> 今天 上午11点,仅 52 套,先到先得! === 课程背景 === 成为一名架构师几乎是每个程序员 ...

  7. redis rua解决库存问题_如何解决高并发下的库存安全问题,没你想得那么复杂(附源码)...

    一. 问题 不知道大家该开发中有没有遇到这样的一个问题,在电影院购票或者去网上买东西的时候,比方说当年哪吒大电影出来的时候,那抢票相当火爆啊,一票难求,那购票系统的后台是如何保证观众能买到自己喜欢的票 ...

  8. redis rua解决库存问题_Redis锁完美解决高并发秒杀问题

    场景:一家网上商城做商品限量秒杀. 1 单机环境下的锁 将商品的数量存到Redis中.每个用户抢购前都需要到Redis中查询商品数量(代替mysql数据库.不考虑事务),如果商品数量大于0,则证明商品 ...

  9. redis rua解决库存问题_【150期】面试官:Redis的各项功能解决了哪些问题?

    点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 >>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅 阶段汇总集 ...

最新文章

  1. 怎么计算另一个表格内某几列的和_Excel 函数(一) – 用 evaluate 函数自动计算
  2. 0x06.基本算法 — 倍增
  3. iOS应用开发入门(3)——点击button控制textview
  4. Linux下创建root权限的账号osadmin
  5. PHP支付宝接口RSA验证
  6. 软件项目管理0714:简化的必要性
  7. pdflush内核线程池及其中隐含的竞争
  8. 检测到目标url存在框架注入漏洞_HOST注入攻击剖析
  9. 云顶之弈机器人法爆_LOL云顶之弈机器人出装怎么选
  10. [Redux/Mobx] Mobx的设计思想是什么
  11. Linux文件及文件内容的查找-转
  12. Mysql 按当天、当月、上月及按日期范围查询 DATE_FORMAT( date, ‘%Y%m‘ )
  13. 【数理统计】一题了解假设检验
  14. 正态分布是离散分布还是连续分布_简单统计学|正态分布之连续数据的概率分布...
  15. 高级语言程序设计(c语言描述) 陆黎明 朱媛媛 练习答案,高级语言程序设计(c语言描述) 陆黎明 朱媛媛 练习答案...
  16. php 红包算法教程,php仿微信红包分配算法的实现方法
  17. 词向量工具——word2vec
  18. 潜心十年,修炼成编程高手
  19. on(submit,)
  20. PM(项目经理)和Scrum Master(敏捷教练)不是非此即彼,也不应是隶属关系,应该有权利制衡

热门文章

  1. c52单片机控制l298n步进电机角度_【设计图文】单片机实现的步进电机控制系统(开题报告+论文+文献综述+外文翻译+DWG图纸)...
  2. 深入探索android热修复技术原理_打卡活动:技术书籍书单
  3. leetcode448-Find All Numbers Disappeared in an Array
  4. Q - Tour - hdu 3488(最小匹配值)
  5. office2010出现“此错误通常是由宏安全性设置造成的”的解决办法
  6. 在delphi中嵌入腳本語言--(譯)RemObjects Pascal Script使用說明(1)(譯)
  7. java 蓝桥杯算法训练 s01串(题解)
  8. 调试器工作原理--CPU软件断点/硬件断点/单步执行标识
  9. tcp状态转换--三次握手/四次挥手
  10. HBase数据读取流程解析