1.我们知道关系型数据库都有事务,下面就拿mysql的事务为例子
begin #开启事务
commit #提交事务
rollback #回滚事务
2.redis中的与事务的相关命令如下
multi #开启事务
exec #结束事务
discard #回滚事务
3.注意:
关系型数据库中事务有四大特性,原子性,隔离性,一致性,持久性,但是redis中只有隔离性,如下图可以看出其不具备原子性,比如下有一条命令出错了,但是其他命令都执行成功了
4.重要命令watch,watch的作用是可以监控某一个key对应的value是否被修改,假设开启了两个事务,事务1有设置一个key为k1的值为000,但还没提交事务,事务二,也操做了k1的值,改为100,而且提交了,那么事务1中的设置k1的值为1000这个过程就会报错,直接返回空,如下两图
1.在redis上设置一个key
2.pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>distribute-lock</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!--json依赖-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.3</version>
</dependency>
<!--jedis依赖-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.2.0</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<!--bloom依赖-->
<dependency>
<groupId>com.redislabs</groupId>
<artifactId>jrebloom</artifactId>
<version>1.2.0</version>
</dependency>
</dependencies>
</project>
3.jedisUtils
package com.yl;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
public class JedisUtils {
private static JedisPool jedisPool = null;
public static Jedis getJedisObject() {
if (jedisPool == null) {
GenericObjectPoolConfig config = new GenericObjectPoolConfig();
//最大空闲数
config.setMaxIdle(400);
//最大连接数
config.setMaxTotal(2000);
//连接最大等待时间,-1代表没有限制
config.setMaxWaitMillis(300000);
/** * 配置连接池的地址,端口号,超时时间,密码 */
jedisPool = new JedisPool(config,"192.168.244.129",6379,30000,"root123");
}
try {
//通过连接池获取jedis对象
Jedis jedis = jedisPool.getResource();
jedis.auth("root123");
return jedis;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
4.测试,演示转账
package com.yl;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;
import java.util.List;
public class TransactionTest {
public static void main(String[] args) {
TransactionTest test = new TransactionTest();
Integer money = test.addMoney("yl", 1000);
System.out.println(money);
}
public Integer addMoney(String userId,Integer money) {
Jedis jedis = JedisUtils.getJedisObject();
while (true) {
//监控key
jedis.watch(userId);
int value = Integer.parseInt(jedis.get(userId)) + money;
//开启事务
Transaction ts = jedis.multi();
ts.set(userId, String.valueOf(value));
//提交事务
List<Object> exec = ts.exec();
if (exec != null) {
break;
}
}
return Integer.parseInt(jedis.get(userId));
}
}
5.结果
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_41359273/article/details/120818220
内容来源于网络,如有侵权,请联系作者删除!