Redis事务详述

 本文已收录于专栏


❤️《Redis之大厂必备技能包》❤️


上千人点赞收藏,全套Redis学习资料,大厂必备技能!


目录


1、简介


2、指令介绍


2.1 简介


2.2 MULTI(开启事务)


2.3 EXEC(执行事务)


2.4 DISCARD(取消事务)


2.5 WATCH(监视)


2.6 UNWATCH


3、Jedis 使用事务


1、简介

Redis类似大多数成熟的数据库系统一样,提供了事务机制。Redis的事务机制非常简单,它没有严格的事务模型,无法像关系型数据库一样保证操作的原子性。

Redis事务最大的作用是保证多个指令的串行执行,它可以借助于Redis单线程读写的特性,保证Redis事务中的指令不会被事务外的指令打搅,不过要注意它不是原子性的。


完整事务案例:Redis事务详述Redis事务详述使用Redis事务,一个最需要注意的问题是,指令多,网络开销高;因此我们一定要结合管道pipeline一起使用,这样可以将多次网络io操作压缩成单次。


2、指令介绍

2.1 简介

Redis事务相关的指令有五个,分别是MULTI、EXEC、DISCARD、WATCH、UNWATCHRedis事务详述Redis事务详述Redis事务详述

3、Jedis 使用事务

通过模拟一个简单的余额增加的例子,使用Jedis客户端来使用Redis的事务。

1.package com.lizba.redis.tx;
 
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;
 
import java.math.BigDecimal;
import java.util.List;
 
/**
 * <p>
 *      Redis事务demo
 * </p>
 *
 * @Author: Liziba
 * @Date: 2021/9/9 23:53
 */
public class TransactionDemo {
 
    private Jedis client;
 
    public TransactionDemo(Jedis client) {
        this.client = client;
    }
 
    /**
     * 添加余额
     *
     * @param userId    用户id
     * @param amt       添加余额
     * @return
     */
    public BigDecimal addBalance(String userId, BigDecimal amt) {
        String key = this.keyFormat(userId);
        // 初始用户余额为0
        client.setnx(key, "0");
        while (true) {
            client.watch(key);
            BigDecimal balance = new BigDecimal(client.get(key)).setScale(2, BigDecimal.ROUND_HALF_UP);
            BigDecimal amount = balance.add(amt);
            Transaction tx = client.multi();
            tx.set(key, amount.toPlainString());
            List<Object> exec = tx.exec();
            // 返回值不为空则证明Redis事务成功
            if (exec != null) {
                break;
            }
        }
        return new BigDecimal(client.get(key)).setScale(2, BigDecimal.ROUND_HALF_UP);
    }
 
    /**
     * 获取总金额
     *
     * @param userId 用户id
     * @return
     */
    public BigDecimal getAmount(String userId) {
        String amt = client.get(keyFormat(userId));
        return new BigDecimal(amt);
    }
 
    /**
     * Redis key
     * @param userId 用户id
     * @return
     */
    private String keyFormat(String userId) {
        return String.format("balance:%s",userId);
    }
 
}

Redis事务详述Redis事务详述


上一篇:HTTP状态码?


下一篇:photoshop制作古典淡雅竹筒动画效果