使用 Redis 中的事务处理实现商品秒杀
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 "抢购结束";
- }
来源: https://www.2cto.com/kf/201904/805467.html