package cn.com;

import java.util.List;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction; public class Redis_Transactions { public static Jedis redis = new Jedis("localhost", 6379);// 连接redis /**
* 基本事务用法
* 默认给user1,user2都初始化为1000
* 开启事务
* 给user:1:money 加一
* 给user:2:money 减一
* 执行事务
* */
public static void base_trans() throws InterruptedException{
redis.flushDB();//清除数据
redis.set("money", "1000");
redis.set("money1", "1000");
long start = System.currentTimeMillis(); Transaction tx = redis.multi();
tx.incr("money");//给用户user:1 加一块钱
tx.decr("money1");//给用户user:1 减一块钱
List<Object> results = tx.exec();
long end = System.currentTimeMillis();
System.out.println("Transaction SET: " + ((end - start)/1000.0) + " seconds"); System.out.println(redis.get("money"));
System.out.println(redis.get("money1"));
redis.disconnect();
} /**
* 用户事务
* 默认给user1,user2都初始化为1000
* 开启事务
* 给user:1:money 加一
* 给user:2:money 减一
* 我们user:2:money 的值是a 是无法执行减1 的操作 那是否还是照样执行
* 因为redis事务是比较简单的,像下面这种问题需要开发者自己控制,redis 事务是不做控制的
* */
public static void user_trans() throws InterruptedException{
redis.flushDB();//清除数据
redis.set("user:1:money", "1000");
redis.set("user:2:money", "a");
long start = System.currentTimeMillis();
Transaction tx = redis.multi(); tx.incr("user:1:money");//给用户user:1 加一块钱
tx.decr("user:2:money");//给用户user:1 减一块钱 List<Object> results = tx.exec();
long end = System.currentTimeMillis();
System.out.println("Transaction SET: " + ((end - start)/1000.0) + " seconds"); System.out.println(redis.get("user:1:money"));
System.out.println(redis.get("user:2:money"));
redis.disconnect();
} /**
* 执行事务的过程其他客户端改变了其中的key值,解决数据一致性问题
* 通过watch 对key的监控来实现其他客户端修改数据后,事务取消
* 用法 首先用watch 开始对key的监控 在开启事务,顺序一定要先监控在执行事务
* */
public static void changedata_trans() throws InterruptedException{
redis.flushDB();//清除数据
redis.set("user:1:money", "1000");
redis.set("user:2:money", "1000");
long start = System.currentTimeMillis();
redis.watch("user:1:money");
Transaction tx = redis.multi();
tx.incr("user:1:money");//给用户user:1 加一块钱
tx.decr("user:2:money");//给用户user:1 减一块钱
changedata();//改变数据的方法
List<Object> results = tx.exec(); long end = System.currentTimeMillis();
System.out.println("Transaction SET: " + ((end - start)/1000.0) + " seconds"); System.out.println(redis.get("user:1:money"));
System.out.println(redis.get("user:2:money"));
redis.disconnect();
} /**
* 模拟新开客户端对事务中监控的key对应的元素进行修改
*
* **/
public static void changedata(){
Jedis redis2 = new Jedis("localhost", 6379);// 连接redis
redis2.set("user:1:money", "8888");
} public static void main(String [] args) throws InterruptedException{
changedata_trans(); }
}

  

Redis学习笔记(7)-事务的更多相关文章

  1. StackExchange.Redis学习笔记(四) 事务控制和Batch批量操作

    Redis事物 Redis命令实现事务 Redis的事物包含在multi和exec(执行)或者discard(回滚)命令中 和sql事务不同的是,Redis调用Exec只是将所有的命令变成一个单元一起 ...

  2. Redis学习笔记~目录

    回到占占推荐博客索引 百度百科 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合). ...

  3. Redis学习笔记之ABC

    Redis学习笔记之ABC Redis命令速查 官方帮助文档 中文版本1 中文版本2(反应速度比较慢) 基本操作 字符串操作 set key value get key 哈希 HMSET user:1 ...

  4. (转)redis 学习笔记(1)-编译、启动、停止

    redis 学习笔记(1)-编译.启动.停止   一.下载.编译 redis是以源码方式发行的,先下载源码,然后在linux下编译 1.1 http://www.redis.io/download 先 ...

  5. Redis学习笔记(1)——Redis简介

    一.Redis是什么? Remote Dictionary Server(Redis) 是一个开源的使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.Key-Value ...

  6. redis学习笔记(3)

    redis学习笔记第三部分 --redis持久化介绍,事务,主从复制 三,redis的持久化 RDB(Redis DataBase)AOF(Append Only File) RDB:在指定的时间间隔 ...

  7. redis 学习笔记(6)-cluster集群搭建

    上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞shardi ...

  8. Redis学习笔记4-Redis配置详解

    在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server   xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redi ...

  9. Redis学习笔记7--Redis管道(pipeline)

    redis是一个cs模式的tcp server,使用和http类似的请求响应协议.一个client可以通过一个socket连接发起多个请求命令.每个请求命令发出后client通常会阻塞并等待redis ...

随机推荐

  1. linux下Gnome桌面环境的安装

    在实际工作中,无论是生产环境还是公司内部环境.很多时候装的linux系统都是最小化安装的.即没有桌面环境, 那么如果有时我们又需要一个桌面环境.该怎么安装呢?其实不难,现笔者将安装方法分享如下. 测试 ...

  2. servlet中cookie的使用

    ---恢复内容开始--- Cookie是存储在客户端计算机上的文本文件,并保留了它们的各种信息跟踪的目的. Java Servlet透明支持HTTP Cookie. 涉及标识返回用户有三个步骤: 服务 ...

  3. ajax的参数

    http://www.w3school.com.cn/jquery/ajax_ajax.asp call.addAllremark = function(data){ $.ajax({ url:cal ...

  4. 找规律 SGU 107 987654321 problem

    题目地址:http://acm.sgu.ru/problem.php?contest=0&problem=107 /* 题意:n位数的平方的后面几位为987654321的个数 尼玛,我看描述这 ...

  5. 设置完在Canvas的位置后,控件HitTest不响应的问题

    have a Canvas with a couple of elements on it like Line, Path and Text Box. In the MouseOver event o ...

  6. 【wikioi】1295 N皇后问题

    题目链接 算法:DFS 刚开始卡了我一下,我竟然傻到用二维来放皇后= =.导致一直TLE.... 其实用1维就行了的,下标为行(列),值为列(行) 我是用下标为列做的. 上代码 #include &l ...

  7. 【wikioi】1004 四子连棋

    题目链接 算法:BFS //2014-02-05更新 *******************************2013-10-15******************************* ...

  8. HttpClient_用Apache HttpClient实现URL重定向

    很多网站都使用了URL重定向技术,把一个原始请求从一个位置路由到另一个位置.原因可能是多方面的,比如域名转发.URL缩写.隐私保护.在同一网站维持相似的域名等.本文讲述怎样使用Apache HTTPC ...

  9. Android使用AsyncTask实现可以断点续传的DownloadManager功能

    http://www.it165.net/pro/html/201211/4210.html 最近做项目卡壳了,要做个Android的应用市场,其他方面都还好说,唯独这个下载管理算是给我难住了,究其原 ...

  10. [百科] - CreatePen()

    CreatePen编辑[声明]HPEN CreatePen(int nPenStyle, int nWidth, COLORREF crColor);[说明]用指定的样式.宽度和颜色创建一个画笔[参数 ...