Redis 客户端Jedis 事务
Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:
1.事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
2.事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。
一个事务从开始到执行会经历以下三个阶段:
1.开始事务。
2.命令入队。
3.执行事务。
Jedis 事务
首先我们来看一个代码块
try{
Transaction tx = jedis.multi();
tx.zadd(xxxxxxxxx)
tx.zadd(xxxxxxxxx)
List<Object> objs = tx.exec();
tx.close()
}catch(Exception e){
e.printStackTrace();
}finally{
}
multi() 标记一个事务块的开始。方法返回一个Transaction
exec() 执行所有事务块内的命令。将所有的返回值存到List中
close() 表示事务结束
discard() 取消事务,放弃执行事务块内的所有命令。也就是回滚。
一个小案例
我们可以重写exec方法
public List<Object> exec(Transaction tx, Jedis jedis) {
try {
return tx.exec();
} catch (Exception e) {
logger.error("发生异常" + e.getMessage());
tx.discard();
} finally {
if (tx != null) {
try {
tx.close();
} catch (IOException ioe) {
logger.error("发生异常"+ ioe.getMessage());
}
}
if (jedis != null) {
jedis.close();
}
}
return null;
}
Transaction tx = jedis.multi();
tx.zadd(xxxxxxxxxxxx); //操作1
tx.zadd(xxxxxxxxxxxx); //操作2
List<Object> ret = tx.exec(tx,jedis);
这样操作1和操作2就符合原子性了。
还没有评论,来说两句吧...