redis使用watch完成秒杀抢购功能

redis使用watch完成秒杀抢购功能:

使用redis中两个key完成秒杀抢购功能,mywatchkey用于存储抢购数量和mywatchlist用户存储抢购列表。

它的优点如下:

1. 首先选用内存数据库来抢购速度极快。

2. 速度快并发自然没不是问题。

3. 使用悲观锁,会迅速增加系统资源。

4. 比队列强的多,队列会使你的内存数据库资源瞬间爆棚。

5. 使用乐观锁,达到综合需求。

我觉得以下代码肯定是你想要的。

[php] view plain copy

print?

  1. <?php
  2. header("content-type:text/html;charset=utf-8");
  3. $redis = new redis();
  4. $result = $redis->connect(‘10.10.10.119‘, 6379);
  5. $mywatchkey = $redis->get("mywatchkey");
  6. $rob_total = 100;   //抢购数量
  7. if($mywatchkey<$rob_total){
  8. $redis->watch("mywatchkey");
  9. $redis->multi();
  10. //设置延迟,方便测试效果。
  11. sleep(5);
  12. //插入抢购数据
  13. $redis->hSet("mywatchlist","user_id_".mt_rand(1, 9999),time());
  14. $redis->set("mywatchkey",$mywatchkey+1);
  15. $rob_result = $redis->exec();
  16. if($rob_result){
  17. $mywatchlist = $redis->hGetAll("mywatchlist");
  18. echo "抢购成功!<br/>";
  19. echo "剩余数量:".($rob_total-$mywatchkey-1)."<br/>";
  20. echo "用户列表:<pre>";
  21. var_dump($mywatchlist);
  22. }else{
  23. echo "手气不好,再抢购!";exit;
  24. }
  25. }
  26. ?>

原文地址:https://www.cnblogs.com/xiaoleiel/p/8324224.html

时间: 2024-08-28 15:18:28

redis使用watch完成秒杀抢购功能的相关文章

redis使用watch完成秒杀抢购功能(转)

redis使用watch完成秒杀抢购功能: 使用redis中两个key完成秒杀抢购功能,mywatchkey用于存储抢购数量和mywatchlist用户存储抢购列表. 它的优点如下: 1. 首先选用内存数据库来抢购速度极快. 2. 速度快并发自然没不是问题. 3. 使用悲观锁,会迅速增加系统资源. 4. 比队列强的多,队列会使你的内存数据库资源瞬间爆棚. 5. 使用乐观锁,达到综合需求. 我觉得以下代码肯定是你想要的. [php] view plain copy print? <?php hea

redis使用watch完成秒杀抢购功能:

使用redis中两个key完成秒杀抢购功能,mywatchkey用于存储抢购数量和mywatchlist用户存储抢购列表. 它的优点如下: 1. 首先选用内存数据库来抢购速度极快. 2. 速度快并发自然没不是问题. 3. 使用悲观锁,会迅速增加系统资源. 4. 比队列强的多,队列会使你的内存数据库资源瞬间爆棚. 5. 使用乐观锁,达到综合需求. 我觉得以下代码肯定是你想要的. <?php header("content-type:text/html;charset=utf-8")

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

最近在项目中遇到了类似"秒杀"的业务场景,在本篇博客中,我将用一个非常简单的demo,阐述实现所谓"秒杀"的基本思路. 业务场景 所谓秒杀,从业务角度看,是短时间内多个用户"争抢"资源,这里的资源在大部分秒杀场景里是商品:将业务抽象,技术角度看,秒杀就是多个线程对资源进行操作,所以实现秒杀,就必须控制线程对资源的争抢,既要保证高效并发,也要保证操作的正确. 一些可能的实现 刚才提到过,实现秒杀的关键点是控制线程对资源的争抢,根据基本的线程知识,可

zookeeper实现商品秒杀抢购

package com.test; import java.io.IOException; import java.util.List; import java.util.concurrent.CyclicBarrier; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.WatchedEvent; import org.

一句JS帮你秒杀,抢购

刚刚看到一哥们儿写了一篇jquery插件之倒计时-团购秒杀  突然想到一个主意就是如题 想法:现在很多地方有类似秒杀,抢购等拼手速,网速的(其实就是服务器渣,如:某米),  很多人就想到可以写个客户端,开启一直刷, 我觉得应该可以直接通过js代码来执行. 下面进入正题 如果大家了解并会使用各浏览器的开发者工具就非常好办咯, 本人习惯用chrome,本例也就用chrome F12打开开发者工具 在控制台直接输入js带是可以执行的,所以大家应该有头绪了 测试: 写一个测试页面 <div> <

Redis+lua进行类似秒杀的实现

Redis+lua进行类似秒杀的实现 由于项目需要,需要多线程去获取和修改数据库的库存,考虑到给数据库加锁效率低,所以采用redis+lua来进行实现 . redis的单线程操作特性来执行lua脚本,通过lua脚本来保证原子性.如果通过单纯的redis指令来进行更改,在读和写之间会存在多线程并发更新的问题. 1.首先定义redis数据结构 goodId: { "total":100, "released":0; } 其中goodId为商品id号,可根据此来查询相关的

php+redis实现电商秒杀功能

这一次总结和分享用Redis实现分布式锁来完成电商的秒杀功能.先扯点个人观点,之前我看了一篇博文说博客园的文章大部分都是分享代码,博文里强调说分享思路比分享代码更重要(貌似大概是这个意思,若有误请谅解),但我觉得,分享思路固然重要,但有了思路,却没有实现的代码,那会让人觉得很浮夸的,在工作中的程序猿都知道,你去实现一个功能模块,一段代码,虽然你有了思路,但是实现的过程也是很耗时的,特别是代码调试,还有各种测试等等.所以我认为,思路+代码,才是一篇好博文的主要核心. 直接进入主题. 一.前言 双十

php如何应对秒杀抢购高并发思路

我们常用QPS(Query Per Second,每秒处理请求数)来衡量一个web应用的吞吐率,解决每秒数万次的高并发场景,这个指标非常关键. 举个栗子:假设一个业务请求平均为100ms,同时系统内有20台apache web服务器,MaxClients(apache的最大连接数)设置为500,那么理论QPS峰值就是20*500/0.1=100000(理论与实际肯定有差异). 这系统貌似理论上来说很强大1秒钟处理100000个请求,实际当然没有这么理想.在高并发的实际场景下,机器都处于高负载的状

Javascript Date对象 --- 时间戳及淘宝倒计时抢购功能实现

时间戳(timestamp)是指格林威治时间 1970年 01月 01日 00时 00分 00秒 (北京时间1970年01月01日08时00分00秒)起至现在的总毫秒数. Date.parse( datestring )  parse( ) 方法可以解析一个日期的时间字符串,并返回 1970/01/01 午夜距离该日期时间的毫秒数 //获取2005年7月8日到格林威治时间相差的毫秒数 var timeDifference = Date.parse('2005/7/8'); console.log