{"id":917,"date":"2019-08-05T11:04:36","date_gmt":"2019-08-05T03:04:36","guid":{"rendered":"https:\/\/wyxxt.org.cn\/?p=917"},"modified":"2023-12-04T16:44:56","modified_gmt":"2023-12-04T08:44:56","slug":"%e8%ae%a2%e5%8d%95%e4%b8%8e%e5%ba%93%e5%ad%98%e7%9a%84%e9%ab%98%e5%b9%b6%e5%8f%91%e5%a4%84%e7%90%86","status":"publish","type":"post","link":"https:\/\/wyxxt.org.cn\/?p=917","title":{"rendered":"\u8ba2\u5355\u4e0e\u5e93\u5b58\u7684\u9ad8\u5e76\u53d1\u5904\u7406"},"content":{"rendered":"<h3>\u5e93\u5b58\u5b89\u5168<\/h3>\n<h4>\u4e0b\u5355\u903b\u8f91<\/h4>\n<ol>\n<li>\u5224\u65ad\u5e93\u5b58<\/li>\n<li>\u51cf\u53bb\u5e93\u5b58<\/li>\n<li>\u751f\u6210\u8ba2\u5355<\/li>\n<\/ol>\n<pre><code class=\"language-php line-numbers\"> \/**\n * \u4e0b\u5355\u64cd\u4f5c1\n *\n * @param req\n *\/\nprivate place1($req) {\n    $user = userDao.findOne($req.getUserId());\n    $product = productDao.findOne($req.getProductId());\n    \/\/\u4e0b\u5355\u6570\u91cf\n    $num = $req.getNum();\n    \/\/\u53ef\u7528\u5e93\u5b58\n    $availableNum = $product.getAvailableNum();\n    \/\/\u53ef\u7528\u9884\u5b9a\n    if ($availableNum &gt;= $num) {\n        \/\/\u51cf\u5e93\u5b58\n        $count = productDao.reduceStock1($product.getId(), $num);\n        if ($count == 1) {\n            \/\/\u751f\u6210\u8ba2\u5355\n            createOrders($user, $product, $num);\n        } else {\n            logger.info(\"\u5e93\u5b58\u4e0d\u8db3 3\");\n        }\n        return 1;\n    } else {\n        logger.info(\"\u5e93\u5b58\u4e0d\u8db3 4\");\n        return -1;\n    }\n}\n<\/code><\/pre>\n<h4>\u4f4e\u5e76\u53d1\u5904\u7406\u65b9\u6848<\/h4>\n<ul>\n<li>redis\u9501\uff0c\u9650\u5236\u5e76\u53d1<\/li>\n<\/ul>\n<pre><code class=\"language-php line-numbers\">\/**\n * \u91c7\u7528 Redis \u9501  \u901a\u4e00\u4e2a\u65f6\u95f4 \u53ea\u80fd\u4e00\u4e2a \u8bf7\u6c42\u4fee\u6539 \u540c\u4e00\u4e2a\u5546\u54c1\u7684\u6570\u91cf\n * &lt;p&gt;\n * \u7f3a\u70b9\u5e76\u53d1\u4e0d\u9ad8,\u540c\u65f6\u53ea\u80fd\u4e00\u4e2a\u7528\u6237\u62a2\u5360\u64cd\u4f5c,\u7528\u6237\u4f53\u9a8c\u4e0d\u597d\uff01\n *\n * @param req\n *\/\npublic void placeOrder2($req) {\n    $lockKey = \"placeOrder:\" + $req.getProductId();\n    $isLock = redisService.lock($lockKey);\n    if (!$isLock) {\n        logger.info(\"\u7cfb\u7edf\u7e41\u5fd9\u7a0d\u540e\u518d\u8bd5!\");\n        return 2;\n    }\n    \/\/place2(req);\n    place1($req);\n    \/\/\u8fd9\u4e24\u4e2a\u65b9\u6cd5\u90fd\u53ef\u4ee5\n    redisService.unLock($lockKey);\n}\n<\/code><\/pre>\n<h4>\u9ad8\u5e76\u53d1\u5904\u7406\u65b9\u6848<\/h4>\n<ol>\n<li>\u5546\u54c1\u5e93\u5b58\u4fdd\u5b58\u5230redis\uff0credis increment\u64cd\u4f5c\u4e3a\u539f\u5b50\u6027<\/li>\n<li>\u5e93\u5b58\u68c0\u67e5\u4e0e\u51cf\u5c11\u5e93\u5b58\u4e0d\u662f\u539f\u5b50\u6027\uff0c\u4ee5increment > 0\u4e3a\u51c6<\/li>\n<\/ol>\n<pre><code class=\"language-php line-numbers\">public placeOrder3($req) {\n    $key = \"product:\" + $req.getProductId();\n    \/\/ \u5148\u68c0\u67e5 \u5e93\u5b58\u662f\u5426\u5145\u8db3\n    $num = (int) redisService.get($key);\n    if ($num &lt; $req.getNum()) {\n        logger.info(\"\u5e93\u5b58\u4e0d\u8db3 1\");\n    }else{\n        \/\/\u4e0d\u53ef\u5728\u8fd9\u91cc\u4e0b\u5355\u51cf\u5e93\u5b58\uff0c\u5426\u5219\u5bfc\u81f4\u6570\u636e\u4e0d\u5b89\u5168\uff0c \u60c5\u51b5\u7c7b\u4f3c \u65b9\u6cd51\uff1b\n    }\n    \/\/\u51cf\u5c11\u5e93\u5b58\n    $value = redisService.increment($key, -$req.getNum().longValue());\n    \/\/\u5e93\u5b58\u5145\u8db3\n    if ($value &gt;= 0) {\n        logger.info(\"\u6210\u529f\u62a2\u8d2d ! \");\n        \/\/TODO \u771f\u6b63\u51cf \u6263 \u5e93\u5b58 \u7b49\u64cd\u4f5c \u4e0b\u5355\u7b49\u64cd\u4f5c  ,\u8fd9\u4e9b\u64cd\u4f5c\u53ef\u7528\u901a\u8fc7 MQ \u6216 \u5176\u4ed6\u65b9\u5f0f\n        place1(req);\n    } else {\n        \/\/\u5e93\u5b58\u4e0d\u8db3\uff0c\u9700\u8981\u589e\u52a0\u521a\u521a\u51cf\u53bb\u7684\u5e93\u5b58\n        redisService.increment($key, $req.getNum().longValue());\n        logger.info(\"\u5e93\u5b58\u4e0d\u8db3 2 \");\n    }\n}\n<\/code><\/pre>\n<h3>\u9ad8\u5e76\u53d1\u6838\u5fc3\u6280\u672f-MQ<\/h3>\n<h4>\u5b89\u88c5\u670d\u52a1\u7aef<\/h4>\n<ol>\n<li>\u5b89\u88c5Erlang<a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/www.erlang.org\/downloads\" title=\"https:\/\/www.erlang.org\/downloads\">https:\/\/www.erlang.org\/downloads<\/a><\/li>\n<li>\u5b89\u88c5RabbitMQ<a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/www.rabbitmq.com\/\" title=\"https:\/\/www.rabbitmq.com\/\">https:\/\/www.rabbitmq.com\/<\/a><\/li>\n<li>\u914d\u7f6e\u73af\u5883\u53d8\u91cf<\/li>\n<\/ol>\n<p>&#8211; ERLANG_HOME=C:\\soft\\erl10.4<br \/>\n&#8211; RABBITMQ_SERVER=C:\\soft\\RabbitMQ Server\\rabbitmq_server-3.7.17<br \/>\n&#8211; Path=%ERLANG_HOME%\\bin;%RABBITMQ_SERVER%\\sbin<br \/>\n4. \u57fa\u7840\u547d\u4ee4 \u8fdb\u5165C:\\soft\\RabbitMQ Server\\rabbitmq_server-3.7.17\\sbin<br \/>\n&#8211; \u67e5\u770bmq\u72b6\u6001<\/p>\n<pre><code class=\"language-shell line-numbers\">rabbitmqctl status\n<\/code><\/pre>\n<ul>\n<li>\u5b89\u88c5 RabbitMQWeb\u7684\u7ba1\u7406\u63d2\u4ef6<\/li>\n<\/ul>\n<pre><code class=\"language-shell line-numbers\">rabbitmq-plugins enable rabbitmq_management\n<\/code><\/pre>\n<ul>\n<li>RabbitMQWeb\u7ba1\u7406,\u8f93\u5165\u547d\u4ee4\u884c\u67e5\u770b\u7528\u6237\u5217\u8868<\/li>\n<\/ul>\n<pre><code class=\"language-shell line-numbers\">rabbitmqctl.bat list_users\n<\/code><\/pre>\n<ul>\n<li>http:\/\/127.0.0.1:15672\/ quest quest<\/li>\n<\/ul>\n<h4>php\u5ba2\u6237\u7aef\u5f00\u53d1\u4ee3\u7801 AMQP<\/h4>\n<h5>\u5f15\u7528amqplib\u5305<\/h5>\n<pre><code class=\"language-php line-numbers\">composer require php-amqplib\/php-amqplib\n<\/code><\/pre>\n<h5>\u4ee3\u7801\u5b9e\u73b0\u90e8\u5206<\/h5>\n<pre><code class=\"language-php line-numbers\">\/\/ config.php\n&lt;?php\nreturn [\n    'vendor' =&gt; [\n        'path' =&gt; dirname(__DIR__) . '\/vendor'\n    ],\n    'rabbitmq' =&gt; [\n        'host' =&gt; '127.0.0.1',\n        'port' =&gt; '5672',\n        'login' =&gt; 'guest',\n        'password' =&gt; 'guest',\n        'vhost' =&gt; '\/'\n    ]\n];\n<\/code><\/pre>\n<pre><code class=\"language-php line-numbers\">\/\/ send.php \u751f\u4ea7\u8005\n&lt;?php\n$config = require \".\/config.php\";\n\nrequire_once $config['vendor']['path'] . '\/autoload.php';\n\nuse PhpAmqpLib\\Connection\\AMQPStreamConnection;\nuse PhpAmqpLib\\Message\\AMQPMessage;\n\n\/\/ 1.\u521b\u5efa\u8fde\u63a5\n$connection = new AMQPStreamConnection($config['rabbitmq']['host'], $config['rabbitmq']['port'],\n    $config['rabbitmq']['login'], $config['rabbitmq']['password'], $config['rabbitmq']['vhost']);\n\/\/ 2.(\u5728\u8fde\u63a5\u4e2d)\u521b\u5efa\u9891\u9053\n$channel = $connection-&gt;channel();\n\n\/\/\u53d1\u9001\u65b9\u5176\u5b9e\u4e0d\u9700\u8981\u8bbe\u7f6e\u961f\u5217\uff0c \u4e0d\u8fc7\u5bf9\u4e8e\u6301\u4e45\u5316\u6709\u5173\uff0c\u5efa\u8bae\u6267\u884c\u8be5\u884c\n\/\/ 3.\u58f0\u660e\u9891\u9053\u4e2d\u961f\u5217\n$channel-&gt;queue_declare('hello', false, false, false, false);\n\/\/ 4. \u53d1\u9001\u6d88\u606f\n$msg = new AMQPMessage('Hello World!');\n$channel-&gt;basic_publish($msg, '', 'hello');\n\necho \" [x] Sent 'Hello World!'\\n\";\n\/\/ 5. \u5173\u95ed\u9891\u9053\n$channel-&gt;close();\n\/\/ 6. \u5173\u95ed\u8fde\u63a5\n$connection-&gt;close();\n<\/code><\/pre>\n<pre><code class=\"language-php line-numbers\">&lt;?php\n\/\/ receive.php\n$config = require \".\/config.php\";\n\nrequire_once $config['vendor']['path'] . '\/autoload.php';\n\nuse PhpAmqpLib\\Connection\\AMQPStreamConnection;\n\/\/ use PhpAmqpLib\\Message\\AMQPMessage;\n\n\/\/ 1.\u521b\u5efa\u8fde\u63a5\n$connection = new AMQPStreamConnection($config['rabbitmq']['host'], $config['rabbitmq']['port'],\n    $config['rabbitmq']['login'], $config['rabbitmq']['password'], $config['rabbitmq']['vhost']);\n\/\/ 2.\u521b\u5efa\u9891\u9053\n$channel = $connection-&gt;channel();\n\/\/ 3.\u58f0\u660e\u961f\u5217\n$channel-&gt;queue_declare('hello', false, false, false, false);\n\necho ' [*] Waiting for messages. To exit press CTRL+C', \"\\n\";\n\n$callback = function($msg) {\n    echo \" [x] Received \", $msg-&gt;body, \"\\n\";\n};\n\/\/ 4.\u63a5\u6536\u6d88\u606f\n$channel-&gt;basic_consume('hello', '', false, true, false, false, $callback);\n\n\/\/while(count($channel-&gt;callbacks)) {\n\/\/    $channel-&gt;wait();\n\/\/}\n\/\/ 5.\u68c0\u6d4b\u6d88\u8d39\u8005,\u5b58\u5728\u5219\u9891\u9053\u7b49\u5f85\u4e2d\nwhile($channel-&gt;is_consuming()) {\n    $channel-&gt;wait();\n}\n\n$channel-&gt;close();\n$connection-&gt;close();\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u5e93\u5b58\u5b89\u5168 \u4e0b\u5355\u903b\u8f91 \u5224\u65ad\u5e93\u5b58 \u51cf\u53bb\u5e93\u5b58 \u751f\u6210\u8ba2\u5355 \/** * \u4e0b\u5355\u64cd\u4f5c1 * * @param req *\/  [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[386],"tags":[392],"class_list":["post-917","post","type-post","status-publish","format-standard","hentry","category-386","tag-392"],"_links":{"self":[{"href":"https:\/\/wyxxt.org.cn\/index.php?rest_route=\/wp\/v2\/posts\/917","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wyxxt.org.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wyxxt.org.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wyxxt.org.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wyxxt.org.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=917"}],"version-history":[{"count":9,"href":"https:\/\/wyxxt.org.cn\/index.php?rest_route=\/wp\/v2\/posts\/917\/revisions"}],"predecessor-version":[{"id":3415,"href":"https:\/\/wyxxt.org.cn\/index.php?rest_route=\/wp\/v2\/posts\/917\/revisions\/3415"}],"wp:attachment":[{"href":"https:\/\/wyxxt.org.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=917"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wyxxt.org.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=917"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wyxxt.org.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=917"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}