本文已收录于专栏
❤️《Redis之大厂必备技能包》❤️
上千人点赞收藏,全套Redis学习资料,大厂必备技能!
目录
1、简介
2、指令介绍
2.1 简介
2.2 MULTI(开启事务)
2.3 EXEC(执行事务)
2.4 DISCARD(取消事务)
2.5 WATCH(监视)
2.6 UNWATCH
3、Jedis 使用事务
Redis类似大多数成熟的数据库系统一样,提供了事务机制。Redis的事务机制非常简单,它没有严格的事务模型,无法像关系型数据库一样保证操作的原子性。
Redis事务最大的作用是保证多个指令的串行执行,它可以借助于Redis单线程读写的特性,保证Redis事务中的指令不会被事务外的指令打搅,不过要注意它不是原子性的。
完整事务案例:

使用Redis事务,一个最需要注意的问题是,指令多,网络开销高;因此我们一定要结合管道pipeline一起使用,这样可以将多次网络io操作压缩成单次。
Redis事务相关的指令有五个,分别是MULTI、EXEC、DISCARD、WATCH、UNWATCH
通过模拟一个简单的余额增加的例子,使用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);
}
}