`

Redis事务测试

阅读更多

1.Redis Java client

关于Redis Java客户端的demo可以参考我的例子:http://blog.csdn.net/caicongyang/article/details/50642979

2.Redis事务(测试结论)

1). 在Redis事务中的所有命令都将会被串行化的顺序执行(既单线程),事务执行期间,Redis不会再为其它客户端的请求提供任何服务,从而保证了事物中的所有命令被原子的执行。
2). 和关系型数据库中的事务相比,在Redis事务中如果有某一条命令执行失败,其后的命令仍然会被继续执行。
3).调用jedis.watch(…)方法来监控key,如果调用后key值发生变化,则整个事务会执行失败。

3.命令行测试

MULTI/EXEC/DISCARD/WATCH

2.1成功执行事务

 

#初始化值
127.0.0.1:6379> set num 20
OK
#开启事务
127.0.0.1:6379> multi
OK
#将num增加1,可以看到redis并没有立即执行,而是加入了队列中
127.0.0.1:6379> incr num
QUEUED
#将num减去1,同样可以看到redis并没有立即执行,而是加入了队列中
127.0.0.1:6379> decr num
QUEUED
#提交执行,看到两次执行的结果
127.0.0.1:6379> exec
1) (integer) 21
2) (integer) 20
#最终确认数值正确为20
127.0.0.1:6379> get num
"20"


2.2失败执行事务

 

 

#初始化值
127.0.0.1:6379> set num 15
OK
#开启事务
127.0.0.1:6379> multi
OK
#将caicongyang减去1,可以看到redis并没有立即执行,而是加入了队列中
127.0.0.1:6379> decr caicongyang
QUEUED
#此命令为list的命令,执行应该报错!
127.0.0.1:6379> lpop caicongyang
QUEUED
#将caicongyang增加1,可以看到redis并没有立即执行,而是加入了队列中
127.0.0.1:6379> incr caicongyang
QUEUED
#执行结果,看到lpop 命令出错,其他的都正常执行
127.0.0.1:6379> exec
1) (integer) 14
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
3) (integer) 15
#最终结果也符合预期
127.0.0.1:6379> get caicongyang
"15"


2.3回滚

 

 

#初始化
127.0.0.1:6379> set num 10
OK
#开启事务
127.0.0.1:6379> multi
OK
#自增加
127.0.0.1:6379> incr num 
QUEUED
#回滚
127.0.0.1:6379> discard
OK
#最终结果正确
127.0.0.1:6379> get num
"10"
127.0.0.1:6379> 

 

3.Jedis测试demo

 

package com.caicongyang.redis;

import java.util.List;

import org.junit.Test;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
import redis.clients.jedis.Transaction;

public class JedisAdvanceFeaturesDemo {
	
	/**
	 * 回滚测试
	 */
	@Test
	public void testTransaction(){
		 Jedis jedis = new Jedis("192.168.150.137",6379); 
		 //---exec 执行事务队列内命令-------------
		 Transaction t = jedis.multi();//开始事务
		 t.set("husband", "Tom");
		 t.set("wife", "Mary");
		 t.exec();//执行事务


		 //------discard 取消执行事务内命令---------
		 Transaction t2 = jedis.multi();
		 t2.set("test", "0");
		 t2 = jedis.multi();
		 t2.set("test", "1");
		 t2.discard();

		 String husband = jedis.get("husband");
		 String wife = jedis.get("wife");
		 String test = jedis.get("test");
		 System.out.println("husband:" + husband);
		 System.out.println("wife:" + wife);
		 System.out.println("test:" + test);  //null 原因:开启事务后未提交,则无结果
		 jedis.close();
		 
	}
	
	/**
	 * 测试watch
	 * @throws Exception
	 */
	@Test
	public void testWatch() throws Exception{
		Jedis jedis = new Jedis("192.168.150.137",6379); 
		jedis.set("caicongyang", "goodboy");
		jedis.watch("caicongyang");
		Thread.sleep(3000L);
		new Thread(new Runnable() {
			@Override
			public void run() {
				Jedis j1 = new Jedis("192.168.150.137",6379); 
				Transaction multi = j1.multi();
				multi.set("caicongyang", "good"); 
				multi.exec();
				System.out.println(j1.get("caicongyang"));//结果是:boy
				j1.close();
			}
		}).start();
		//未执行下面的事务;原因:我们调用jedis.watch(…)方法来监控key,如果调用后key值发生变化,则整个事务不会执行。
		Transaction multi = jedis.multi();
		multi.set("caicongyang", "boy");
		List<Object> list = multi.exec();
		//事务结果:异常应该上面的提交没有执行
		System.out.println(list.get(0).toString()); //NullPointerExecption
		String result = jedis.get("caicongyang");
		System.out.println(result); //结果是:boy
	}
	
	/**
	 * 持久化测试
	 */
	@Test
	public void testPersis(){
		Jedis jedis = new Jedis("192.168.150.137",6379);
		jedis.set("ccy", "handsome boy");
		jedis.persist("ccy");
		
		//重新启动机器依然存在
		String value = jedis.get("ccy");
		System.out.println(value);
		jedis.close();
	}
	
	
	
	
	/**
	 * 测试管道
	 */
	@Test
	public void testPipelined(){
		Jedis jedis = new Jedis("192.168.150.137",6379);
		Pipeline pipeline = jedis.pipelined();
		long start = System.currentTimeMillis();
		for (int i = 0; i < 100000; i++) {
	        pipeline.set("p" + i, "p" + i);
	    }
		//异步返回结果
		List<Object> results = pipeline.syncAndReturnAll();
	    long end = System.currentTimeMillis();
	    System.out.println("Pipelined SET: " + ((end - start)/1000.0) + " seconds"); //10000次插入仅需不到1秒
	    System.out.println(results.size());
	    jedis.disconnect();
		
	}
	
	
}



 

 

 

 

更多多线程精彩内容请继续关注我的博客http://blog.csdn.net/caicongyang

记录与分享,你我共成长 -fromcaicongyang



分享到:
评论

相关推荐

    redis缓存分享,包含redis和redis测试的项目test

    此外,Redis还提供了事务(Transactions)、发布/订阅(Pub/Sub)模式、主从复制、持久化(包括RDB和AOF两种方式)以及地理空间索引等高级功能。 在"redis缓存知识分享.pptx"中,可能详细介绍了如何利用Redis的缓存...

    redis 读写性能测试代码

    2. **Pipeline与Transaction**:为了提高批量操作的性能,Redis支持Pipeline(管道)和Transaction(事务)。Pipeline允许一次性发送多个命令,减少网络往返时间;Transaction则确保一组命令的原子性执行。测试时,...

    java连接redis测试

    4. **事务处理**:Redis支持事务,可以通过`multi()`, `exec()`来开始和执行一个事务。 5. **发布/订阅**:如果使用Redis作为消息中间件,可以使用`publish()`和`subscribe()`进行消息的发布和订阅。 6. **关闭...

    第7单元 Redis事务与持久化1

    【Redis事务】 Redis事务是Redis数据库中提供的一种确保数据操作原子性的机制,它允许用户在一个操作序列中执行多条命令,这些命令会被串行化并按顺序执行,以保证在并发环境下的数据一致性。事务的开启是通过`MULTI...

    redis简单测试

    以下是对"redis简单测试"这一主题的详细说明。 1. **Redis简介** Redis是一个开源(BSD许可),内存中的数据结构存储系统,可以作为数据库、缓存和消息中间件使用。它支持多种数据结构,如字符串、哈希、列表、...

    redis软件+客户端+java测试代码

    在描述中提到的"java测试代码"是指利用Java语言编写的示例代码,这些代码通常包含连接Redis、执行命令、读写数据等操作,有助于学习者快速理解和应用Redis。Java的Jedis是常用的Redis客户端库,它提供了一系列API,...

    redis 性能测试

    2. **Jedis的使用**:Jedis作为Java语言与Redis交互的客户端,提供了连接管理、命令执行、事务处理等功能。使用Jedis,开发者可以通过简单的Java代码执行Redis的各种操作,例如设置和获取键值、执行pipeline、订阅...

    Redis性能测试

    在本文中,我们将深入探讨Redis的性能测试,同时与CoolHash和SqlServer进行对比,以了解它们在不同场景下的表现。我们将通过一个小例子来展示测试过程,并提供相关的源码和jar包供读者参考。 1. Redis性能特性: ...

    redis数据库java开发测试demo

    此外,Redis还支持事务、发布/订阅、lua脚本等功能,可以根据需求灵活使用。 在测试部分,我们可以创建JUnit测试类,模拟真实环境下的存取数据和查询,确保Redis集成功能的正确性。例如: ```java @Test public ...

    redis测试代码

    在本文中,我们将深入探讨Redis的基础知识,测试代码的重要性以及如何进行有效的Redis测试。 Redis作为一个内存数据存储系统,其主要特点是速度快,支持丰富的数据结构如字符串、哈希、列表、集合和有序集合。这些...

    Redis测试Demo

    6. **事务处理**:Redis支持简单的事务,通过`MULTI`、`EXEC`命令组合可以保证一组操作的原子性。 7. **发布/订阅模式**:Redis还提供了发布/订阅(Pub/Sub)功能,可以实现消息传递,适合构建实时消息系统。 8. *...

    redis百万并发访问数据库测试

    7. **Redis的并发控制**:虽然Redis是单线程模型,但可以通过事务(Transaction)、Lua脚本等机制实现一定程度的并发控制。比如,使用Lua脚本可以在服务器端原子性地执行一系列操作,避免了客户端的多次网络通信。 ...

    redis测试包

    `jedis-2.7.3`是Java操作Redis的客户端库,它支持多种Redis命令,包括数据结构如字符串、哈希、列表、集合、有序集合的操作,以及发布/订阅、事务、lua脚本等功能。Jedis提供了丰富的API,让开发者能够方便地在Java...

    jmeter-plugins-redis2

    除了基本的数据交互功能,"jmeter-plugins-redis2"可能还提供了其他高级特性,如事务处理、管道传输等,这些都能进一步提高测试效率和数据一致性。同时,为了方便日志记录和结果分析,插件可能也支持将测试结果直接...

    redis测试.rar

    在 `redis测试` 文件中,可能包含了使用 Redistemplate 进行的各种测试,比如设置和获取键值、检查数据类型、执行事务、测试过期时间等功能的测试用例。这些测试有助于确保 Redis 操作的正确性和性能。 总结来说,...

    memcached-redis性能测试.docx

    Redis 的优点是高性能、低延迟、支持事务、支持 Pub/Sub 消息队列等。 Redis 和 Memcached 都是高性能的缓存系统,但是它们在设计理念和实现机制上有所不同。Memcached 是一个简单的键值存储系统,使用哈希表来存储...

    java连接redis的jar包

    Java连接Redis是一个常见的任务,特别是在开发分布式应用时。Redis是一个高性能的键值数据库,而Java作为后端开发的主流语言,提供了多种方式来与Redis进行交互。本篇将详细介绍如何在Java项目中使用jar包来连接...

    redis客户端工具(绿色版)

    6. **命令行模拟**:虽然以图形界面为主,但可能还包含一个命令行模拟器,允许用户输入Redis命令,方便测试和调试。 7. **性能监控**:高级版本的RedisClient可能提供服务器状态监视,包括内存使用、命令执行速率、...

    Redis面试专题30道.zip

    24、怎么测试 Redis 的连通性? 25、Redis 中的管道有什么用? 26、怎么理解 Redis 事务? 27、Redis 事务相关的命令有哪几个? 28、Redis key 的过期时间和永久有效分别怎么设置? 29、Redis 如何做内存优化? 30、...

    redis测试代码和用例

    3. **Redis事务**:Redis提供了一种简单的事务机制,允许用户在一个操作序列中执行多个命令,并确保它们要么全部成功,要么全部失败。这通过`MULTI`、`EXEC`命令实现。 4. **Redis持久化**:为了防止数据丢失,...

Global site tag (gtag.js) - Google Analytics