本文已收录于专栏
❤️《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事务,一个最需要注意的问题是,指令多,网络开销高;因此我们一定要结合管道pipeline一起使用,这样可以将多次网络io操作压缩成单次。
2、指令介绍
2.1 简介
Redis事务相关的指令有五个,分别是MULTI、EXEC、DISCARD、WATCH、UNWATCH
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); } }