关于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();
}
}
}
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();
}
}
}
相关文章推荐
- 关于我的开源项目RedisFile讲解 二
- 关于redis的keys命令的性能问题
- Redis案例——商品秒杀,购物车
- 分布式缓存技术redis学习系列(二)——详细讲解redis数据结构(内存模型)以及常用命令
- redis基础——安装redis和java使用redis(不涉及命令,图文讲解,20170825时windows的redis版本3.2.100)
- 在oracle中关于imp命令的详细讲解
- 基于redis集群实现的分布式锁,可用于秒杀商品的库存数量管理,有測试代码(何志雄)
- 分布式缓存技术redis学习系列(二)——详细讲解redis数据结构(内存模型)以及常用命令
- 电商营销方式抢购,秒杀Redis原子出队列lpop方法作为剩余库存判断条件的实现方式(2)
- 分布式缓存技术redis学习(二)——详细讲解redis数据结构(内存模型)以及常用命令
- 关于DML命令与DDL命令引发的对事物特性的思考
- redis秒杀商品队列
- 分布式缓存技术redis学习系列(二)——详细讲解redis数据结构(内存模型)以及常用命令
- 利用redis将数据存入数据库的PHP商品秒杀代码,很多功能待完善
- 基于redis集群实现的分布式锁,可用于秒杀商品的库存数量管理,有测试代码(何志雄)
- 分布式缓存技术redis学习系列(二)——详细讲解redis数据结构(内存模型)以及常用命令
- 详细讲解redis数据结构(内存模型)以及常用命令
- Redis 事务和watch应用于秒杀商品应用
- 电商营销方式抢购,秒杀Redis原子出队列lpop方法作为剩余库存判断条件的实现方式(2)