Redis 客户端Jedis 事务

本文介绍了Redis客户端Jedis中如何进行事务操作,包括事务的隔离性和原子性保障。事务执行经历开始、命令入队和执行三个阶段。通过`multi()`、`exec()`、`close()`和`discard()`方法进行事务管理。并提供了一个重写`exec()`方法的案例,展示事务确保操作的原子性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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就符合原子性了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值