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(); }
}
Redis学习笔记(7)-事务的更多相关文章
- StackExchange.Redis学习笔记(四) 事务控制和Batch批量操作
Redis事物 Redis命令实现事务 Redis的事物包含在multi和exec(执行)或者discard(回滚)命令中 和sql事务不同的是,Redis调用Exec只是将所有的命令变成一个单元一起 ...
- Redis学习笔记~目录
回到占占推荐博客索引 百度百科 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合). ...
- Redis学习笔记之ABC
Redis学习笔记之ABC Redis命令速查 官方帮助文档 中文版本1 中文版本2(反应速度比较慢) 基本操作 字符串操作 set key value get key 哈希 HMSET user:1 ...
- (转)redis 学习笔记(1)-编译、启动、停止
redis 学习笔记(1)-编译.启动.停止 一.下载.编译 redis是以源码方式发行的,先下载源码,然后在linux下编译 1.1 http://www.redis.io/download 先 ...
- Redis学习笔记(1)——Redis简介
一.Redis是什么? Remote Dictionary Server(Redis) 是一个开源的使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.Key-Value ...
- redis学习笔记(3)
redis学习笔记第三部分 --redis持久化介绍,事务,主从复制 三,redis的持久化 RDB(Redis DataBase)AOF(Append Only File) RDB:在指定的时间间隔 ...
- redis 学习笔记(6)-cluster集群搭建
上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞shardi ...
- Redis学习笔记4-Redis配置详解
在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redi ...
- Redis学习笔记7--Redis管道(pipeline)
redis是一个cs模式的tcp server,使用和http类似的请求响应协议.一个client可以通过一个socket连接发起多个请求命令.每个请求命令发出后client通常会阻塞并等待redis ...
随机推荐
- 文件上传漏洞演示脚本之js验证
文件上传漏洞演示脚本之js验证 0 0 716 关于文件上传漏洞,想必玩web安全的同学们都有接触,之前本站也发布过一篇文章介绍文件上传漏洞的各种绕过方法,但是只是有文档却没有演示代码 ...
- C# 同步/并发队列ConcurrentQueue
如下所示,ConcurrentQueue做到了代码的简化,在并发模型中充当同步对象 private ConcurrentQueue<string> inQueue = new Concur ...
- 什么是 IntentService
service 默认也运行在 UI 线程,所以里面不能直接做耗时操作,要做耗时操作还得开启子线程来做. IntentService 就是一个 Service, 只不过里面给你默认开启了一个子线程来处理 ...
- 【LINUX/UNIX网络编程】之使用消息队列,信号量和命名管道实现的多进程服务器(多人群聊系统)
RT,使用消息队列,信号量和命名管道实现的多人群聊系统. 本学期Linux.unix网络编程的第三个作业. 先上实验要求: 实验三 多进程服务器 [实验目的] 1.熟练掌握进程的创建与终止方法: 2 ...
- BZOJ4182 : Shopping
最后选择的一定是树上的一个连通块,考虑树分治,每次只需考虑重心必选的情况,这就变成了以重心为根的树形依赖多重背包问题. 设f[x][j]表示从根节点到x这条路径及其左边的所有节点,以及以x为根的子树的 ...
- BZOJ3482 : [COCI2013]hiperprostor
对于每组询问,spfa求出f[i][j]表示从S出发,经过j条x边到达i的最短路. 若f[T][i]都为inf,则无解. 若f[T][0]为inf,则有无穷个解. 否则可以看作若干条直线,$O(n)$ ...
- 编程中i++与++i的区别
- Mina工具类v1.5
package com.cucpay.fundswap.util; import java.net.InetSocketAddress; import java.nio.charset.Charset ...
- QDialog, QFileDialog 和 QDesktopServices 的使用方法
Qt中的QDialog类是用来生成对话框的类,QFileDialog 类是QDialog的衍生类,主要用来生成打开文件,或是打开文件目录的对话框,或者是保存文件的对话框,下面我们一一来看代码: 1. ...
- Programming with gtkmm 3
https://developer.gnome.org/gtkmm-tutorial/unstable/index.html.zh_CN 1. 序言 1.1. 本书 1.2. gtkmm 2. 安 ...