原书第10章。
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) {
if(jedis.sismember(keyAvailableResourcePool,resourceName)){
return false;
}
jedis.sadd(keyAvailableResourcePool,resourceName);
return true;
}
private String useResource(Jedis jedis) {
try {
jedis.watch(keyAvailableResourcePool);
String resource = jedis.srandmember(keyAvailableResourcePool);
if (resource == null) {
jedis.unwatch();
return null;
}
Transaction ctx = jedis.multi();
ctx.smove(keyAvailableResourcePool, keyUsedResourcePool, resource);
List<Object> results = ctx.exec();
if (results == null) {
System.out.println("事务失败:资源池被修改");
return null;
}
return resource;
} catch (JedisException e) {
System.err.println("Redis 操作异常: " + e.getMessage());
return null;
}
}
}