java连接Redis
1.Jedis所需要的的jar包依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.1.0</version>
</dependency>
2.Jedis常用操作
2.1 测试连通性
public class TestRedisPing {
public static void main(String[] args) {
//创建连接
Jedis jedis=new Jedis("192.168.120.129", 6379);
//设置密码 如果没有密码可以不设置
jedis.auth("123456");
//调用 ping方法
String ping = jedis.ping();
//输出PONG
System.out.println(ping);
jedis.close();//一定要注意关闭
}
}
2.2 常规操作
public class App {
public static final String HOST = "192.168.161.66";
public static final int HOST_IP = 6379;
public static void main( String[] args ) {
Jedis jedis = new Jedis(HOST,HOST_IP);
//设置密码
//jedis.auth("123456");
System.out.println(jedis);
String ping = jedis.ping();
System.out.println(ping);
//set设置值,get取值
//jedis.set("a","acd");
//jedis.set("b","bbb");
//jedis.set("c","ccc");
String a = jedis.get("a");
System.out.println(a);
//keys * 获取所有键
Set<String> keys = jedis.keys("*");
System.out.println(keys);
//list操作:lpush往里放值;lpop,弹出值,弹出就没有了,lrange取值,0到-1是取所有
//jedis.lpush("al","aaa","ccc","bbb","ddd");
System.out.println(jedis.lrange("al",0,-1));
//其余指令和day02的基本指令一样,每个指令都有对应得方法
jedis.close(); //一定要记得回收关闭清空资源
}
}
2.3 事务提交
常规操作
public class TestReidsTranaction {
public static void main(String[] args) {
// 创建连接
Jedis jedis = new Jedis("192.168.120.129", 6379);
// 设置密码 如果没有密码可以不设置
jedis.auth("123456");
//监控key,如果该动了事务就被放弃
/*3
jedis.watch("serialNum");
jedis.set("serialNum","s#####################");
jedis.unwatch();*/
Transaction transaction = jedis.multi();//被当作一个命令进行执行
Response<String> response = transaction.get("serialNum");
transaction.set("serialNum","s002");
response = transaction.get("serialNum");
transaction.lpush("list3","a");
transaction.lpush("list3","b");
transaction.lpush("list3","c");
transaction.exec();
//2 transaction.discard();
System.out.println("serialNum***********"+response.get());
jedis.close();
}
}
加锁操作
public class TestReidsTranactionLock {
public boolean transMethod() {
// 创建连接
Jedis jedis = new Jedis("192.168.120.129", 6379);
// 设置密码 如果没有密码可以不设置
jedis.auth("123456");
int balance;// 可用余额
int debt;// 欠额
int amtToSubtract = 10;// 实刷额度
jedis.watch("balance");
// jedis.set("balance","5");//此句不该出现,讲课方便。模拟其他程序已经修改了该条目
balance = Integer.parseInt(jedis.get("balance"));
if (balance < amtToSubtract) {
jedis.unwatch();
System.out.println("modify");
jedis.close();
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);
jedis.close();
return true;
}
}
/**
* 通俗点讲,watch命令就是标记一个键,如果标记了一个键, 在提交事务前如果该键被别人修改过,那事务就会失败,这种情况通常可以在程序中 重新再尝试一次。
* 首先标记了键balance,然后检查余额是否足够,不足就取消标记,并不做扣减; 足够的话,就启动事务进行更新操作,
* 如果在此期间键balance被其它人修改, 那在提交事务(执行exec)时就会报错, 程序中通常可以捕获这类错误再重新执行一次,直到成功。
*/
public static void main(String[] args) {
TestReidsTranactionLock test = new TestReidsTranactionLock();
boolean retValue = test.transMethod();
System.out.println("main retValue-------: " + retValue);
}
}
2.4 主从复制
public class TestReidsMS {
public static void main(String[] args) throws InterruptedException {
// 创建连接
Jedis jedis_M = new Jedis("192.168.120.129", 6379);
Jedis jedis_S = new Jedis("192.168.120.129", 6380);
jedis_S.slaveof("127.0.0.1", 6379);
jedis_M.set("k6", "v6");
Thread.sleep(500);
System.out.println(jedis_S.get("k6"));
jedis_M.close();
jedis_S.close();
}
}
2.5 集群连接
public class ClusterConnection {
public static final String HOST = "192.168.161.66";
public static final int HOST_IP = 7000;
public static void main( String[] args ) {
Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort(HOST,7000));
nodes.add(new HostAndPort(HOST,7001));
nodes.add(new HostAndPort(HOST,7002));
nodes.add(new HostAndPort(HOST,7003));
nodes.add(new HostAndPort(HOST,7004));
nodes.add(new HostAndPort(HOST,7005));
JedisCluster jedisCluster = new JedisCluster(nodes);
jedisCluster.set("name","xdd");
System.out.println(jedisCluster.get("name"));
jedisCluster.close(); //一定要记得回收关闭清空资源
}
}
3. JedisPool
3.1 为什么要是用JedisPool
- 获取Jedis实例需要从JedisPool中获取
- 用完Jedis实例需要返回给JedisPool
- 如果Jedis在使用过程中出现错误,则也需要返还给JedisPool