关于redis中命令的原子性与事物的讲解--以商品秒杀为例

1.redis中的每个单独的命令都是原子性的,在期每个命令单独执行的过程中不用考录并发的问题。

2.对于redis,处于同一事物中的一组命令的执行也是原子性的,同样是这组命令执行过程中不用考虑并发的问题。

下面对于这两个特性,以秒杀为例加以说明:

class  Demo{

public static void main(String[] args){

for(int i =0;i<1000;i++){

new Thread(new Runnable(){

public void run(

Jedis jedis = new Jedis("127.0.0.1");

jedis.watch("mykey");----监视mykey,主要是解决value<10这个地方的并发问题

String valueStr = jedis.get("mykey");

Integer value = Integer.parseInt(valueStr);

if(value<10){---有可能几个线程获得的值都是9,进入if判断后,value变为10,如果不监视的话就会超卖。

Transaction tx = jedis.multi();

tx.incr("mykey");

List<Object> result = tx.exec();---事物执行后,不管是执行成功还是失败,watch都会放弃对mykey的监控。如果

mykey的值被修改,事物将不会执行,也就是从开启事物到执行事物

中间的代码都不会执行;如果mykey的执行没有被修改,那么事物中所有的代码

会原子性执行。

if(result!=null){

syso("商品抢购成功!");

jedis.zadd("success",username);

}else{

syso("商品抢购失败!");

}

}else{

System.out.println("很抱歉商品已被抢完!");

}

)

}).start();


}

}


}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值