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. .Net AppDomain.CurrentDomain.AppendPrivatePath(@"Libs");

    今天就说说.Net中通过反射取得某个类型时,我们怎么知道这个类型在硬盘上的哪个角落?比如说,假如我们需要要求服务端动态载入某个数据源,那服务端怎么知道数据源在哪?网上大部分的教程都写着,可以使用Ass ...

  2. BZOJ4347 : [POI2016]Nim z utrudnieniem

    将石子从小到大排序,然后DP. 设$f[i][j][k]$表示考虑了前$i$堆的石子,当前扔掉的堆数模$d$为$j$,没有扔掉的石子的异或和为$k$的方案数. 因为石子排过序,所以转移的复杂度为$O( ...

  3. 理解cookie的path和domain属性

    今天在做验证码时发现一个问题:A.B窗口都打开同一个页面,A先生成一个验证码,B再生成验证码,这时A所生成的验证码被B覆盖掉了.原因是使用了同名的cookie来存储验证码.一时找不到解决方法就参考了W ...

  4. 修改setInterval作用域

    Hello,今天和大家分享如何修改setInterval作用域. 0.引子 最近在做一个项目的时候需要开发一个图片轮播显示的组件,在实现过程中遇到了关于setInterval作用域的问题. Slide ...

  5. MONO 使用重要提示

    重要提示:如果要使用mvc这样的框架(网址没有扩展名或扩展名没有正常规律),请一定用Jexus,而不要用apache/nginx等. ASP.NET跨平台初学者要注意: 1.不要开始就用freeBSD ...

  6. Mina小例子

    此例子解决了中文乱码问题. 客服端: MimaTimeClient.java package minaExamle.client; import java.net.InetSocketAddress; ...

  7. C#关闭word进程

    C#关闭word进程 foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcessesByName(&q ...

  8. [转]Redis集群的配置

    一:memcache 和 Redis 对比总结 [memecache 特点] 1:速度最快(没有自测,但网上有详细的测试用例) 2:支持水平扩展,可以任意添加节点 [redis 特点] 1:速度没有m ...

  9. Spring动态配置多数据源

    Spring动态配置多数据源,即在大型应用中对数据进行切分,并且采用多个数据库实例进行管理,这样可以有效提高系统的水平伸缩性.而这样的方案就会不同于常见的单一数据实例的方案,这就要程序在运行时根据当时 ...

  10. IOS第四天(6:答题区按钮点击和乱序)

    #pragma mark - 答题区按钮点击方法 - (void)answerClick:(UIButton *)button { // 1. 如果按钮没有字,直接返回 ) return; // 2. ...