介绍
怎么在复述中使用看实现一个秒杀抢购功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
具体内容如下
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
复述,对事物的支持目前比较简单.Redis只能保证一个客户发起的事务中的命令可以连续的执行,但后面命令出错前面不会回滚。而中间不会插入其他客户的命令。当一个客户在找一个连续中发出多命令时,这个链接会进入一个事务上下文,该链接后续的命令不会立即执行,而是先放到队列中,当执行exec命令是,复述,会顺序的执行队列中的所有命令。当如果队列中有命令错误,不会回滚。
乐观锁:大多数是基于数据版本(版本)的记录机制实现的。即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表添加一个“版本”字段来实现读取出数据时,将此版本号一同读出,之后更新时,对此版本号+ 1。此时,将提交数据的版本号与数据库表对应记录版本号进行比对,如果提交的数据版本号大于数据当前版本号,则予以更新,否则认为是过去数据。
在复述中,使用看命令实现乐观锁(看键):
看命令会监视给定的关键,当执行时,如果监视的关键从调用手表后发生过变化,则事务会失败,也可以调用wathc多长监视多个关键。这样就可以对指定键加乐观锁了。注意看的可以是对整个连接有效的。事务也一样。如果连接断开,监视和事务都会被自动清除。当然exec,丢弃,unwatch命令都会清除连接中的所有监视。