1. 程式人生 > >使用redis 中的事物實現商品秒殺

使用redis 中的事物實現商品秒殺

redis 的區別 原子 atom 開啟 get multi connect sca

redis中的事務處理:

redis中的事物事物處理是指能夠批量的執行一組命令(當事務開始執行時,事務中的命令能夠按照按照規定好的順序執行而不會被插隊或打斷);

mysql事務的區別在於:mysql中事務開啟後,當某一條語句執行出現錯誤時該事務會回退到開始時的狀態,而redis中的事務卻不會這麽做!但是redis中可以去指定監測某一個Key值,當該Key值在開始事務後並且執行事務之前發生了變化的話,則該事務會被遺棄,事務中的命令將不會執行。

redis事務中的常用命令:

Multi 命令用於標記一個事務塊的開始。事務塊內的多條命令會按照先後順序被放進一個隊列當中,最後由 EXEC 命令原子性(atomic)地執行。

Exec 命令用於執行所有事務塊內的命令。

Watch 命令用於監視一個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那麽事務將被打斷

Unwatch 命令用於取消 WATCH 命令對所有 key 的監視。

Discard 命令用於取消事務,放棄執行事務塊內的所有命令。

php中使用 redis處理秒殺:

<?php
/**
* shop_sell_num 存儲已經出售商品數量
* shop_total  商品總數
* shop_users_list 請購成功的用戶信息
*/
$shop_total = 100;

$redis
= new redis(); $result = $redis->connect(‘127.0.0.1‘,6379); if(!$result){ throw new Exception(‘redis連接失敗‘); } //監視 shop_sell_num $redis->watch(‘shop_sell_num‘); $shop_sell_num = $redis->get(‘shop_sell_num‘); //判斷商品是否剩余 if($shop_sell_num < $shop_total){ $redis->multi();
$redis->set(‘shop_sell_num‘,$shop_sell_num+1); $multi_result = $redis->exec(); if($multi_result){ //將用戶表示放入已購用戶集合中 $redis->sAdd(‘shop_users_list‘,‘用戶信息‘); }else{ return "搶購失敗" } }else{ return "搶購結束"; }

使用redis 中的事物實現商品秒殺