1.事务
redis的事务是一个或者多个redis命令组成的批处理,当这多个命令中出现一条命令执行失败的时候,其他的命令依旧会照样执行,redis的事务并不具有原子性。当一个redis事务在执行的时候,新进来的redis命令不会插入到redis。
事务涉及到的redis命令如下:multi exec watch unwatch
命令 | 说明 | demo |
watch | 监视一个或者多个key,从而来管理事务,如果在事务执行之前,这些key发生了变动,那么事务将被打断 | 127.0.0.1:6379> watch flagkey OK |
multi | 开始一个事务 | 127.0.0.1:6379> multi OK |
exec | 执行事务 | 127.0.0.1:6379> set username smallking |
watch和事务的关系和顺序如下:
watch可以用来当作并发的乐观锁。很多地方都有应用。例如用watch做个商品秒杀,伪代码可以写成这样子:
jedis.watch(key); // key可以是商品数量
Transaction transaction = jedis.multi();// 标记一个事务块的开始
transaction.set(key, String.valueOf(prdNum - 1));
List<Object> result = transaction.exec();// 执行事务 成功的话会有返回值
if (result == null || result.isEmpty()) {
// watch-key被其他线程修改 再执行一遍抢的逻辑,知道key的数量 == 0
}