zoukankan      html  css  js  c++  java
  • Redis学习笔记(7)-事务

    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(); 
    	
    		
    	}
    }
    

      

  • 相关阅读:
    Object之克隆对象clone 和__clone()函数
    Object之魔术函数__toString() 直接输出对象引用时自动调用
    Object之魔术函数__call() 处理错误调用
    Git关联远程GitHub仓库
    python制作查找单词翻译的脚本
    用python处理文本,本地文件系统以及使用数据库的知识基础
    基于序列化技术(Protobuf)的socket文件传输
    Python核心编程——Chapter16
    gdb初步窥探
    unp学习笔记——Chapter1
  • 原文地址:https://www.cnblogs.com/zuolun2017/p/5611974.html
Copyright © 2011-2022 走看看