<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>https://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>https://jackxiang.com/post//</link>
<title><![CDATA[[实践OK]redis原子操作之PHP 并发场景的几种解决方案之redis 事务是原子操作，可以保证订单处理的过程中数据没有被其它并发的进程修改。]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[Php/Js/Shell/Go]]></category>
<pubDate>Fri, 02 Aug 2019 02:39:15 +0000</pubDate> 
<guid>https://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	利用 Redis 事务特征<br/>redis 事务是原子操作，可以保证订单处理的过程中数据没有被其它并发的进程修改。<br/>示例代码：<br/><textarea name="code" class="php" rows="15" cols="100">
&lt;?php
$http = new swoole_http_server(&quot;0.0.0.0&quot;, 9509);&nbsp;&nbsp; // 监听 9509

$http-&gt;set(array(
&nbsp;&nbsp;&nbsp;&nbsp;&#039;reactor_num&#039; =&gt; 2,&nbsp;&nbsp;//reactor thread num
&nbsp;&nbsp;&nbsp;&nbsp;&#039;worker_num&#039; =&gt; 4&nbsp;&nbsp;&nbsp;&nbsp;//worker process num
));

$http-&gt;on(&#039;request&#039;, function (swoole_http_request $request, swoole_http_response $response) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;$uniqid = uniqid(&#039;uid-&#039;, TRUE);&nbsp;&nbsp;&nbsp;&nbsp;// 模拟唯一用户ID
&nbsp;&nbsp;&nbsp;&nbsp;$redis = new Redis();
&nbsp;&nbsp;&nbsp;&nbsp;$redis-&gt;connect(&#039;127.0.0.1&#039;, 6379);&nbsp;&nbsp;&nbsp;&nbsp;// 连接 redis

&nbsp;&nbsp;&nbsp;&nbsp;$redis-&gt;watch(&#039;rest_count&#039;);&nbsp;&nbsp;// 监测 rest_count 是否被其它的进程更改

&nbsp;&nbsp;&nbsp;&nbsp;$rest_count = intval($redis-&gt;get(&quot;rest_count&quot;));&nbsp;&nbsp;// 模拟唯一订单ID
&nbsp;&nbsp;&nbsp;&nbsp;if($rest_count &gt; 0)&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$value = &quot;&#123;$rest_count&#125;-&#123;$uniqid&#125;&quot;;&nbsp;&nbsp;// 表示当前订单，被当前用户抢到了

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// do something ... 主要是模拟用户抢到单后可能要进行的一些密集运算
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$rand&nbsp;&nbsp;= rand(100, 1000000);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$sum=0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for ($i=0;$i&lt;$rand;$i++)&#123; $sum+=$i; &#125;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// redis 事务
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$redis-&gt;multi();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$redis-&gt;lPush(&#039;uniqids&#039;, $value);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$redis-&gt;decr(&#039;rest_count&#039;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$replies&nbsp;&nbsp;= $redis-&gt;exec();&nbsp;&nbsp;// 执行以上 redis 事务

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 如果 rest_count 的值被其它的并发进程更改了，以上事务将回滚
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!$replies)&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;订单 &#123;$value&#125; 回滚&quot;.PHP_EOL;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;$redis-&gt;unwatch();
&#125;);

$http-&gt;start();

</textarea><br/>使用 ab 测试<br/>$ ab -t 20 -c 10 http://192.168.1.104:9509/<br/><br/>经测试结果对比，redis 事务方式优于文件排他锁方式，而文件排他锁方式中，非阻塞模式优于阻塞模式。<br/><br/>更多，来自：<a href="https://199508.com/post/2054" target="_blank">https://199508.com/post/2054</a>
]]>
</description>
</item><item>
<link>https://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [实践OK]redis原子操作之PHP 并发场景的几种解决方案之redis 事务是原子操作，可以保证订单处理的过程中数据没有被其它并发的进程修改。]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>