什么是Redis的基本事务
Redis的基本事务需要用到MULTI命令和EXEC命令,这种事务可以让一个客户端在不被其他客户端打断的情况下执行多个命令。和关系数据库的rollback不同,在Redis里面,被MULTI命令和EXEC命令包围的所有命令会一个接一个地执行,直到所有命令都执行完毕为止。当一个事务执行完毕后,Redis才会处理其他客户端的命令。
使用Java多线程测试redis事务
代码如下:
package transaction;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
public class RedisTransaction implements Runnable{
private Jedis conn;
public RedisTransaction(Jedis conn) {
// TODO Auto-generated constructor stub
this.conn=conn;
}
@Override
public void run() {
// TODO Auto-generated method stub
Pipeline pipeline=conn.pipelined();
System.out.println(Thread.currentThread().getName()+"开始");
pipeline.incr("trans:");//第一个流水线放入队列
try {
Thread.sleep(100);
pipeline.incrBy("trans:",-1);//第二个流水线放入队列
System.out.println(Thread.currentThread().getName()+"完成");
pipeline.exec();//执行这两条命令。
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args){
Thread thread=null;
Jedis conn=new Jedis("localhost");
System.out.println("执行前:"+conn.get("trans:"));
for(int i=0;i<3;i++){
new Thread(new RedisTransaction(new Jedis("localhost"))).start();
}
try {
Thread.sleep(1000);
System.out.println("全部完成");
System.out.println("执行后:"+conn.get("trans:"));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
执行结果:
执行前:1
Thread-2开始
Thread-0开始
Thread-1开始
Thread-2完成
Thread-0完成
Thread-1完成
全部完成
执行后:1
结论:
通过使用事务,各个线程都可以在不被其他线程打扰的情况下,执行各自队列里面的命令。
注意
redis要在接收到EXEC命令之后,才会执行那些位于MULTI和EXEC之间的入队命令。