目录
2、redis的事务处理,要小心重构掉!对于原子性原则上不进行破坏!
目的:
测试环境要重构的时候,会把所有的常量redis缓存重新赋值,有些失效的已经会永远的停留在上面,所以,在测试环境开发时候有必要清空所有的redis缓存数据,这样测试起来更为精准,所以可是使用功能jedis的原始方法进行删除redis的数据,然后测试环境启动时候进行情况操作!
1、调用代码逻辑如下:java-code
import java.util.Iterator;
import java.util.Set;
import redis.clients.jedis.Jedis;
public class APIRedis {
public static void main(String[] args) {
//redis 的链接配置
Jedis jedis = new Jedis("127.0.0.1",6379);
//获取所有的Redis的key数据
Set<String> set = jedis.keys("*");
Iterator<String> it = set.iterator();
if (set.contains("FUNCTION_FILTER_STATUS")) {
System.out.println("查询到了->" + jedis.get("FUNCTION_FILTER_STATUS"));
}
//全部删除所有的redis数据--针对测试环境就是全部删除,生产环境不可以随意删除,要有环境变量进行区分开来
while (it.hasNext()) {
String str = it.next();
jedis.del(str);
System.out.println(str);
}
//redis 的set数据
jedis.set("balance","10000");
System.out.println(jedis.get("balance"));
}
}
2、redis的事务处理,要小心重构掉!对于原子性原则上不进行破坏!
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;
/***
* redis的事务处理
*/
public class RedisTXDemo {
/****
* 事务逻辑方法,进行逻辑运算
* @return
* @throws InterruptedException
*/
public static boolean transMethod() throws InterruptedException {
Jedis jedis = new Jedis("127.0.0.1", 6379);
int balance;// 可用余额
int debt;// 欠额
int amtToSubtract = 10;// 实刷额度
jedis.watch("balance");
Thread.sleep(8000); // 停止程序一小段时间,外面先修改balance数据后看效果
balance = Integer.parseInt(jedis.get("balance"));
if (balance < amtToSubtract) {
jedis.unwatch();
System.out.println("The Data has been updated before you commit or balance < amtToSubtract");
return false;
} else {
System.out.println("***********transaction开始进行原子性操作!");
Transaction transaction = jedis.multi();
transaction.decrBy("balance", amtToSubtract);
transaction.incrBy("debt", amtToSubtract);
//事务进行执行操作
transaction.exec();
balance = Integer.parseInt(jedis.get("balance"));
debt = Integer.parseInt(jedis.get("debt"));
System.out.println("*******" + balance);
System.out.println("*******" + debt);
return true;
}
}
/**
* 伪代码如下: 通俗点讲,watch命令就是标记一个键,如果标记了一个键,
* 在提交事务前如果该键被别人修改过,那事务就会失败,这种情况通常可以在程序中 重新再尝试一次。
* 首先标记了键balance,然后检查余额是否足够,不足就取消标记,并不做扣减; 足够的话,就启动事务进行更新操作,
* 如果在此期间键balance被其它人修改, 那在提交事务(执行exec)时就会报错, 程序中通常可以捕获这类错误再重新执行一次,直到成功。
*
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
init();
boolean retValue = RedisTXDemo.transMethod();
System.out.println("main retValue-------: " + retValue);
}
/***
* 主从备份,主机+从机,
*/
public static void init() {
//主机-Master
Jedis jedisM = new Jedis("10.0.0.152", 6379);
Jedis jedisS = new Jedis("127.0.0.1", 6379);
jedisS.slaveof("10.106.0.152", 6379);
//redis 的set数据
jedisM.set("balance", "10000");
System.out.println(jedisM.get("balance"));
String result = jedisS.get("k3");
System.out.println("#############result: " + result);
}
}
3、依赖Pom的配置
<!-- https://mvnrepository.com/artifact/commons-pool/commons-pool -->
<dependency>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
<version>1.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.3</version>
</dependency>