怎么在复述中使用看实现一个秒杀抢购功能

  介绍

怎么在复述中使用看实现一个秒杀抢购功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

具体内容如下

1,使用手表,采用乐观锁
2,不使用悲观锁,因为等待时间非常长,响应慢
3,不使用队列,因为并发量会让队列内存瞬间升高

代码:

import  java.util.concurrent.ExecutorService;   import  java.util.concurrent.Executors;      import  redis.clients.jedis.Jedis;/* *   ,*复述,测试抢购   *大敌;   ,* @author  10255 _000   *大敌;   ,*/public  class  RedisTest  {   ,public  static  void  main (String [], args), {   final 才能String  watchkeys =,“watchkeys";   ExecutorService 才能;executor =, Executors.newFixedThreadPool (20);      final 才能Jedis  Jedis =, new 能(“192.168.3.202",, 6379);   jedis.set才能(watchkey,“0”);//,重置watchkey为0   jedis.del才能(“setsucc",,“setfail");//,清空抢成功的,与没有成功的   jedis.close才能();      for 才能;(int 小姐:=,0;,小姐:& lt;, 10000;,我+ +),{//,测试一万人同时访问   ,,executor.execute (new  MyRunnable ());   ,,}   executor.shutdown才能();   ,}   }         import 并不知道;   import  java.util.UUID;      import  redis.clients.jedis.Jedis;   import  redis.clients.jedis.Transaction;      public  class  MyRunnable  implements  Runnable  {      ,String  watchkeys =,“watchkeys"//,监视钥匙   ,Jedis  Jedis =, new 能(“192.168.3.202",, 6379);      ,public  MyRunnable (), {   ,}      ,@Override   ,public  void  run (), {   try {才能   ,,jedis.watch (watchkey);//watchkey      ,,String  val =, jedis.get (watchkey);   ,,int  valint =, Integer.valueOf (val);   ,,String  userifo =, UUID.randomUUID () .toString ();   ,,if  (valint  & lt;, 10), {   ,,,Transaction  tx =, jedis.multi();//,开启事务      ,,,tx.incr (“watchkeys");      ,,,List, list =, tx.exec();//,提交事务,如果此时watchkey被改动了,则返回零   ,,,if  (list  !=, null), {   ,,,,System.out.println(“用户:“,+,userifo  +,“抢购成功,当前抢购成功人数:“   ,,,,,,+,(时间+ valint  1));   ,,,,/*,抢购成功业务逻辑,*/,,,,jedis.sadd (“setsucc",, userifo);   ,,,},{else    ,,,,System.out.println(“用户:“,+,userifo  +,“抢购失败“);   ,,,,/*,抢购失败业务逻辑,*/,,,,jedis.sadd (“setfail",, userifo);   ,,,}      ,,},{else    ,,,System.out.println(“用户:“,+,userifo  +,“抢购失败“);   ,,,jedis.sadd (“setfail",, userifo);   ,,,//,thread . sleep (500);   ,,,返回;   ,,}      ,,},catch  (Exception  e), {   ,,e.printStackTrace ();   ,,},{finally    ,,jedis.close ();   ,,}      ,}      }

复述,对事物的支持目前比较简单.Redis只能保证一个客户发起的事务中的命令可以连续的执行,但后面命令出错前面不会回滚。而中间不会插入其他客户的命令。当一个客户在找一个连续中发出多命令时,这个链接会进入一个事务上下文,该链接后续的命令不会立即执行,而是先放到队列中,当执行exec命令是,复述,会顺序的执行队列中的所有命令。当如果队列中有命令错误,不会回滚。

乐观锁:大多数是基于数据版本(版本)的记录机制实现的。即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表添加一个“版本”字段来实现读取出数据时,将此版本号一同读出,之后更新时,对此版本号+ 1。此时,将提交数据的版本号与数据库表对应记录版本号进行比对,如果提交的数据版本号大于数据当前版本号,则予以更新,否则认为是过去数据。

在复述中,使用看命令实现乐观锁(看键):
看命令会监视给定的关键,当执行时,如果监视的关键从调用手表后发生过变化,则事务会失败,也可以调用wathc多长监视多个关键。这样就可以对指定键加乐观锁了。注意看的可以是对整个连接有效的。事务也一样。如果连接断开,监视和事务都会被自动清除。当然exec,丢弃,unwatch命令都会清除连接中的所有监视。

怎么在复述中使用看实现一个秒杀抢购功能

Copyright © 2020-2023 feiqueyun.cn. All Rights Reserved. 肥雀云_南京肥雀信息技术有限公司版权所有 南京肥雀信息技术有限公司 苏ICP备16063723号-5