您的位置:首页 > 数据库 > Redis

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

2017-03-26 10:06 309 查看
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();

}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐