package com.foxbill.redisinaction;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
import redis.clients.jedis.Response;
import redis.clients.jedis.Transaction;
import redis.clients.jedis.exceptions.JedisException;
import java.util.List;
/**
* 资源池
*/
public class Chapter10 {
String poolName;
String keyAvailableResourcePool="resourcePool:available";
String keyUsedResourcePool="resourcePool:used";
public Chapter10(String poolName){
this.poolName = poolName;
this.keyAvailableResourcePool=String.format("%s:%s", keyAvailableResourcePool,poolName);
this.keyUsedResourcePool=String.format("%s:%s", keyUsedResourcePool,poolName);
}
public void start(Jedis jedis) {
try{
for(int i=1;i<=10;i++){
addResource(jedis,"worker"+i);
}
Thread.sleep(1000);
String resource = useResource(jedis);
System.out.println("resource:"+resource);
Thread.sleep(1000);
resource = useResource(jedis);
System.out.println("resource:"+resource);
Thread.sleep(1000);
resource = useResource(jedis);
System.out.println("resource:"+resource);
}catch (Exception e){
e.printStackTrace();
}
}
private boolean addResource(Jedis jedis,String resourceName) {
//resource is existed
if(jedis.sismember(keyAvailableResourcePool,resourceName)){
return false;
}
jedis.sadd(keyAvailableResourcePool,resourceName);
return true;
}
private String useResource(Jedis jedis) {
try {
// 1. WATCH 监控键
jedis.watch(keyAvailableResourcePool);
// 2. 检查资源池是否为空
String resource = jedis.srandmember(keyAvailableResourcePool);
if (resource == null) {
jedis.unwatch();
return null;
}
// 3. 开启事务并执行移动操作
Transaction ctx = jedis.multi();
ctx.smove(keyAvailableResourcePool, keyUsedResourcePool, resource);
List<Object> results = ctx.exec();
// 4. 检查事务是否成功
if (results == null) {
System.out.println("事务失败:资源池被修改");
return null;
}
return resource;
} catch (JedisException e) {
System.err.println("Redis 操作异常: " + e.getMessage());
return null;
}
}
}