Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:
事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。
一个事务从开始到执行会经历以下三个阶段:
开始事务。
命令入队。
执行事务。
单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。
事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。
这是官网上的说明 From redis docs on transactions:
It's important to note that even when a command fails, all the other commands in the queue are processed – Redis will not stop the processing of commands.
具体代码如下:
1,引入jedis jar 包
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
2,代码实现
package com.hcmony.sword.redis;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.Transaction;
/**
* <h3>Shenjue.java基本描述</h3>
* <p></p>
*
* @author hcmony
* @since V1.0.0, 2019/05/06 20:07
*/
public abstract class RedisCaheTransactionHelper{
private final JedisPool jedisPool;
public RedisCaheTransactionHelper(JedisPool jedisPool) {
this.jedisPool = jedisPool;
}
public void multi(){
Jedis jedis = null;
Transaction transaction = null;
try {
jedis = jedisPool.getResource();
transaction = jedis.multi();
doSerive(transaction);
}
finally {
if (null != jedis) {
jedis.close();
}
}
}
protected abstract void doSerive(Transaction transaction);
static class Test extends RedisCaheTransactionHelper{
public Test(JedisPool jedisPool) {
super(jedisPool);
}
@Override
protected void doSerive(Transaction transaction) {
transaction.set("1","1");
transaction.set("2","2");
transaction.exec();
}
public static void main(String[] args) {
//默认连接本地redis,
// loclhost:6379
JedisPool jedisPool = new JedisPool();
Test test = new Test(jedisPool);
test.multi();
}
}
}